@kanzo-tech/graph 0.13.1 → 0.14.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/dist/core/state.d.ts +4 -1
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +119 -114
- package/dist/core/store.js.map +1 -1
- package/dist/parts/gesture.d.ts.map +1 -1
- package/dist/parts/gesture.js +15 -17
- package/dist/parts/gesture.js.map +1 -1
- package/dist/parts/graph-canvas.d.ts.map +1 -1
- package/dist/parts/graph-canvas.js +111 -100
- package/dist/parts/graph-canvas.js.map +1 -1
- package/dist/parts/graph-toolbar.d.ts +1 -1
- package/dist/parts/graph-toolbar.d.ts.map +1 -1
- package/dist/parts/graph-toolbar.js +40 -40
- package/dist/parts/graph-toolbar.js.map +1 -1
- package/dist/parts/overlays.d.ts +4 -1
- package/dist/parts/overlays.d.ts.map +1 -1
- package/dist/parts/overlays.js +72 -70
- package/dist/parts/overlays.js.map +1 -1
- package/dist/render/renderer.d.ts +7 -2
- package/dist/render/renderer.d.ts.map +1 -1
- package/dist/render/renderer.js +155 -158
- package/dist/render/renderer.js.map +1 -1
- package/package.json +24 -5
- package/dist/render/when-ready.d.ts +0 -35
- package/dist/render/when-ready.d.ts.map +0 -1
- package/dist/render/when-ready.js +0 -17
- package/dist/render/when-ready.js.map +0 -1
package/dist/core/state.d.ts
CHANGED
|
@@ -33,7 +33,10 @@ export interface GraphOptions extends Channels {
|
|
|
33
33
|
look?: LookPatch;
|
|
34
34
|
/** The force coefficients, as a patch over this package's own. */
|
|
35
35
|
sim?: Partial<Sim>;
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Runs the live layout while true, from the points' current positions. Off by default: the corpus's
|
|
38
|
+
* positions are drawn as they are. `GraphToolbar` starts and stops the layout whatever this says.
|
|
39
|
+
*/
|
|
37
40
|
simulate?: boolean;
|
|
38
41
|
/** Required: unhandled, a browser with no WebGL context shows an empty box. */
|
|
39
42
|
onFailure: (message: string) => void;
|
package/dist/core/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
|
package/dist/core/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAA8B,UAAU,EAAY,MAAM,SAAS,CAAC;AAK9F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjH,0FAA0F;AAC1F,eAAO,MAAM,aAAa,QAAS,CAAC;AAwBpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAA8B,UAAU,EAAY,MAAM,SAAS,CAAC;AAK9F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjH,0FAA0F;AAC1F,eAAO,MAAM,aAAa,QAAS,CAAC;AAwBpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CAoV7D"}
|
package/dist/core/store.js
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { PAYLOAD_ADDRESS as
|
|
2
|
-
import { domainOf as
|
|
3
|
-
import { bindingOf as
|
|
4
|
-
import { graphClient as
|
|
5
|
-
import { denseOf as
|
|
6
|
-
import { Tileset2D as
|
|
7
|
-
const
|
|
8
|
-
function
|
|
9
|
-
var
|
|
1
|
+
import { PAYLOAD_ADDRESS as re, PAYLOAD_COORDINATES as ie } from "@fossil-lang/corpus";
|
|
2
|
+
import { domainOf as se } from "./categories.js";
|
|
3
|
+
import { bindingOf as G, projectionOf as ce } from "./channels.js";
|
|
4
|
+
import { graphClient as fe, publish as ue, filterFor as de } from "./filter.js";
|
|
5
|
+
import { denseOf as ae } from "./resident.js";
|
|
6
|
+
import { Tileset2D as pe } from "./tileset.js";
|
|
7
|
+
const Y = 2e4, W = G({}), X = re[0];
|
|
8
|
+
function me(s) {
|
|
9
|
+
var d;
|
|
10
10
|
let n = 0;
|
|
11
|
-
for (const
|
|
12
|
-
return n +
|
|
11
|
+
for (const c of s.edges) n += c.src.byteLength + c.dst.byteLength + (((d = c.weight) == null ? void 0 : d.byteLength) ?? 0);
|
|
12
|
+
return n + s.rows.numRows * 8 * 4;
|
|
13
13
|
}
|
|
14
|
-
const
|
|
15
|
-
function
|
|
16
|
-
return
|
|
14
|
+
const ye = (s, n) => JSON.stringify(s, (d, c) => typeof c == "bigint" ? `${c}n` : c) === JSON.stringify(n, (d, c) => typeof c == "bigint" ? `${c}n` : c), ge = (s) => typeof (s == null ? void 0 : s.then) == "function";
|
|
15
|
+
function Z(s, n) {
|
|
16
|
+
return s.length !== n.length ? n : n.every((d, c) => {
|
|
17
17
|
var r;
|
|
18
|
-
return
|
|
19
|
-
}) ?
|
|
18
|
+
return d.content === ((r = s[c]) == null ? void 0 : r.content);
|
|
19
|
+
}) ? s : n;
|
|
20
20
|
}
|
|
21
|
-
function
|
|
22
|
-
let n =
|
|
23
|
-
const
|
|
24
|
-
let r = null, h = null,
|
|
25
|
-
const
|
|
21
|
+
function Te(s) {
|
|
22
|
+
let n = s;
|
|
23
|
+
const d = /* @__PURE__ */ new Set(), c = fe();
|
|
24
|
+
let r = null, h = null, S = !1, P = !1, f = null, A = 0, J = null, v = null, m = W, _, E = null, B = [], I = null, y = null, D = !1, V = -1, $ = !0, N = null;
|
|
25
|
+
const M = (e) => {
|
|
26
26
|
const t = e instanceof Error ? e.message : String(e);
|
|
27
|
-
|
|
28
|
-
},
|
|
27
|
+
$ ? N = t : n.onFailure(t);
|
|
28
|
+
}, u = new pe({
|
|
29
29
|
debounceTime: 60,
|
|
30
30
|
load: async (e, t) => {
|
|
31
|
-
if (!r || !
|
|
31
|
+
if (!r || !v) throw new Error("the graph has no scan to read with");
|
|
32
32
|
const l = (w) => {
|
|
33
|
-
var
|
|
34
|
-
return ((
|
|
35
|
-
}, o = await
|
|
36
|
-
return e.map((w,
|
|
37
|
-
const
|
|
38
|
-
return { ...
|
|
33
|
+
var L;
|
|
34
|
+
return ((L = f == null ? void 0 : f.tileMatrices[w.z]) == null ? void 0 : L.kind) === "cells";
|
|
35
|
+
}, o = await v.read(e, { signal: t }), p = await r.edges({ from: e, direction: "src", signal: t }), a = e.filter((w) => !l(w)), O = a.length > 0 ? await r.edges({ from: a, direction: "dst", signal: t }) : [], te = new Map(a.map((w, L) => [w, O[L]]));
|
|
36
|
+
return e.map((w, L) => {
|
|
37
|
+
const T = p[L], z = te.get(w), ne = [...(T == null ? void 0 : T.batches) ?? [], ...(z == null ? void 0 : z.batches) ?? []], H = [...(T == null ? void 0 : T.declined) ?? [], ...(z == null ? void 0 : z.declined) ?? []], le = l(w) ? H.filter((oe) => oe.direction !== "dst") : H, Q = { rows: o[L], edges: ne, declined: le };
|
|
38
|
+
return { ...Q, byteLength: me(Q) };
|
|
39
39
|
});
|
|
40
40
|
},
|
|
41
41
|
onTileLoad: (e) => {
|
|
42
42
|
var t;
|
|
43
43
|
for (const l of ((t = e.content) == null ? void 0 : t.declined) ?? [])
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
B.some((o) => o.edgeType === l.edgeType && o.direction === l.direction) || (B = [...B, l]);
|
|
45
|
+
u.refresh(), g();
|
|
46
46
|
},
|
|
47
47
|
onTileError: (e) => {
|
|
48
|
-
|
|
48
|
+
u.refresh(), M(e), g();
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
|
-
let
|
|
51
|
+
let i = {
|
|
52
52
|
status: "none",
|
|
53
53
|
matrix: null,
|
|
54
54
|
typeIndex: 0,
|
|
55
55
|
modeColumn: null,
|
|
56
|
-
binding:
|
|
56
|
+
binding: W,
|
|
57
57
|
domain: [],
|
|
58
58
|
z: null,
|
|
59
59
|
visible: [],
|
|
@@ -72,167 +72,172 @@ function Le(i) {
|
|
|
72
72
|
options: n,
|
|
73
73
|
corpus: null
|
|
74
74
|
};
|
|
75
|
-
const
|
|
75
|
+
const j = (e) => {
|
|
76
76
|
var t;
|
|
77
77
|
return {
|
|
78
78
|
address: e.address,
|
|
79
|
-
kind: ((t =
|
|
79
|
+
kind: ((t = f == null ? void 0 : f.tileMatrices[e.address.z]) == null ? void 0 : t.kind) ?? "rows",
|
|
80
80
|
content: e.content
|
|
81
81
|
};
|
|
82
82
|
};
|
|
83
|
-
let
|
|
84
|
-
function
|
|
85
|
-
const e = [r,
|
|
86
|
-
return e.some((t, l) => t !==
|
|
83
|
+
let C = { key: [], value: [] };
|
|
84
|
+
function x() {
|
|
85
|
+
const e = [r, A, m.category, n.categories];
|
|
86
|
+
return e.some((t, l) => t !== C.key[l]) && (C = { key: e, value: se(r, A, m, n.categories) }), C.value;
|
|
87
87
|
}
|
|
88
|
-
function
|
|
89
|
-
return
|
|
88
|
+
function ee(e, t) {
|
|
89
|
+
return S || P ? "failed" : h ? "opening" : r ? e || I !== t || i.drawn === null ? "reading" : "idle" : "none";
|
|
90
90
|
}
|
|
91
|
-
function
|
|
92
|
-
var
|
|
93
|
-
|
|
94
|
-
const t =
|
|
95
|
-
|
|
96
|
-
...
|
|
97
|
-
matrix:
|
|
98
|
-
typeIndex:
|
|
99
|
-
modeColumn:
|
|
100
|
-
binding:
|
|
101
|
-
domain:
|
|
102
|
-
z:
|
|
91
|
+
function g(e = {}) {
|
|
92
|
+
var p;
|
|
93
|
+
V = u.frame;
|
|
94
|
+
const t = u.tiles.filter((a) => a.content !== null), l = Z(i.visible, t.filter((a) => a.isVisible).map(j)), o = u.selectedTiles.some((a) => a.isLoading);
|
|
95
|
+
i = {
|
|
96
|
+
...i,
|
|
97
|
+
matrix: f,
|
|
98
|
+
typeIndex: A,
|
|
99
|
+
modeColumn: J,
|
|
100
|
+
binding: m,
|
|
101
|
+
domain: x(),
|
|
102
|
+
z: u.z,
|
|
103
103
|
visible: l,
|
|
104
|
-
cached:
|
|
104
|
+
cached: Z(i.cached, t.map(j)),
|
|
105
105
|
pending: o,
|
|
106
|
-
total:
|
|
107
|
-
declined:
|
|
106
|
+
total: f ? Number(((p = f.tileMatrices[f.tileMatrices.length - 1]) == null ? void 0 : p.count) ?? 0) : void 0,
|
|
107
|
+
declined: B,
|
|
108
108
|
options: n,
|
|
109
109
|
corpus: r,
|
|
110
110
|
...e
|
|
111
|
-
},
|
|
112
|
-
for (const a of p) a();
|
|
111
|
+
}, i = { ...i, status: ee(o, i.visible) }, K();
|
|
113
112
|
}
|
|
114
|
-
function
|
|
115
|
-
|
|
113
|
+
function b(e) {
|
|
114
|
+
i = { ...i, ...e }, K();
|
|
115
|
+
}
|
|
116
|
+
function K() {
|
|
117
|
+
for (const e of d) e();
|
|
118
|
+
}
|
|
119
|
+
function k() {
|
|
120
|
+
if (!(!r || !f)) {
|
|
116
121
|
try {
|
|
117
|
-
const e = [
|
|
118
|
-
|
|
122
|
+
const e = [X, ...ie];
|
|
123
|
+
v = r.scan({ type: f.type, filter: _, select: ce(m, e) }), u.setPlan(v.plan());
|
|
119
124
|
} catch (e) {
|
|
120
|
-
|
|
125
|
+
v = null, u.setPlan([]), M(e);
|
|
121
126
|
}
|
|
122
|
-
|
|
127
|
+
u.reloadAll(), E && u.update(E, n.limit ?? Y), g();
|
|
123
128
|
}
|
|
124
129
|
}
|
|
125
|
-
function
|
|
126
|
-
var o,
|
|
127
|
-
|
|
130
|
+
function F() {
|
|
131
|
+
var o, p, a;
|
|
132
|
+
S = !1, f = null, v = null, B = [], I = null, u.finalize();
|
|
128
133
|
const e = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };
|
|
129
|
-
if (!r) return
|
|
130
|
-
const t = r.types.vertices, l = n.type ?? ((o = t.find((
|
|
131
|
-
|
|
134
|
+
if (!r) return g(e);
|
|
135
|
+
const t = r.types.vertices, l = n.type ?? ((o = t.find((O) => O.geometry)) == null ? void 0 : o.type) ?? ((p = t[0]) == null ? void 0 : p.type);
|
|
136
|
+
A = Math.max(0, t.findIndex((O) => O.type === l));
|
|
132
137
|
try {
|
|
133
138
|
if (l === void 0) throw new Error("the corpus has no vertex type to draw");
|
|
134
|
-
|
|
135
|
-
} catch (
|
|
136
|
-
|
|
139
|
+
f = r.tileMatrix(l), J = ((a = f.mode) == null ? void 0 : a.column) ?? null, u.setMatrix(f);
|
|
140
|
+
} catch (O) {
|
|
141
|
+
S = !0, M(O);
|
|
137
142
|
}
|
|
138
|
-
|
|
143
|
+
i = { ...i, ...e }, k();
|
|
139
144
|
}
|
|
140
|
-
function
|
|
141
|
-
if (r = null, h =
|
|
142
|
-
return r = e,
|
|
145
|
+
function U(e) {
|
|
146
|
+
if (r = null, h = ge(e) ? e : null, !h)
|
|
147
|
+
return r = e, F();
|
|
143
148
|
const t = h;
|
|
144
|
-
|
|
149
|
+
F(), t.then(
|
|
145
150
|
(l) => {
|
|
146
|
-
h === t && (h = null, r = l,
|
|
151
|
+
h === t && (h = null, r = l, F());
|
|
147
152
|
},
|
|
148
153
|
(l) => {
|
|
149
|
-
h === t && (h = null,
|
|
154
|
+
h === t && (h = null, S = !0, M(l), g());
|
|
150
155
|
}
|
|
151
156
|
);
|
|
152
157
|
}
|
|
153
|
-
function
|
|
154
|
-
|
|
158
|
+
function R() {
|
|
159
|
+
y == null || y(), y = null;
|
|
155
160
|
const e = n.filterBy, t = () => {
|
|
156
161
|
let l;
|
|
157
162
|
try {
|
|
158
|
-
l = e ?
|
|
163
|
+
l = e ? de(e, c) : void 0;
|
|
159
164
|
} catch (o) {
|
|
160
|
-
|
|
165
|
+
M(o);
|
|
161
166
|
return;
|
|
162
167
|
}
|
|
163
|
-
|
|
168
|
+
ye(l, _) || (_ = l, k());
|
|
164
169
|
};
|
|
165
|
-
e && (e.addEventListener("value", t),
|
|
170
|
+
e && (e.addEventListener("value", t), y = () => e.removeEventListener("value", t)), t();
|
|
166
171
|
}
|
|
167
|
-
const
|
|
172
|
+
const q = {
|
|
168
173
|
/**
|
|
169
174
|
* The first subscriber starts listening to the crossfilter and the last one stops it and lets the
|
|
170
175
|
* tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
|
|
171
176
|
* mounting everything twice.
|
|
172
177
|
*/
|
|
173
178
|
subscribe(e) {
|
|
174
|
-
if (
|
|
175
|
-
const t =
|
|
176
|
-
|
|
179
|
+
if (d.add(e), !D && (D = !0, R(), N !== null)) {
|
|
180
|
+
const t = N;
|
|
181
|
+
N = null, n.onFailure(t);
|
|
177
182
|
}
|
|
178
183
|
return () => {
|
|
179
|
-
|
|
184
|
+
d.delete(e), d.size === 0 && q.destroy();
|
|
180
185
|
};
|
|
181
186
|
},
|
|
182
|
-
getSnapshot: () =>
|
|
187
|
+
getSnapshot: () => i,
|
|
183
188
|
getOptions: () => n,
|
|
184
189
|
setOptions(e) {
|
|
185
190
|
const t = n;
|
|
186
191
|
n = e;
|
|
187
|
-
const l =
|
|
188
|
-
if (
|
|
189
|
-
e.corpus !== t.corpus ?
|
|
192
|
+
const l = G(e), o = l.category !== m.category || l.size !== m.size || l.title !== m.title;
|
|
193
|
+
if (m = l, e.corpus !== t.corpus || e.type !== t.type) {
|
|
194
|
+
e.corpus !== t.corpus ? U(e.corpus) : F(), D && e.filterBy !== t.filterBy && R();
|
|
190
195
|
return;
|
|
191
196
|
}
|
|
192
|
-
if (
|
|
193
|
-
e.limit !== t.limit &&
|
|
197
|
+
if (D && e.filterBy !== t.filterBy && R(), o) return k();
|
|
198
|
+
e.limit !== t.limit && E && u.update(E, e.limit ?? Y), g();
|
|
194
199
|
},
|
|
195
200
|
destroy() {
|
|
196
|
-
|
|
201
|
+
D = !1, y == null || y(), y = null, u.finalize(), d.clear();
|
|
197
202
|
},
|
|
198
203
|
setViewport(e) {
|
|
199
|
-
|
|
204
|
+
E = e, u.update(e, n.limit ?? Y) !== V && g();
|
|
200
205
|
},
|
|
201
206
|
select(e, t = "node", l = "") {
|
|
202
|
-
var
|
|
207
|
+
var p;
|
|
203
208
|
const o = e && e.length > 0 ? { vertices: [...e], source: t, label: l } : null;
|
|
204
|
-
|
|
209
|
+
b({ selection: o }), (p = n.onSelect) == null || p.call(n, o), n.filterBy && ue(n.filterBy, c, X, o ? o.vertices.map(ae) : null);
|
|
205
210
|
},
|
|
206
211
|
focus(e) {
|
|
207
212
|
var t;
|
|
208
|
-
e !==
|
|
213
|
+
e !== i.focus && (b({ focus: e }), (t = n.onFocus) == null || t.call(n, e));
|
|
209
214
|
},
|
|
210
215
|
hover(e) {
|
|
211
|
-
e !==
|
|
216
|
+
e !== i.hovered && b({ hovered: e });
|
|
212
217
|
},
|
|
213
218
|
pin(e) {
|
|
214
|
-
|
|
219
|
+
b({ pinned: [...e] });
|
|
215
220
|
},
|
|
216
221
|
setTool(e) {
|
|
217
|
-
e !==
|
|
222
|
+
e !== i.tool && b({ tool: e });
|
|
218
223
|
},
|
|
219
224
|
report(e) {
|
|
220
|
-
e !==
|
|
225
|
+
e !== i.motion && b({ motion: e });
|
|
221
226
|
},
|
|
222
227
|
reportProgress(e) {
|
|
223
|
-
e !==
|
|
228
|
+
e !== i.progress && b({ progress: e });
|
|
224
229
|
},
|
|
225
230
|
setRenderable(e) {
|
|
226
|
-
|
|
231
|
+
P !== !e && (P = !e, g());
|
|
227
232
|
},
|
|
228
233
|
reportDrawn(e, t) {
|
|
229
|
-
|
|
234
|
+
I === e && t === null || (I = e, g(t ? { drawn: t } : {}));
|
|
230
235
|
}
|
|
231
236
|
};
|
|
232
|
-
return
|
|
237
|
+
return m = G(s), U(s.corpus), $ = !1, q;
|
|
233
238
|
}
|
|
234
239
|
export {
|
|
235
|
-
|
|
236
|
-
|
|
240
|
+
Y as DEFAULT_LIMIT,
|
|
241
|
+
Te as createGraph
|
|
237
242
|
};
|
|
238
243
|
//# sourceMappingURL=store.js.map
|
package/dist/core/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import {\n PAYLOAD_ADDRESS,\n PAYLOAD_COORDINATES,\n type Batch,\n type Corpus,\n type Filter,\n type Gap,\n type Scan,\n type TileAddress,\n type TileMatrixSet,\n} from \"@fossil-lang/corpus\";\nimport type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf, projectionOf, type Binding } from \"./channels\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { denseOf } from \"./resident\";\nimport type { GraphOptions, GraphSnapshot, GraphStatus, GraphStore, TileView } from \"./state\";\nimport type { TileContent } from \"./tile\";\nimport type { Viewport } from \"./tile-matrix\";\nimport { Tileset2D } from \"./tileset\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore, TileView } from \"./state\";\n\n/** Twenty thousand marks: what a canvas draws at once before a coarser zoom is chosen. */\nexport const DEFAULT_LIMIT = 20_000;\n\nconst NO_BINDING: Binding = bindingOf({});\nconst KEY = PAYLOAD_ADDRESS[0] as string;\n\nfunction bytesOf(content: Omit<TileContent, \"byteLength\">): number {\n let bytes = 0;\n for (const edge of content.edges) bytes += edge.src.byteLength + edge.dst.byteLength + (edge.weight?.byteLength ?? 0);\n return bytes + content.rows.numRows * 8 * 4;\n}\n\nconst sameFilter = (a: Filter | undefined, b: Filter | undefined) =>\n JSON.stringify(a, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v)) ===\n JSON.stringify(b, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v));\n\nconst isPromise = (value: unknown): value is PromiseLike<Corpus> =>\n typeof (value as PromiseLike<Corpus> | null)?.then === \"function\";\n\n/** The same array while the set of tiles in it is the same, so a reader can compare by identity. */\nfunction keep(previous: readonly TileView[], next: TileView[]): readonly TileView[] {\n if (previous.length !== next.length) return next;\n return next.every((view, i) => view.content === previous[i]?.content) ? previous : next;\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n const self: MosaicClient = graphClient();\n\n let corpus: Corpus | null = null;\n let opening: PromiseLike<Corpus> | null = null;\n let failed = false;\n let unrenderable = false;\n let matrix: TileMatrixSet | null = null;\n let typeIndex = 0;\n let modeColumn: string | null = null;\n let scan: Scan | null = null;\n let binding = NO_BINDING;\n let filter: Filter | undefined;\n let viewport: Viewport | null = null;\n let declined: Gap[] = [];\n let composed: readonly TileView[] | null = null;\n let unlisten: (() => void) | null = null;\n let active = false;\n let lastFrame = -1;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase. Anything later is\n // asynchronous or effect-driven and is reported as it happens.\n let building = true;\n let held: string | null = null;\n const fail = (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n if (building) held = message;\n else options.onFailure(message);\n };\n\n const tileset = new Tileset2D({\n debounceTime: 60,\n load: async (addresses, signal) => {\n if (!corpus || !scan) throw new Error(\"the graph has no scan to read with\");\n const isCells = (address: TileAddress) => matrix?.tileMatrices[address.z]?.kind === \"cells\";\n const rows = await scan.read(addresses, { signal });\n const src = await corpus.edges({ from: addresses, direction: \"src\", signal });\n const payload = addresses.filter((address) => !isCells(address));\n const dst = payload.length > 0 ? await corpus.edges({ from: payload, direction: \"dst\", signal }) : [];\n const dstOf = new Map(payload.map((address, i) => [address, dst[i]]));\n return addresses.map((address, i) => {\n const out = src[i];\n const back = dstOf.get(address);\n const edges = [...(out?.batches ?? []), ...(back?.batches ?? [])];\n const gaps = [...(out?.declined ?? []), ...(back?.declined ?? [])];\n const declined = isCells(address) ? gaps.filter((gap) => gap.direction !== \"dst\") : gaps;\n const content = { rows: rows[i] as Batch, edges, declined };\n return { ...content, byteLength: bytesOf(content) };\n });\n },\n onTileLoad: (tile) => {\n for (const gap of tile.content?.declined ?? []) {\n if (!declined.some((d) => d.edgeType === gap.edgeType && d.direction === gap.direction)) {\n declined = [...declined, gap];\n }\n }\n tileset.refresh();\n notify();\n },\n onTileError: (error) => {\n tileset.refresh();\n fail(error);\n notify();\n },\n });\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n matrix: null,\n typeIndex: 0,\n modeColumn: null,\n binding: NO_BINDING,\n domain: [],\n z: null,\n visible: [],\n cached: [],\n pending: false,\n total: undefined,\n declined: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n drawn: null,\n options,\n corpus: null,\n };\n\n const viewOf = (tile: { address: TileAddress; content: TileContent | null }): TileView => ({\n address: tile.address,\n kind: matrix?.tileMatrices[tile.address.z]?.kind ?? \"rows\",\n content: tile.content as TileContent,\n });\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [corpus, typeIndex, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(corpus, typeIndex, binding, options.categories) };\n return domain.value;\n }\n\n function statusOf(pending: boolean, visible: readonly TileView[]): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n return pending || composed !== visible || snapshot.drawn === null ? \"reading\" : \"idle\";\n }\n\n function notify(patch: Partial<GraphSnapshot> = {}): void {\n lastFrame = tileset.frame;\n const tiles = tileset.tiles.filter((tile) => tile.content !== null);\n const visible = keep(snapshot.visible, tiles.filter((tile) => tile.isVisible).map(viewOf));\n const pending = tileset.selectedTiles.some((tile) => tile.isLoading);\n snapshot = {\n ...snapshot,\n matrix,\n typeIndex,\n modeColumn,\n binding,\n domain: domainNow(),\n z: tileset.z,\n visible,\n cached: keep(snapshot.cached, tiles.map(viewOf)),\n pending,\n total: matrix ? Number(matrix.tileMatrices[matrix.tileMatrices.length - 1]?.count ?? 0) : undefined,\n declined,\n options,\n corpus,\n ...patch,\n };\n snapshot = { ...snapshot, status: statusOf(pending, snapshot.visible) };\n for (const listener of listeners) listener();\n }\n\n /** A binding or a filter is a new scan, planned once and never per camera move. */\n function rescan(): void {\n if (!corpus || !matrix) return;\n try {\n const fixed = [KEY, ...PAYLOAD_COORDINATES];\n scan = corpus.scan({ type: matrix.type, filter, select: projectionOf(binding, fixed) });\n tileset.setPlan(scan.plan());\n } catch (error) {\n scan = null;\n tileset.setPlan([]);\n fail(error);\n }\n tileset.reloadAll();\n if (viewport) tileset.update(viewport, options.limit ?? DEFAULT_LIMIT);\n notify();\n }\n\n function reopen(): void {\n failed = false;\n matrix = null;\n scan = null;\n declined = [];\n composed = null;\n tileset.finalize();\n const cleared = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };\n if (!corpus) return notify(cleared);\n const types = corpus.types.vertices;\n const type = options.type ?? types.find((t) => t.geometry)?.type ?? types[0]?.type;\n typeIndex = Math.max(0, types.findIndex((t) => t.type === type));\n try {\n if (type === undefined) throw new Error(\"the corpus has no vertex type to draw\");\n matrix = corpus.tileMatrix(type);\n modeColumn = matrix.mode?.column ?? null;\n tileset.setMatrix(matrix);\n } catch (error) {\n failed = true;\n fail(error);\n }\n snapshot = { ...snapshot, ...cleared };\n rescan();\n }\n\n /** A promise is adopted when it settles, and only if it is still the corpus the host means. */\n function adopt(given: GraphOptions[\"corpus\"]): void {\n corpus = null;\n opening = isPromise(given) ? given : null;\n if (!opening) {\n corpus = given as Corpus | null;\n return reopen();\n }\n const promised = opening;\n reopen();\n promised.then(\n (opened) => {\n if (opening !== promised) return;\n opening = null;\n corpus = opened;\n reopen();\n },\n (error: unknown) => {\n if (opening !== promised) return;\n opening = null;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function listen(): void {\n unlisten?.();\n unlisten = null;\n const crossfilter = options.filterBy;\n const refilter = () => {\n let next: Filter | undefined;\n try {\n next = crossfilter ? filterFor(crossfilter, self) : undefined;\n } catch (error) {\n fail(error);\n return;\n }\n if (sameFilter(next, filter)) return;\n filter = next;\n rescan();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", refilter);\n unlisten = () => crossfilter.removeEventListener(\"value\", refilter);\n }\n refilter();\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber starts listening to the crossfilter and the last one stops it and lets the\n * tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode\n * mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n listen();\n if (held !== null) {\n const message = held;\n held = null;\n options.onFailure(message);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const nextBinding = bindingOf(next);\n const rebound =\n nextBinding.category !== binding.category ||\n nextBinding.size !== binding.size ||\n nextBinding.title !== binding.title;\n binding = nextBinding;\n if (next.corpus !== previous.corpus || next.type !== previous.type) {\n if (next.corpus !== previous.corpus) adopt(next.corpus);\n else reopen();\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) return rescan();\n if (next.limit !== previous.limit && viewport) tileset.update(viewport, next.limit ?? DEFAULT_LIMIT);\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n tileset.finalize();\n listeners.clear();\n },\n setViewport(next) {\n viewport = next;\n if (tileset.update(next, options.limit ?? DEFAULT_LIMIT) !== lastFrame) notify();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n notify({ selection });\n options.onSelect?.(selection);\n if (options.filterBy) publish(options.filterBy, self, KEY, selection ? selection.vertices.map(denseOf) : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n notify({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) notify({ hovered: vertex });\n },\n pin(vertices) {\n notify({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) notify({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) notify({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) notify({ progress: value });\n },\n setRenderable(renderable) {\n if (unrenderable === !renderable) return;\n unrenderable = !renderable;\n notify();\n },\n reportDrawn(visible, drawn) {\n if (composed === visible && drawn === null) return;\n composed = visible;\n notify(drawn ? { drawn } : {});\n },\n };\n\n binding = bindingOf(initial);\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["DEFAULT_LIMIT","NO_BINDING","bindingOf","KEY","PAYLOAD_ADDRESS","bytesOf","content","bytes","edge","_a","sameFilter","a","b","_","v","isPromise","value","keep","previous","next","view","i","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","matrix","typeIndex","modeColumn","scan","binding","filter","viewport","declined","composed","unlisten","active","lastFrame","building","held","fail","error","message","tileset","Tileset2D","addresses","signal","isCells","address","rows","src","payload","dst","dstOf","out","back","edges","gaps","gap","tile","d","notify","snapshot","viewOf","domain","domainNow","key","part","domainOf","statusOf","pending","visible","patch","tiles","listener","rescan","fixed","PAYLOAD_COORDINATES","projectionOf","reopen","cleared","types","type","t","_b","_c","adopt","given","promised","opened","listen","crossfilter","refilter","filterFor","store","nextBinding","rebound","vertices","source","label","selection","publish","denseOf","vertex","tool","motion","renderable","drawn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import {\n PAYLOAD_ADDRESS,\n PAYLOAD_COORDINATES,\n type Batch,\n type Corpus,\n type Filter,\n type Gap,\n type Scan,\n type TileAddress,\n type TileMatrixSet,\n} from \"@fossil-lang/corpus\";\nimport type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf, projectionOf, type Binding } from \"./channels\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { denseOf } from \"./resident\";\nimport type { GraphOptions, GraphSnapshot, GraphStatus, GraphStore, TileView } from \"./state\";\nimport type { TileContent } from \"./tile\";\nimport type { Viewport } from \"./tile-matrix\";\nimport { Tileset2D } from \"./tileset\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore, TileView } from \"./state\";\n\n/** Twenty thousand marks: what a canvas draws at once before a coarser zoom is chosen. */\nexport const DEFAULT_LIMIT = 20_000;\n\nconst NO_BINDING: Binding = bindingOf({});\nconst KEY = PAYLOAD_ADDRESS[0] as string;\n\nfunction bytesOf(content: Omit<TileContent, \"byteLength\">): number {\n let bytes = 0;\n for (const edge of content.edges) bytes += edge.src.byteLength + edge.dst.byteLength + (edge.weight?.byteLength ?? 0);\n return bytes + content.rows.numRows * 8 * 4;\n}\n\nconst sameFilter = (a: Filter | undefined, b: Filter | undefined) =>\n JSON.stringify(a, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v)) ===\n JSON.stringify(b, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v));\n\nconst isPromise = (value: unknown): value is PromiseLike<Corpus> =>\n typeof (value as PromiseLike<Corpus> | null)?.then === \"function\";\n\n/** The same array while the set of tiles in it is the same, so a reader can compare by identity. */\nfunction keep(previous: readonly TileView[], next: TileView[]): readonly TileView[] {\n if (previous.length !== next.length) return next;\n return next.every((view, i) => view.content === previous[i]?.content) ? previous : next;\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n const self: MosaicClient = graphClient();\n\n let corpus: Corpus | null = null;\n let opening: PromiseLike<Corpus> | null = null;\n let failed = false;\n let unrenderable = false;\n let matrix: TileMatrixSet | null = null;\n let typeIndex = 0;\n let modeColumn: string | null = null;\n let scan: Scan | null = null;\n let binding = NO_BINDING;\n let filter: Filter | undefined;\n let viewport: Viewport | null = null;\n let declined: Gap[] = [];\n let composed: readonly TileView[] | null = null;\n let unlisten: (() => void) | null = null;\n let active = false;\n let lastFrame = -1;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase. Anything later is\n // asynchronous or effect-driven and is reported as it happens.\n let building = true;\n let held: string | null = null;\n const fail = (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n if (building) held = message;\n else options.onFailure(message);\n };\n\n const tileset = new Tileset2D({\n debounceTime: 60,\n load: async (addresses, signal) => {\n if (!corpus || !scan) throw new Error(\"the graph has no scan to read with\");\n const isCells = (address: TileAddress) => matrix?.tileMatrices[address.z]?.kind === \"cells\";\n const rows = await scan.read(addresses, { signal });\n const src = await corpus.edges({ from: addresses, direction: \"src\", signal });\n const payload = addresses.filter((address) => !isCells(address));\n const dst = payload.length > 0 ? await corpus.edges({ from: payload, direction: \"dst\", signal }) : [];\n const dstOf = new Map(payload.map((address, i) => [address, dst[i]]));\n return addresses.map((address, i) => {\n const out = src[i];\n const back = dstOf.get(address);\n const edges = [...(out?.batches ?? []), ...(back?.batches ?? [])];\n const gaps = [...(out?.declined ?? []), ...(back?.declined ?? [])];\n const declined = isCells(address) ? gaps.filter((gap) => gap.direction !== \"dst\") : gaps;\n const content = { rows: rows[i] as Batch, edges, declined };\n return { ...content, byteLength: bytesOf(content) };\n });\n },\n onTileLoad: (tile) => {\n for (const gap of tile.content?.declined ?? []) {\n if (!declined.some((d) => d.edgeType === gap.edgeType && d.direction === gap.direction)) {\n declined = [...declined, gap];\n }\n }\n tileset.refresh();\n notify();\n },\n onTileError: (error) => {\n tileset.refresh();\n fail(error);\n notify();\n },\n });\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n matrix: null,\n typeIndex: 0,\n modeColumn: null,\n binding: NO_BINDING,\n domain: [],\n z: null,\n visible: [],\n cached: [],\n pending: false,\n total: undefined,\n declined: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n drawn: null,\n options,\n corpus: null,\n };\n\n const viewOf = (tile: { address: TileAddress; content: TileContent | null }): TileView => ({\n address: tile.address,\n kind: matrix?.tileMatrices[tile.address.z]?.kind ?? \"rows\",\n content: tile.content as TileContent,\n });\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [corpus, typeIndex, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(corpus, typeIndex, binding, options.categories) };\n return domain.value;\n }\n\n function statusOf(pending: boolean, visible: readonly TileView[]): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n return pending || composed !== visible || snapshot.drawn === null ? \"reading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n lastFrame = tileset.frame;\n const tiles = tileset.tiles.filter((tile) => tile.content !== null);\n const visible = keep(snapshot.visible, tiles.filter((tile) => tile.isVisible).map(viewOf));\n const pending = tileset.selectedTiles.some((tile) => tile.isLoading);\n snapshot = {\n ...snapshot,\n matrix,\n typeIndex,\n modeColumn,\n binding,\n domain: domainNow(),\n z: tileset.z,\n visible,\n cached: keep(snapshot.cached, tiles.map(viewOf)),\n pending,\n total: matrix ? Number(matrix.tileMatrices[matrix.tileMatrices.length - 1]?.count ?? 0) : undefined,\n declined,\n options,\n corpus,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf(pending, snapshot.visible) };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — rebuilds no tile view. */\n function patch(fields: Partial<GraphSnapshot>): void {\n snapshot = { ...snapshot, ...fields };\n emit();\n }\n\n function emit(): void {\n for (const listener of listeners) listener();\n }\n\n /** A binding or a filter is a new scan, planned once and never per camera move. */\n function rescan(): void {\n if (!corpus || !matrix) return;\n try {\n const fixed = [KEY, ...PAYLOAD_COORDINATES];\n scan = corpus.scan({ type: matrix.type, filter, select: projectionOf(binding, fixed) });\n tileset.setPlan(scan.plan());\n } catch (error) {\n scan = null;\n tileset.setPlan([]);\n fail(error);\n }\n tileset.reloadAll();\n if (viewport) tileset.update(viewport, options.limit ?? DEFAULT_LIMIT);\n notify();\n }\n\n function reopen(): void {\n failed = false;\n matrix = null;\n scan = null;\n declined = [];\n composed = null;\n tileset.finalize();\n const cleared = { selection: null, focus: null, hovered: null, pinned: [], drawn: null };\n if (!corpus) return notify(cleared);\n const types = corpus.types.vertices;\n const type = options.type ?? types.find((t) => t.geometry)?.type ?? types[0]?.type;\n typeIndex = Math.max(0, types.findIndex((t) => t.type === type));\n try {\n if (type === undefined) throw new Error(\"the corpus has no vertex type to draw\");\n matrix = corpus.tileMatrix(type);\n modeColumn = matrix.mode?.column ?? null;\n tileset.setMatrix(matrix);\n } catch (error) {\n failed = true;\n fail(error);\n }\n snapshot = { ...snapshot, ...cleared };\n rescan();\n }\n\n /** A promise is adopted when it settles, and only if it is still the corpus the host means. */\n function adopt(given: GraphOptions[\"corpus\"]): void {\n corpus = null;\n opening = isPromise(given) ? given : null;\n if (!opening) {\n corpus = given as Corpus | null;\n return reopen();\n }\n const promised = opening;\n reopen();\n promised.then(\n (opened) => {\n if (opening !== promised) return;\n opening = null;\n corpus = opened;\n reopen();\n },\n (error: unknown) => {\n if (opening !== promised) return;\n opening = null;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function listen(): void {\n unlisten?.();\n unlisten = null;\n const crossfilter = options.filterBy;\n const refilter = () => {\n let next: Filter | undefined;\n try {\n next = crossfilter ? filterFor(crossfilter, self) : undefined;\n } catch (error) {\n fail(error);\n return;\n }\n if (sameFilter(next, filter)) return;\n filter = next;\n rescan();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", refilter);\n unlisten = () => crossfilter.removeEventListener(\"value\", refilter);\n }\n refilter();\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber starts listening to the crossfilter and the last one stops it and lets the\n * tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode\n * mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n listen();\n if (held !== null) {\n const message = held;\n held = null;\n options.onFailure(message);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const nextBinding = bindingOf(next);\n const rebound =\n nextBinding.category !== binding.category ||\n nextBinding.size !== binding.size ||\n nextBinding.title !== binding.title;\n binding = nextBinding;\n if (next.corpus !== previous.corpus || next.type !== previous.type) {\n if (next.corpus !== previous.corpus) adopt(next.corpus);\n else reopen();\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) return rescan();\n if (next.limit !== previous.limit && viewport) tileset.update(viewport, next.limit ?? DEFAULT_LIMIT);\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n tileset.finalize();\n listeners.clear();\n },\n setViewport(next) {\n viewport = next;\n if (tileset.update(next, options.limit ?? DEFAULT_LIMIT) !== lastFrame) notify();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n patch({ selection });\n options.onSelect?.(selection);\n if (options.filterBy) publish(options.filterBy, self, KEY, selection ? selection.vertices.map(denseOf) : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n patch({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) patch({ hovered: vertex });\n },\n pin(vertices) {\n patch({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) patch({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) patch({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) patch({ progress: value });\n },\n setRenderable(renderable) {\n if (unrenderable === !renderable) return;\n unrenderable = !renderable;\n notify();\n },\n reportDrawn(visible, drawn) {\n if (composed === visible && drawn === null) return;\n composed = visible;\n notify(drawn ? { drawn } : {});\n },\n };\n\n binding = bindingOf(initial);\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["DEFAULT_LIMIT","NO_BINDING","bindingOf","KEY","PAYLOAD_ADDRESS","bytesOf","content","bytes","edge","_a","sameFilter","a","b","_","v","isPromise","value","keep","previous","next","view","i","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","matrix","typeIndex","modeColumn","scan","binding","filter","viewport","declined","composed","unlisten","active","lastFrame","building","held","fail","error","message","tileset","Tileset2D","addresses","signal","isCells","address","rows","src","payload","dst","dstOf","out","back","edges","gaps","gap","tile","d","notify","snapshot","viewOf","domain","domainNow","key","part","domainOf","statusOf","pending","visible","fields","tiles","emit","patch","listener","rescan","fixed","PAYLOAD_COORDINATES","projectionOf","reopen","cleared","types","type","t","_b","_c","adopt","given","promised","opened","listen","crossfilter","refilter","filterFor","store","nextBinding","rebound","vertices","source","label","selection","publish","denseOf","vertex","tool","motion","renderable","drawn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/parts/gesture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/parts/gesture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,wFAAwF;AACxF,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAS/F,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAIjE;AAED,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,oFAAoF;IACpF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE;QACR,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACnD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;QACjD,eAAe,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,QAAQ,CAAC;IAC5B,wEAAwE;IACxE,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/B;AAOD,wBAAgB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CA0IhF"}
|
package/dist/parts/gesture.js
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useState as m, useRef as
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function N(l) {
|
|
2
|
+
import { useState as m, useRef as R, useCallback as S, useEffect as I } from "react";
|
|
3
|
+
const x = 3, K = 4, _ = 60;
|
|
4
|
+
function D(l) {
|
|
6
5
|
if (!l) return { display: "none" };
|
|
7
6
|
const [i = 0, a = 0] = l.tool === "rect" ? l.to : l.path[l.path.length - 1] ?? [];
|
|
8
7
|
return { left: i + 14, top: a + 14 };
|
|
9
8
|
}
|
|
10
|
-
const
|
|
9
|
+
const q = {
|
|
11
10
|
rect: { source: "marquee", label: "Marquee" },
|
|
12
11
|
lasso: { source: "lasso", label: "Lasso" }
|
|
13
12
|
};
|
|
14
|
-
function
|
|
15
|
-
const { commit: i, getGraph: a, getResident: k, getSelection: v, setTool: y, tool: h } = l, [s, c] = m(null), [L, f] = m(null), [
|
|
13
|
+
function G(l) {
|
|
14
|
+
const { commit: i, getGraph: a, getResident: k, getSelection: v, setTool: y, tool: h } = l, [s, c] = m(null), [L, f] = m(null), [T, d] = m(!1), b = R(0), p = S(
|
|
16
15
|
(t) => {
|
|
17
16
|
const e = a();
|
|
18
17
|
if (!e) return [];
|
|
19
|
-
if (!K(e)) return [];
|
|
20
18
|
if (t.tool === "rect") {
|
|
21
19
|
const [[o, n], [r, u]] = [t.from, t.to];
|
|
22
20
|
return Math.abs(r - o) < x || Math.abs(u - n) < x ? [] : Array.from(
|
|
@@ -32,7 +30,7 @@ function U(l) {
|
|
|
32
30
|
), E = S(
|
|
33
31
|
(t) => {
|
|
34
32
|
const e = performance.now();
|
|
35
|
-
e - b.current <
|
|
33
|
+
e - b.current < _ || (b.current = e, f(p(t).length));
|
|
36
34
|
},
|
|
37
35
|
[p]
|
|
38
36
|
);
|
|
@@ -49,18 +47,18 @@ function U(l) {
|
|
|
49
47
|
const M = (t) => {
|
|
50
48
|
const e = t.currentTarget.getBoundingClientRect();
|
|
51
49
|
return [t.clientX - e.left, t.clientY - e.top];
|
|
52
|
-
},
|
|
50
|
+
}, A = (t, e) => {
|
|
53
51
|
var P;
|
|
54
52
|
if (c(null), f(null), !t) return;
|
|
55
53
|
const o = new Set(k().verticesAt(p(t)));
|
|
56
54
|
if (o.size === 0 && !e.altKey) return;
|
|
57
|
-
const { label: n, source: r } =
|
|
55
|
+
const { label: n, source: r } = q[t.tool], u = ((P = v()) == null ? void 0 : P.vertices) ?? [];
|
|
58
56
|
if (e.altKey) {
|
|
59
57
|
const w = new Set(u);
|
|
60
|
-
for (const
|
|
58
|
+
for (const C of o) w.delete(C);
|
|
61
59
|
i(w.size > 0 ? w : null, r, n);
|
|
62
60
|
} else e.metaKey || e.ctrlKey ? i(/* @__PURE__ */ new Set([...u, ...o]), r, n) : i(o, r, n);
|
|
63
|
-
}, g = h ?? (
|
|
61
|
+
}, g = h ?? (T ? "rect" : null);
|
|
64
62
|
return {
|
|
65
63
|
drag: s,
|
|
66
64
|
preview: L,
|
|
@@ -83,11 +81,11 @@ function U(l) {
|
|
|
83
81
|
return;
|
|
84
82
|
}
|
|
85
83
|
const o = s.path[s.path.length - 1];
|
|
86
|
-
if (Math.hypot(e[0] - o[0], e[1] - o[1]) <
|
|
84
|
+
if (Math.hypot(e[0] - o[0], e[1] - o[1]) < K) return;
|
|
87
85
|
const n = { tool: "lasso", path: [...s.path, e] };
|
|
88
86
|
c(n), E(n);
|
|
89
87
|
},
|
|
90
|
-
onPointerUp: (t) =>
|
|
88
|
+
onPointerUp: (t) => A(s, t),
|
|
91
89
|
onPointerCancel: () => {
|
|
92
90
|
c(null), f(null);
|
|
93
91
|
}
|
|
@@ -95,7 +93,7 @@ function U(l) {
|
|
|
95
93
|
};
|
|
96
94
|
}
|
|
97
95
|
export {
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
D as cursorChip,
|
|
97
|
+
G as useGesture
|
|
100
98
|
};
|
|
101
99
|
//# sourceMappingURL=gesture.js.map
|