@kanzo-tech/graph 0.13.0 → 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 +121 -118
- 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 +27 -8
- 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 G, projectionOf as
|
|
4
|
-
import { graphClient as
|
|
5
|
-
import { denseOf as
|
|
6
|
-
import { Tileset2D as
|
|
7
|
-
const Y = 2e4,
|
|
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
|
|
17
|
-
var
|
|
18
|
-
return
|
|
19
|
-
}) ?
|
|
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
|
+
var r;
|
|
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
|
|
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 (!
|
|
32
|
-
const l = (
|
|
33
|
-
var
|
|
34
|
-
return ((
|
|
35
|
-
},
|
|
36
|
-
return e.map((
|
|
37
|
-
const
|
|
38
|
-
return { ...
|
|
31
|
+
if (!r || !v) throw new Error("the graph has no scan to read with");
|
|
32
|
+
const l = (w) => {
|
|
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: [],
|
|
@@ -76,165 +76,168 @@ function ve(i) {
|
|
|
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 = [
|
|
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
|
-
V =
|
|
94
|
-
const t =
|
|
95
|
-
|
|
96
|
-
...
|
|
97
|
-
matrix:
|
|
98
|
-
typeIndex:
|
|
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
99
|
modeColumn: J,
|
|
100
|
-
binding:
|
|
101
|
-
domain:
|
|
102
|
-
z:
|
|
100
|
+
binding: m,
|
|
101
|
+
domain: x(),
|
|
102
|
+
z: u.z,
|
|
103
103
|
visible: l,
|
|
104
|
-
cached:
|
|
105
|
-
pending:
|
|
106
|
-
total:
|
|
107
|
-
declined:
|
|
104
|
+
cached: Z(i.cached, t.map(j)),
|
|
105
|
+
pending: o,
|
|
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
|
-
corpus:
|
|
109
|
+
corpus: r,
|
|
110
110
|
...e
|
|
111
|
-
},
|
|
112
|
-
|
|
111
|
+
}, i = { ...i, status: ee(o, i.visible) }, K();
|
|
112
|
+
}
|
|
113
|
+
function b(e) {
|
|
114
|
+
i = { ...i, ...e }, K();
|
|
115
|
+
}
|
|
116
|
+
function K() {
|
|
117
|
+
for (const e of d) e();
|
|
113
118
|
}
|
|
114
119
|
function k() {
|
|
115
|
-
if (!(!
|
|
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
|
|
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 (!
|
|
130
|
-
const t =
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
} catch (u) {
|
|
138
|
-
M = !0, D(u);
|
|
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);
|
|
139
142
|
}
|
|
140
|
-
|
|
143
|
+
i = { ...i, ...e }, k();
|
|
141
144
|
}
|
|
142
|
-
function
|
|
143
|
-
if (
|
|
144
|
-
return
|
|
145
|
-
const t =
|
|
146
|
-
|
|
145
|
+
function U(e) {
|
|
146
|
+
if (r = null, h = ge(e) ? e : null, !h)
|
|
147
|
+
return r = e, F();
|
|
148
|
+
const t = h;
|
|
149
|
+
F(), t.then(
|
|
147
150
|
(l) => {
|
|
148
|
-
|
|
151
|
+
h === t && (h = null, r = l, F());
|
|
149
152
|
},
|
|
150
153
|
(l) => {
|
|
151
|
-
|
|
154
|
+
h === t && (h = null, S = !0, M(l), g());
|
|
152
155
|
}
|
|
153
156
|
);
|
|
154
157
|
}
|
|
155
158
|
function R() {
|
|
156
|
-
|
|
159
|
+
y == null || y(), y = null;
|
|
157
160
|
const e = n.filterBy, t = () => {
|
|
158
161
|
let l;
|
|
159
162
|
try {
|
|
160
|
-
l = e ?
|
|
161
|
-
} catch (
|
|
162
|
-
|
|
163
|
+
l = e ? de(e, c) : void 0;
|
|
164
|
+
} catch (o) {
|
|
165
|
+
M(o);
|
|
163
166
|
return;
|
|
164
167
|
}
|
|
165
|
-
|
|
168
|
+
ye(l, _) || (_ = l, k());
|
|
166
169
|
};
|
|
167
|
-
e && (e.addEventListener("value", t),
|
|
170
|
+
e && (e.addEventListener("value", t), y = () => e.removeEventListener("value", t)), t();
|
|
168
171
|
}
|
|
169
|
-
const
|
|
172
|
+
const q = {
|
|
170
173
|
/**
|
|
171
174
|
* The first subscriber starts listening to the crossfilter and the last one stops it and lets the
|
|
172
175
|
* tiles go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
|
|
173
176
|
* mounting everything twice.
|
|
174
177
|
*/
|
|
175
178
|
subscribe(e) {
|
|
176
|
-
if (
|
|
177
|
-
const t =
|
|
178
|
-
|
|
179
|
+
if (d.add(e), !D && (D = !0, R(), N !== null)) {
|
|
180
|
+
const t = N;
|
|
181
|
+
N = null, n.onFailure(t);
|
|
179
182
|
}
|
|
180
183
|
return () => {
|
|
181
|
-
|
|
184
|
+
d.delete(e), d.size === 0 && q.destroy();
|
|
182
185
|
};
|
|
183
186
|
},
|
|
184
|
-
getSnapshot: () =>
|
|
187
|
+
getSnapshot: () => i,
|
|
185
188
|
getOptions: () => n,
|
|
186
189
|
setOptions(e) {
|
|
187
190
|
const t = n;
|
|
188
191
|
n = e;
|
|
189
|
-
const l = G(e),
|
|
190
|
-
if (
|
|
191
|
-
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();
|
|
192
195
|
return;
|
|
193
196
|
}
|
|
194
|
-
if (
|
|
195
|
-
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();
|
|
196
199
|
},
|
|
197
200
|
destroy() {
|
|
198
|
-
|
|
201
|
+
D = !1, y == null || y(), y = null, u.finalize(), d.clear();
|
|
199
202
|
},
|
|
200
203
|
setViewport(e) {
|
|
201
|
-
|
|
204
|
+
E = e, u.update(e, n.limit ?? Y) !== V && g();
|
|
202
205
|
},
|
|
203
206
|
select(e, t = "node", l = "") {
|
|
204
|
-
var
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
+
var p;
|
|
208
|
+
const o = e && e.length > 0 ? { vertices: [...e], source: t, label: l } : null;
|
|
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);
|
|
207
210
|
},
|
|
208
211
|
focus(e) {
|
|
209
212
|
var t;
|
|
210
|
-
e !==
|
|
213
|
+
e !== i.focus && (b({ focus: e }), (t = n.onFocus) == null || t.call(n, e));
|
|
211
214
|
},
|
|
212
215
|
hover(e) {
|
|
213
|
-
e !==
|
|
216
|
+
e !== i.hovered && b({ hovered: e });
|
|
214
217
|
},
|
|
215
218
|
pin(e) {
|
|
216
|
-
|
|
219
|
+
b({ pinned: [...e] });
|
|
217
220
|
},
|
|
218
221
|
setTool(e) {
|
|
219
|
-
e !==
|
|
222
|
+
e !== i.tool && b({ tool: e });
|
|
220
223
|
},
|
|
221
224
|
report(e) {
|
|
222
|
-
e !==
|
|
225
|
+
e !== i.motion && b({ motion: e });
|
|
223
226
|
},
|
|
224
227
|
reportProgress(e) {
|
|
225
|
-
e !==
|
|
228
|
+
e !== i.progress && b({ progress: e });
|
|
226
229
|
},
|
|
227
230
|
setRenderable(e) {
|
|
228
|
-
|
|
231
|
+
P !== !e && (P = !e, g());
|
|
229
232
|
},
|
|
230
233
|
reportDrawn(e, t) {
|
|
231
|
-
|
|
234
|
+
I === e && t === null || (I = e, g(t ? { drawn: t } : {}));
|
|
232
235
|
}
|
|
233
236
|
};
|
|
234
|
-
return
|
|
237
|
+
return m = G(s), U(s.corpus), $ = !1, q;
|
|
235
238
|
}
|
|
236
239
|
export {
|
|
237
240
|
Y as DEFAULT_LIMIT,
|
|
238
|
-
|
|
241
|
+
Te as createGraph
|
|
239
242
|
};
|
|
240
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 const mode = corpus.addressing.vertexType(type).cells?.modeChannel ?? null;\n modeColumn = types[typeIndex]?.channels.find((channel) => channel.name === 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","mode","_c","_e","_d","channel","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
|