@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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { quadAt, quadSlope, quadTrim, TAU } from '../math.js';
|
|
2
|
+
import { ARROW_LEN } from './view.js';
|
|
3
|
+
export const LINK_NONE = 0;
|
|
4
|
+
export const LINK_DRAWN = 1;
|
|
5
|
+
export const LINK_ARROW = 2;
|
|
6
|
+
/** Drawn fraction in [0, 1]; NaN draws nothing. */
|
|
7
|
+
function progressOf(p) {
|
|
8
|
+
if (!(p > 0))
|
|
9
|
+
return 0;
|
|
10
|
+
return Math.min(p, 1);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Append the visible part of the link (x1, y1) → (x2, y2) to the current path.
|
|
14
|
+
* `trim1` / `trim2` are px cut from each end; `progress` is the drawn fraction from the source
|
|
15
|
+
* (from the target when `fromTarget`). With `arrow`, the line stops short of the tip and the
|
|
16
|
+
* tip (x, y) and unit direction (ux, uy) are written to `tip`.
|
|
17
|
+
* Returns LINK_NONE, LINK_DRAWN or LINK_ARROW.
|
|
18
|
+
*/
|
|
19
|
+
export function linkPath(ctx, x1, y1, x2, y2, curvature, trim1, trim2, progress, fromTarget, arrow, tip) {
|
|
20
|
+
const dx = x2 - x1;
|
|
21
|
+
const dy = y2 - y1;
|
|
22
|
+
const len = Math.hypot(dx, dy);
|
|
23
|
+
const p = progressOf(progress);
|
|
24
|
+
if (!(len > 1e-6) || p <= 0)
|
|
25
|
+
return LINK_NONE;
|
|
26
|
+
if (curvature === 0 || !Number.isFinite(curvature)) {
|
|
27
|
+
const ux = dx / len;
|
|
28
|
+
const uy = dy / len;
|
|
29
|
+
const a0 = trim1;
|
|
30
|
+
const a1 = len - trim2;
|
|
31
|
+
if (a1 - a0 < 0.5)
|
|
32
|
+
return LINK_NONE;
|
|
33
|
+
let s0 = a0;
|
|
34
|
+
let s1 = a1;
|
|
35
|
+
if (p < 1) {
|
|
36
|
+
const span = (a1 - a0) * p;
|
|
37
|
+
if (fromTarget)
|
|
38
|
+
s0 = a1 - span;
|
|
39
|
+
else
|
|
40
|
+
s1 = a0 + span;
|
|
41
|
+
}
|
|
42
|
+
let end = s1;
|
|
43
|
+
const withArrow = arrow && s1 - s0 > ARROW_LEN * 1.2;
|
|
44
|
+
if (withArrow) {
|
|
45
|
+
end = s1 - (ARROW_LEN - 1);
|
|
46
|
+
tip[0] = x1 + ux * s1;
|
|
47
|
+
tip[1] = y1 + uy * s1;
|
|
48
|
+
tip[2] = ux;
|
|
49
|
+
tip[3] = uy;
|
|
50
|
+
}
|
|
51
|
+
ctx.moveTo(x1 + ux * s0, y1 + uy * s0);
|
|
52
|
+
ctx.lineTo(x1 + ux * end, y1 + uy * end);
|
|
53
|
+
return withArrow ? LINK_ARROW : LINK_DRAWN;
|
|
54
|
+
}
|
|
55
|
+
const cx = (x1 + x2) / 2 - dy * curvature;
|
|
56
|
+
const cy = (y1 + y2) / 2 + dx * curvature;
|
|
57
|
+
const ta = quadTrim(x1, y1, cx, cy, x2, y2, trim1, false);
|
|
58
|
+
const tb = quadTrim(x1, y1, cx, cy, x2, y2, trim2, true);
|
|
59
|
+
if (tb - ta < 0.01)
|
|
60
|
+
return LINK_NONE;
|
|
61
|
+
let t0 = ta;
|
|
62
|
+
let t1 = tb;
|
|
63
|
+
if (p < 1) {
|
|
64
|
+
const span = (tb - ta) * p;
|
|
65
|
+
if (fromTarget)
|
|
66
|
+
t0 = tb - span;
|
|
67
|
+
else
|
|
68
|
+
t1 = ta + span;
|
|
69
|
+
}
|
|
70
|
+
let tEnd = t1;
|
|
71
|
+
let withArrow = false;
|
|
72
|
+
if (arrow) {
|
|
73
|
+
const sx = quadSlope(x1, cx, x2, t1);
|
|
74
|
+
const sy = quadSlope(y1, cy, y2, t1);
|
|
75
|
+
const speed = Math.hypot(sx, sy);
|
|
76
|
+
if (speed > 1e-6) {
|
|
77
|
+
const dt = (ARROW_LEN - 1) / speed;
|
|
78
|
+
if (t1 - t0 > dt * 1.2) {
|
|
79
|
+
withArrow = true;
|
|
80
|
+
tEnd = t1 - dt;
|
|
81
|
+
tip[0] = quadAt(x1, cx, x2, t1);
|
|
82
|
+
tip[1] = quadAt(y1, cy, y2, t1);
|
|
83
|
+
tip[2] = sx / speed;
|
|
84
|
+
tip[3] = sy / speed;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Sub-curve [t0, tEnd]: control = B(t0) + (tEnd − t0) / 2 · B′(t0).
|
|
89
|
+
const px = quadAt(x1, cx, x2, t0);
|
|
90
|
+
const py = quadAt(y1, cy, y2, t0);
|
|
91
|
+
const h = (tEnd - t0) / 2;
|
|
92
|
+
ctx.moveTo(px, py);
|
|
93
|
+
ctx.quadraticCurveTo(px + h * quadSlope(x1, cx, x2, t0), py + h * quadSlope(y1, cy, y2, t0), quadAt(x1, cx, x2, tEnd), quadAt(y1, cy, y2, tEnd));
|
|
94
|
+
return withArrow ? LINK_ARROW : LINK_DRAWN;
|
|
95
|
+
}
|
|
96
|
+
/** Self-loop circle radius (px) for a node of screen radius `r`; |curvature| enlarges it. */
|
|
97
|
+
export function loopRadius(r, curvature) {
|
|
98
|
+
const c = Number.isFinite(curvature) ? Math.min(Math.abs(curvature), 1) : 0;
|
|
99
|
+
return Math.max(6, r * 0.8) * (1 + 2 * c);
|
|
100
|
+
}
|
|
101
|
+
/** Centre y of the self-loop circle above a node at screen y `y` with radius `r`. */
|
|
102
|
+
export function loopCenterY(y, r, rho) {
|
|
103
|
+
return y - r - rho * 0.5;
|
|
104
|
+
}
|
|
105
|
+
/** Append a self-loop above the node (x, y, r); `progress` sweeps the circle. */
|
|
106
|
+
export function loopPath(ctx, x, y, r, curvature, progress) {
|
|
107
|
+
const p = progressOf(progress);
|
|
108
|
+
if (p <= 0)
|
|
109
|
+
return LINK_NONE;
|
|
110
|
+
const rho = loopRadius(r, curvature);
|
|
111
|
+
const cy = loopCenterY(y, r, rho);
|
|
112
|
+
const a0 = Math.PI / 2;
|
|
113
|
+
ctx.moveTo(x, cy + rho);
|
|
114
|
+
ctx.arc(x, cy, rho, a0, a0 + TAU * p);
|
|
115
|
+
return LINK_DRAWN;
|
|
116
|
+
}
|
|
117
|
+
/** Point on the link at its middle (t = 0.5), screen space. */
|
|
118
|
+
export function linkMidpoint(x1, y1, x2, y2, curvature) {
|
|
119
|
+
const c = Number.isFinite(curvature) ? curvature : 0;
|
|
120
|
+
return [(x1 + x2) / 2 - ((y2 - y1) * c) / 2, (y1 + y2) / 2 + ((x2 - x1) * c) / 2];
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/draw/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node pass, per z level: style buckets (one path, one fill, one stroke each), then the
|
|
3
|
+
* level's rings and replay pulses. Hollow ghosts are filled with the canvas background so
|
|
4
|
+
* edges do not show through; their dashes are stretched to tile the circumference evenly.
|
|
5
|
+
*/
|
|
6
|
+
import type { FrameVisuals, Theme } from '@kgdiff/scene';
|
|
7
|
+
import { type Ctx2D } from '../ctx.js';
|
|
8
|
+
import { type FrameCache } from '../frame-cache.js';
|
|
9
|
+
import { type View } from './view.js';
|
|
10
|
+
/** `dash` scaled so a whole number of periods fits a circle of radius `r` (no seam). */
|
|
11
|
+
export declare function evenCircleDash(dash: readonly number[], r: number, out: number[]): number[];
|
|
12
|
+
export declare function drawNodes(ctx: Ctx2D, frame: FrameVisuals, cache: FrameCache, v: View, theme: Theme): void;
|
|
13
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/draw/nodes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAc,KAAK,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,KAAK,KAAK,EAAW,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,KAAK,UAAU,EAA2B,MAAM,mBAAmB,CAAC;AAE7E,OAAO,EAAyD,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAI7F,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAU1F;AAuID,wBAAgB,SAAS,CACvB,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,UAAU,EACjB,CAAC,EAAE,IAAI,EACP,KAAK,EAAE,KAAK,GACX,IAAI,CAkBN"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { NO_DASH } from '../ctx.js';
|
|
2
|
+
import { zLevel } from '../frame-cache.js';
|
|
3
|
+
import { TAU } from '../math.js';
|
|
4
|
+
import { CULL_MARGIN, NODE_DASH_MIN_R, NODE_MIN_R, NODE_TINY_R } from './view.js';
|
|
5
|
+
const evenDash = [];
|
|
6
|
+
/** `dash` scaled so a whole number of periods fits a circle of radius `r` (no seam). */
|
|
7
|
+
export function evenCircleDash(dash, r, out) {
|
|
8
|
+
let period = 0;
|
|
9
|
+
for (const d of dash)
|
|
10
|
+
period += d;
|
|
11
|
+
if (dash.length % 2 === 1)
|
|
12
|
+
period *= 2;
|
|
13
|
+
out.length = dash.length;
|
|
14
|
+
const circumference = TAU * r;
|
|
15
|
+
const count = Math.max(1, Math.round(circumference / period));
|
|
16
|
+
const s = period > 0 ? circumference / (count * period) : 1;
|
|
17
|
+
for (let i = 0; i < dash.length; i++)
|
|
18
|
+
out[i] = dash[i] * s;
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
function visibleAt(v, x, y, r) {
|
|
22
|
+
return (x + r >= v.x0 - CULL_MARGIN &&
|
|
23
|
+
x - r <= v.x1 + CULL_MARGIN &&
|
|
24
|
+
y + r >= v.y0 - CULL_MARGIN &&
|
|
25
|
+
y - r <= v.y1 + CULL_MARGIN);
|
|
26
|
+
}
|
|
27
|
+
function drawBucket(ctx, b, nodes, v, bg) {
|
|
28
|
+
const { k, ox, oy } = v;
|
|
29
|
+
const members = b.members;
|
|
30
|
+
const fill = b.fill ?? bg;
|
|
31
|
+
ctx.globalAlpha = b.alpha;
|
|
32
|
+
if (b.dash !== null && b.stroke !== null) {
|
|
33
|
+
// Dashed outlines (ghosts) are few: draw one by one with evenly spaced dashes.
|
|
34
|
+
ctx.fillStyle = fill;
|
|
35
|
+
ctx.strokeStyle = b.stroke;
|
|
36
|
+
ctx.lineWidth = b.strokeWidth;
|
|
37
|
+
ctx.lineCap = 'butt';
|
|
38
|
+
for (let m = 0; m < members.length; m++) {
|
|
39
|
+
const n = nodes[members[m]];
|
|
40
|
+
const x = n.x * k + ox;
|
|
41
|
+
const y = n.y * k + oy;
|
|
42
|
+
const r = Math.max(n.r * k, NODE_MIN_R);
|
|
43
|
+
if (!visibleAt(v, x, y, r)) {
|
|
44
|
+
v.stats.culledNodes++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
v.stats.nodes++;
|
|
48
|
+
ctx.beginPath();
|
|
49
|
+
ctx.arc(x, y, r, 0, TAU);
|
|
50
|
+
ctx.fill();
|
|
51
|
+
ctx.setLineDash(r < NODE_DASH_MIN_R ? NO_DASH : evenCircleDash(b.dash, r, evenDash));
|
|
52
|
+
ctx.stroke();
|
|
53
|
+
}
|
|
54
|
+
ctx.setLineDash(NO_DASH);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
let started = false;
|
|
58
|
+
let tiny = 0;
|
|
59
|
+
for (let m = 0; m < members.length; m++) {
|
|
60
|
+
const n = nodes[members[m]];
|
|
61
|
+
const x = n.x * k + ox;
|
|
62
|
+
const y = n.y * k + oy;
|
|
63
|
+
const r = Math.max(n.r * k, NODE_MIN_R);
|
|
64
|
+
if (!visibleAt(v, x, y, r)) {
|
|
65
|
+
v.stats.culledNodes++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
v.stats.nodes++;
|
|
69
|
+
if (r < NODE_TINY_R) {
|
|
70
|
+
tiny++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!started) {
|
|
74
|
+
ctx.beginPath();
|
|
75
|
+
started = true;
|
|
76
|
+
}
|
|
77
|
+
ctx.moveTo(x + r, y);
|
|
78
|
+
ctx.arc(x, y, r, 0, TAU);
|
|
79
|
+
}
|
|
80
|
+
if (started) {
|
|
81
|
+
ctx.fillStyle = fill;
|
|
82
|
+
ctx.fill();
|
|
83
|
+
if (b.stroke !== null) {
|
|
84
|
+
ctx.strokeStyle = b.stroke;
|
|
85
|
+
ctx.lineWidth = b.strokeWidth;
|
|
86
|
+
ctx.setLineDash(NO_DASH);
|
|
87
|
+
ctx.stroke();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (tiny > 0) {
|
|
91
|
+
// Sub-pixel nodes: squares in the most visible color, no stroke.
|
|
92
|
+
ctx.beginPath();
|
|
93
|
+
for (let m = 0; m < members.length; m++) {
|
|
94
|
+
const n = nodes[members[m]];
|
|
95
|
+
const r = Math.max(n.r * k, NODE_MIN_R);
|
|
96
|
+
if (r >= NODE_TINY_R)
|
|
97
|
+
continue;
|
|
98
|
+
const x = n.x * k + ox;
|
|
99
|
+
const y = n.y * k + oy;
|
|
100
|
+
if (!visibleAt(v, x, y, r))
|
|
101
|
+
continue;
|
|
102
|
+
ctx.rect(x - r, y - r, 2 * r, 2 * r);
|
|
103
|
+
}
|
|
104
|
+
ctx.fillStyle = b.fill ?? b.stroke ?? bg;
|
|
105
|
+
ctx.fill();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function drawDecor(ctx, n, v, theme) {
|
|
109
|
+
const x = n.x * v.k + v.ox;
|
|
110
|
+
const y = n.y * v.k + v.oy;
|
|
111
|
+
const r = Math.max(n.r * v.k, NODE_MIN_R);
|
|
112
|
+
const ring = n.ring;
|
|
113
|
+
const reach = r + (ring ? ring.gap + ring.width : 0) + 24;
|
|
114
|
+
if (!visibleAt(v, x, y, reach))
|
|
115
|
+
return;
|
|
116
|
+
if (ring !== null && ring.width > 0) {
|
|
117
|
+
const a = ring.alpha * n.alpha;
|
|
118
|
+
if (a >= 0.01) {
|
|
119
|
+
ctx.globalAlpha = a;
|
|
120
|
+
ctx.strokeStyle = ring.color;
|
|
121
|
+
ctx.lineWidth = ring.width;
|
|
122
|
+
ctx.setLineDash(NO_DASH);
|
|
123
|
+
ctx.beginPath();
|
|
124
|
+
ctx.arc(x, y, r + ring.gap, 0, TAU);
|
|
125
|
+
ctx.stroke();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const p = n.pulse;
|
|
129
|
+
if (p > 0 && p < 1) {
|
|
130
|
+
// Expanding ring that fades out (replay emphasis).
|
|
131
|
+
const fade = 1 - p;
|
|
132
|
+
const a = fade * fade * 0.85 * n.alpha;
|
|
133
|
+
if (a >= 0.01) {
|
|
134
|
+
ctx.globalAlpha = a;
|
|
135
|
+
ctx.strokeStyle = ring?.color ?? n.stroke ?? n.fill ?? theme.accent.base;
|
|
136
|
+
ctx.lineWidth = 0.75 + 1.75 * fade;
|
|
137
|
+
ctx.setLineDash(NO_DASH);
|
|
138
|
+
ctx.beginPath();
|
|
139
|
+
ctx.arc(x, y, r + 3 + p * (12 + r * 0.6), 0, TAU);
|
|
140
|
+
ctx.stroke();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function drawNodes(ctx, frame, cache, v, theme) {
|
|
145
|
+
const nodes = frame.nodes;
|
|
146
|
+
const buckets = cache.nodeBuckets;
|
|
147
|
+
const decor = cache.decor;
|
|
148
|
+
const bg = theme.canvas.background;
|
|
149
|
+
let d = 0;
|
|
150
|
+
for (let i = 0; i < buckets.length; i++) {
|
|
151
|
+
const b = buckets[i];
|
|
152
|
+
drawBucket(ctx, b, nodes, v, bg);
|
|
153
|
+
const next = buckets[i + 1];
|
|
154
|
+
if (next !== undefined && next.z === b.z)
|
|
155
|
+
continue;
|
|
156
|
+
// End of a z level: its rings and pulses go on top of it, below the next level.
|
|
157
|
+
while (d < decor.length && zLevel(nodes[decor[d]].z) <= b.z) {
|
|
158
|
+
drawDecor(ctx, nodes[decor[d]], v, theme);
|
|
159
|
+
d++;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
while (d < decor.length)
|
|
163
|
+
drawDecor(ctx, nodes[decor[d++]], v, theme);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/draw/nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Path helpers shared by passes. */
|
|
2
|
+
import type { Ctx2D } from '../ctx.js';
|
|
3
|
+
/** Rounded rectangle subpath (radius clamped to half the shorter side). */
|
|
4
|
+
export declare function roundRectPath(ctx: Ctx2D, x: number, y: number, w: number, h: number, r: number): void;
|
|
5
|
+
/** Arrowhead subpath with its tip at (x, y) pointing along the unit vector (ux, uy). */
|
|
6
|
+
export declare function arrowPath(ctx: Ctx2D, x: number, y: number, ux: number, uy: number): void;
|
|
7
|
+
//# sourceMappingURL=shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../src/draw/shapes.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAGvC,2EAA2E;AAC3E,wBAAgB,aAAa,CAC3B,GAAG,EAAE,KAAK,EACV,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,IAAI,CAYN;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAQxF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ARROW_LEN, ARROW_WIDTH } from './view.js';
|
|
2
|
+
/** Rounded rectangle subpath (radius clamped to half the shorter side). */
|
|
3
|
+
export function roundRectPath(ctx, x, y, w, h, r) {
|
|
4
|
+
const rr = Math.max(0, Math.min(r, w / 2, h / 2));
|
|
5
|
+
ctx.moveTo(x + rr, y);
|
|
6
|
+
ctx.lineTo(x + w - rr, y);
|
|
7
|
+
ctx.arc(x + w - rr, y + rr, rr, -Math.PI / 2, 0);
|
|
8
|
+
ctx.lineTo(x + w, y + h - rr);
|
|
9
|
+
ctx.arc(x + w - rr, y + h - rr, rr, 0, Math.PI / 2);
|
|
10
|
+
ctx.lineTo(x + rr, y + h);
|
|
11
|
+
ctx.arc(x + rr, y + h - rr, rr, Math.PI / 2, Math.PI);
|
|
12
|
+
ctx.lineTo(x, y + rr);
|
|
13
|
+
ctx.arc(x + rr, y + rr, rr, Math.PI, Math.PI * 1.5);
|
|
14
|
+
ctx.closePath();
|
|
15
|
+
}
|
|
16
|
+
/** Arrowhead subpath with its tip at (x, y) pointing along the unit vector (ux, uy). */
|
|
17
|
+
export function arrowPath(ctx, x, y, ux, uy) {
|
|
18
|
+
const bx = x - ux * ARROW_LEN;
|
|
19
|
+
const by = y - uy * ARROW_LEN;
|
|
20
|
+
const hw = ARROW_WIDTH / 2;
|
|
21
|
+
ctx.moveTo(x, y);
|
|
22
|
+
ctx.lineTo(bx - uy * hw, by + ux * hw);
|
|
23
|
+
ctx.lineTo(bx + uy * hw, by - ux * hw);
|
|
24
|
+
ctx.closePath();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=shapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/draw/shapes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAC3B,GAAU,EACV,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS;IAET,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACtB,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACpD,GAAG,CAAC,SAAS,EAAE,CAAC;AAClB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,GAAU,EAAE,CAAS,EAAE,CAAS,EAAE,EAAU,EAAE,EAAU;IAChF,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,SAAS,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Shared per-pass state: the world → screen mapping and the region being drawn. */
|
|
2
|
+
import type { PaintStats } from '../paint-stats.js';
|
|
3
|
+
export interface View {
|
|
4
|
+
/** screen = world · k + (ox, oy), css px. */
|
|
5
|
+
k: number;
|
|
6
|
+
ox: number;
|
|
7
|
+
oy: number;
|
|
8
|
+
/** Canvas size, css px. */
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
dpr: number;
|
|
12
|
+
/** Region of the current layer (css px); the whole canvas unless swiping. */
|
|
13
|
+
x0: number;
|
|
14
|
+
x1: number;
|
|
15
|
+
y0: number;
|
|
16
|
+
y1: number;
|
|
17
|
+
/** Labels may not cross x0 / x1 (swipe divider). */
|
|
18
|
+
strictX: boolean;
|
|
19
|
+
stats: PaintStats;
|
|
20
|
+
}
|
|
21
|
+
/** Elements this far (px) outside the region are still drawn (strokes, halos, glows). */
|
|
22
|
+
export declare const CULL_MARGIN = 48;
|
|
23
|
+
/** Nodes never shrink below this screen radius (px), so far zoom-outs keep a visible graph. */
|
|
24
|
+
export declare const NODE_MIN_R = 1;
|
|
25
|
+
/** Below this screen radius nodes are drawn as filled squares without stroke. */
|
|
26
|
+
export declare const NODE_TINY_R = 1.25;
|
|
27
|
+
/** Below this screen radius dashed node outlines are drawn solid. */
|
|
28
|
+
export declare const NODE_DASH_MIN_R = 3;
|
|
29
|
+
export declare const ARROW_LEN = 7;
|
|
30
|
+
export declare const ARROW_WIDTH = 5;
|
|
31
|
+
/** Gap (px) between an arrow tip and the node outline. */
|
|
32
|
+
export declare const ARROW_GAP = 1.5;
|
|
33
|
+
/** Light-theme halo ring: `r + 5` px, 2 px wide. */
|
|
34
|
+
export declare const HALO_RING_OFFSET = 5;
|
|
35
|
+
export declare const HALO_RING_WIDTH = 2;
|
|
36
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/draw/view.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,IAAI;IACnB,6CAA6C;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,yFAAyF;AACzF,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,+FAA+F;AAC/F,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,iFAAiF;AACjF,eAAO,MAAM,WAAW,OAAO,CAAC;AAChC,qEAAqE;AACrE,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,0DAA0D;AAC1D,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Elements this far (px) outside the region are still drawn (strokes, halos, glows). */
|
|
2
|
+
export const CULL_MARGIN = 48;
|
|
3
|
+
/** Nodes never shrink below this screen radius (px), so far zoom-outs keep a visible graph. */
|
|
4
|
+
export const NODE_MIN_R = 1;
|
|
5
|
+
/** Below this screen radius nodes are drawn as filled squares without stroke. */
|
|
6
|
+
export const NODE_TINY_R = 1.25;
|
|
7
|
+
/** Below this screen radius dashed node outlines are drawn solid. */
|
|
8
|
+
export const NODE_DASH_MIN_R = 3;
|
|
9
|
+
export const ARROW_LEN = 7;
|
|
10
|
+
export const ARROW_WIDTH = 5;
|
|
11
|
+
/** Gap (px) between an arrow tip and the node outline. */
|
|
12
|
+
export const ARROW_GAP = 1.5;
|
|
13
|
+
/** Light-theme halo ring: `r + 5` px, 2 px wide. */
|
|
14
|
+
export const HALO_RING_OFFSET = 5;
|
|
15
|
+
export const HALO_RING_WIDTH = 2;
|
|
16
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/draw/view.ts"],"names":[],"mappings":"AAsBA,yFAAyF;AACzF,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,+FAA+F;AAC/F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,iFAAiF;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAChC,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-frame derived data, rebuilt when `setFrame` is called (never on pan / zoom):
|
|
3
|
+
*
|
|
4
|
+
* - style buckets for edges and nodes, keyed by every stroke / fill property plus `z`, sorted
|
|
5
|
+
* by z. Drawing a bucket is one path + one stroke (and one fill for arrows / node bodies),
|
|
6
|
+
* so a 10k-edge frame with a handful of styles issues a handful of strokes;
|
|
7
|
+
* - lists of nodes with halos, rings / pulses (sorted by z), badges; glyphs split into
|
|
8
|
+
* arcs and pivots;
|
|
9
|
+
* - lazily: a point grid over visible nodes (picking) and content bounds.
|
|
10
|
+
*
|
|
11
|
+
* Bucket keys are numbers built from interned style ids and quantized values, so building
|
|
12
|
+
* allocates nothing per element in steady state.
|
|
13
|
+
*/
|
|
14
|
+
import type { Rect } from '@kgdiff/core';
|
|
15
|
+
import type { FrameVisuals } from '@kgdiff/scene';
|
|
16
|
+
import { PointGrid } from './spatial.js';
|
|
17
|
+
/** Interns style values to small integer ids for bucket keys. */
|
|
18
|
+
export declare class Interner {
|
|
19
|
+
private colors;
|
|
20
|
+
private dashIds;
|
|
21
|
+
private dashKeys;
|
|
22
|
+
/** Called before a build: start over when the id space is exhausted (animated rgba strings). */
|
|
23
|
+
maintain(): void;
|
|
24
|
+
/** 0 is reserved for null. */
|
|
25
|
+
color(c: string | null): number;
|
|
26
|
+
/** 0 is reserved for solid (null / empty). */
|
|
27
|
+
dash(d: readonly number[] | null): number;
|
|
28
|
+
}
|
|
29
|
+
/** Alpha is quantized to 1/64 for bucketing (invisible differences, far fewer buckets). */
|
|
30
|
+
export declare function quantizeAlpha(a: number): number;
|
|
31
|
+
/** The integer draw level a `z` value is bucketed into (non-finite → 0). */
|
|
32
|
+
export declare function zLevel(z: number): number;
|
|
33
|
+
export interface EdgeBucket {
|
|
34
|
+
key: number;
|
|
35
|
+
seq: number;
|
|
36
|
+
z: number;
|
|
37
|
+
color: string;
|
|
38
|
+
width: number;
|
|
39
|
+
dash: readonly number[] | null;
|
|
40
|
+
dashOffset: number;
|
|
41
|
+
alpha: number;
|
|
42
|
+
readonly members: number[];
|
|
43
|
+
}
|
|
44
|
+
export interface NodeBucket {
|
|
45
|
+
key: number;
|
|
46
|
+
seq: number;
|
|
47
|
+
z: number;
|
|
48
|
+
/** null = hollow ghost (filled with the canvas background). */
|
|
49
|
+
fill: string | null;
|
|
50
|
+
stroke: string | null;
|
|
51
|
+
strokeWidth: number;
|
|
52
|
+
dash: readonly number[] | null;
|
|
53
|
+
alpha: number;
|
|
54
|
+
readonly members: number[];
|
|
55
|
+
}
|
|
56
|
+
export declare class FrameCache {
|
|
57
|
+
frame: FrameVisuals | null;
|
|
58
|
+
version: number;
|
|
59
|
+
/** Sorted by z, then first appearance. */
|
|
60
|
+
readonly edgeBuckets: EdgeBucket[];
|
|
61
|
+
readonly nodeBuckets: NodeBucket[];
|
|
62
|
+
/** Nodes with a ring or an active pulse, sorted by (z, index). */
|
|
63
|
+
readonly decor: number[];
|
|
64
|
+
readonly halos: number[];
|
|
65
|
+
readonly badges: number[];
|
|
66
|
+
readonly glyphArcs: number[];
|
|
67
|
+
readonly pivots: number[];
|
|
68
|
+
/** Largest visible node radius (world). */
|
|
69
|
+
maxR: number;
|
|
70
|
+
/** Visible node / edge counts. */
|
|
71
|
+
nodeCount: number;
|
|
72
|
+
edgeCount: number;
|
|
73
|
+
/**
|
|
74
|
+
* Collapsed pills shown by the last paint of this frame (1) or hidden by label collision (0).
|
|
75
|
+
* Valid while `pillsVersion === version`; picking ignores hidden pills.
|
|
76
|
+
*/
|
|
77
|
+
pillShown: Uint8Array<ArrayBuffer>;
|
|
78
|
+
pillsVersion: number;
|
|
79
|
+
private readonly edgeMap;
|
|
80
|
+
private readonly nodeMap;
|
|
81
|
+
private readonly edgePool;
|
|
82
|
+
private readonly nodePool;
|
|
83
|
+
private gridVersion;
|
|
84
|
+
private readonly grid;
|
|
85
|
+
private xs;
|
|
86
|
+
private ys;
|
|
87
|
+
private rs;
|
|
88
|
+
private ids;
|
|
89
|
+
private boundsVersion;
|
|
90
|
+
private boundsValue;
|
|
91
|
+
/** Rebuild when `frame` or `version` changed. */
|
|
92
|
+
sync(frame: FrameVisuals, version: number, interner: Interner): void;
|
|
93
|
+
private build;
|
|
94
|
+
/** Whether collapsed pill `i` may be picked (shown by the last paint, or not yet placed). */
|
|
95
|
+
pillPickable(i: number): boolean;
|
|
96
|
+
/** Spatial index over visible node centres (built on first use after a frame change). */
|
|
97
|
+
nodeGrid(): PointGrid;
|
|
98
|
+
/** Bounds of every visible node (with its radius), collapsed pill and glyph; null if empty. */
|
|
99
|
+
contentBounds(): Rect | null;
|
|
100
|
+
}
|
|
101
|
+
/** Union of two optional rectangles. */
|
|
102
|
+
export declare function unionBounds(a: Rect | null, b: Rect | null): Rect | null;
|
|
103
|
+
//# sourceMappingURL=frame-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-cache.d.ts","sourceRoot":"","sources":["../src/frame-cache.ts"],"names":[],"mappings":"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"}
|