@kanzo-tech/graph 0.18.0 → 0.20.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.
Files changed (76) hide show
  1. package/README.md +25 -7
  2. package/dist/core/detail.d.ts +3 -1
  3. package/dist/core/detail.d.ts.map +1 -1
  4. package/dist/core/detail.js +55 -30
  5. package/dist/core/detail.js.map +1 -1
  6. package/dist/core/error.d.ts +16 -0
  7. package/dist/core/error.d.ts.map +1 -0
  8. package/dist/core/error.js +14 -0
  9. package/dist/core/error.js.map +1 -0
  10. package/dist/core/filter.d.ts +0 -13
  11. package/dist/core/filter.d.ts.map +1 -1
  12. package/dist/core/filter.js +47 -55
  13. package/dist/core/filter.js.map +1 -1
  14. package/dist/core/load.d.ts +5 -0
  15. package/dist/core/load.d.ts.map +1 -1
  16. package/dist/core/load.js +93 -78
  17. package/dist/core/load.js.map +1 -1
  18. package/dist/core/state.d.ts +21 -6
  19. package/dist/core/state.d.ts.map +1 -1
  20. package/dist/core/store.d.ts.map +1 -1
  21. package/dist/core/store.js +107 -101
  22. package/dist/core/store.js.map +1 -1
  23. package/dist/core/types.d.ts +4 -4
  24. package/dist/core/types.d.ts.map +1 -1
  25. package/dist/index.d.ts +8 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +27 -19
  28. package/dist/index.js.map +1 -1
  29. package/dist/parts/graph-canvas.js +45 -45
  30. package/dist/parts/graph-canvas.js.map +1 -1
  31. package/dist/parts/graph-counts.d.ts +15 -0
  32. package/dist/parts/graph-counts.d.ts.map +1 -0
  33. package/dist/parts/graph-counts.js +41 -0
  34. package/dist/parts/graph-counts.js.map +1 -0
  35. package/dist/parts/graph-inspector.d.ts.map +1 -1
  36. package/dist/parts/graph-inspector.js +48 -48
  37. package/dist/parts/graph-inspector.js.map +1 -1
  38. package/dist/parts/graph-legend.d.ts +3 -2
  39. package/dist/parts/graph-legend.d.ts.map +1 -1
  40. package/dist/parts/graph-legend.js +30 -48
  41. package/dist/parts/graph-legend.js.map +1 -1
  42. package/dist/parts/graph-looks.d.ts +16 -0
  43. package/dist/parts/graph-looks.d.ts.map +1 -0
  44. package/dist/parts/graph-looks.js +138 -0
  45. package/dist/parts/graph-looks.js.map +1 -0
  46. package/dist/parts/graph-search.d.ts +17 -0
  47. package/dist/parts/graph-search.d.ts.map +1 -0
  48. package/dist/parts/graph-search.js +89 -0
  49. package/dist/parts/graph-search.js.map +1 -0
  50. package/dist/react/use-graph-prefs.d.ts +6 -2
  51. package/dist/react/use-graph-prefs.d.ts.map +1 -1
  52. package/dist/react/use-graph-prefs.js +7 -7
  53. package/dist/react/use-graph-prefs.js.map +1 -1
  54. package/dist/react/use-graph.js +61 -55
  55. package/dist/react/use-graph.js.map +1 -1
  56. package/dist/render/camera.d.ts +26 -0
  57. package/dist/render/camera.d.ts.map +1 -0
  58. package/dist/render/camera.js +40 -0
  59. package/dist/render/camera.js.map +1 -0
  60. package/dist/render/graph-looks.d.ts +10 -0
  61. package/dist/render/graph-looks.d.ts.map +1 -1
  62. package/dist/render/graph-looks.js +37 -20
  63. package/dist/render/graph-looks.js.map +1 -1
  64. package/dist/render/placement.d.ts +23 -0
  65. package/dist/render/placement.d.ts.map +1 -0
  66. package/dist/render/placement.js +23 -0
  67. package/dist/render/placement.js.map +1 -0
  68. package/dist/render/renderer.d.ts +1 -0
  69. package/dist/render/renderer.d.ts.map +1 -1
  70. package/dist/render/renderer.js +115 -96
  71. package/dist/render/renderer.js.map +1 -1
  72. package/dist/render/webgl.d.ts +5 -4
  73. package/dist/render/webgl.d.ts.map +1 -1
  74. package/dist/render/webgl.js +14 -11
  75. package/dist/render/webgl.js.map +1 -1
  76. package/package.json +10 -9
@@ -1,28 +1,32 @@
1
- import { domainOf as Y } from "./categories.js";
1
+ import { GraphError as Y } from "./error.js";
2
+ import { domainOf as Z } from "./categories.js";
2
3
  import { bindingOf as Q } from "./channels.js";
3
- import { graphClient as Z, publish as x, filterFor as ee } from "./filter.js";
4
- import { drawnTables as ne, loadEncoding as te, loadGraph as re, maskOf as U, readKept as oe } from "./load.js";
5
- const le = (a, r) => JSON.stringify(a, (m, s) => typeof s == "bigint" ? `${s}n` : s) === JSON.stringify(r, (m, s) => typeof s == "bigint" ? `${s}n` : s), ie = (a) => typeof (a == null ? void 0 : a.then) == "function";
6
- function se(a, r, m) {
7
- const s = r.domain.map(() => 0);
8
- let l = 0;
9
- for (let u = 0; u < a.size; u++) {
10
- if (m && !m[u] || Number.isNaN(a.positions[u * 2])) continue;
11
- l++;
12
- const h = r.ranks[u];
13
- s[h] = (s[h] ?? 0) + 1;
4
+ import { graphClient as x, publish as ee, filterFor as ne } from "./filter.js";
5
+ import { drawnTables as te, loadEncoding as re, loadGraph as oe, maskOf as R, readKept as le } from "./load.js";
6
+ const ie = (u, r) => JSON.stringify(u, (m, f) => typeof f == "bigint" ? `${f}n` : f) === JSON.stringify(r, (m, f) => typeof f == "bigint" ? `${f}n` : f), se = (u) => typeof (u == null ? void 0 : u.then) == "function";
7
+ function ue(u, r, m) {
8
+ const f = r.domain.map(() => 0), s = new Uint8Array(u.size);
9
+ let y = 0;
10
+ for (let l = 0; l < u.size; l++) {
11
+ if (m && !m[l] || Number.isNaN(u.positions[l * 2])) continue;
12
+ s[l] = 1, y++;
13
+ const c = r.ranks[l];
14
+ f[c] = (f[c] ?? 0) + 1;
14
15
  }
15
- return { vertices: l, domain: r.domain, tally: s };
16
+ let h = 0;
17
+ const { links: k } = u;
18
+ for (let l = 0; l < k.length; l += 2)
19
+ s[k[l]] && s[k[l + 1]] && h++;
20
+ return { vertices: y, edges: h, domain: r.domain, tally: f };
16
21
  }
17
- function de(a) {
18
- let r = a;
19
- const m = /* @__PURE__ */ new Set(), s = Z();
20
- let l = null, u = null, h = !1, _ = !1, y = [], p = Q(a), N, c = null, i = null, f = null, b = null, B = null, v = null, T = [], w = null, E = !1, R = !0, z = null;
21
- const S = (e) => {
22
- const n = e instanceof Error ? e.message : String(e);
23
- R ? z = n : r.onFailure(n);
22
+ function ye(u) {
23
+ let r = u;
24
+ const m = /* @__PURE__ */ new Set(), f = x();
25
+ let s = null, y = null, h = !1, k = !1, l = [], c = Q(u), F, d = null, i = null, a = null, b = null, N = null, v = null, G = [], w = null, z = !1, U = !0, L = null;
26
+ const T = (e) => {
27
+ U ? L = { error: e } : r.onFailure(e);
24
28
  };
25
- let d = {
29
+ let p = {
26
30
  status: "none",
27
31
  total: void 0,
28
32
  drawn: null,
@@ -36,109 +40,108 @@ function de(a) {
36
40
  progress: 1,
37
41
  options: r,
38
42
  corpus: null,
39
- binding: p,
43
+ binding: c,
40
44
  geometry: null,
41
45
  encoding: null,
42
46
  mask: null
43
- }, $ = { key: [], value: [] };
47
+ }, _ = { key: [], value: [] };
44
48
  function j() {
45
- const e = [y, p.byTable, p.category, r.categories];
46
- return e.some((n, t) => n !== $.key[t]) && ($ = { key: e, value: Y(y, p, r.categories) }), $.value;
49
+ const e = [l, c.byTable, c.category, r.categories];
50
+ return e.some((n, t) => n !== _.key[t]) && (_ = { key: e, value: Z(l, c, r.categories) }), _.value;
47
51
  }
48
- let C = { key: [], value: null };
52
+ let A = { key: [], value: null };
49
53
  function V() {
50
- const e = [f, b, v];
51
- return e.some((n, t) => n !== C.key[t]) && (C = { key: e, value: f && b ? se(f, b, v) : null }), C.value;
54
+ const e = [a, b, v];
55
+ return e.some((n, t) => n !== A.key[t]) && (A = { key: e, value: a && b ? ue(a, b, v) : null }), A.value;
52
56
  }
53
57
  function W() {
54
- if (h || _) return "failed";
55
- if (u) return "opening";
56
- if (!l) return "none";
57
- const n = f !== null && [f, b, v].every((t, o) => t === T[o]);
58
- return c || i || !n ? "loading" : "idle";
58
+ if (h || k) return "failed";
59
+ if (y) return "opening";
60
+ if (!s) return "none";
61
+ const n = a !== null && [a, b, v].every((t, o) => t === G[o]);
62
+ return d || i || !n ? "loading" : "idle";
59
63
  }
60
64
  function g(e = {}) {
61
- d = {
62
- ...d,
63
- total: l ? y.reduce((n, t) => n + t.record_count, 0) : void 0,
65
+ p = {
66
+ ...p,
67
+ total: s ? l.reduce((n, t) => n + t.record_count, 0) : void 0,
64
68
  drawn: V(),
65
69
  domain: j(),
66
70
  options: r,
67
- corpus: l,
68
- binding: p,
69
- geometry: f,
71
+ corpus: s,
72
+ binding: c,
73
+ geometry: a,
70
74
  encoding: b,
71
75
  mask: v,
72
76
  ...e
73
- }, d = { ...d, status: W() }, q();
77
+ }, p = { ...p, status: W() }, q();
74
78
  }
75
- function O(e) {
76
- d = { ...d, ...e }, q();
79
+ function B(e) {
80
+ p = { ...p, ...e }, q();
77
81
  }
78
82
  function q() {
79
83
  for (const e of m) e();
80
84
  }
81
- function G(e, n, t, o, L) {
82
- var F;
83
- (F = e()) == null || F.abort();
84
- const k = new AbortController();
85
- n(k), o(k.signal).then(
85
+ function C(e, n, t, o, S) {
86
+ var E;
87
+ (E = e()) == null || E.abort();
88
+ const O = new AbortController();
89
+ n(O), o(O.signal).then(
86
90
  (K) => {
87
- e() === k && (n(null), L(K), g());
91
+ e() === O && (n(null), S(K), g());
88
92
  },
89
93
  (K) => {
90
- e() !== k || k.signal.aborted || (n(null), h || (h = t), S(K), g());
94
+ e() !== O || O.signal.aborted || (n(null), h || (h = t), T(K), g());
91
95
  }
92
96
  );
93
97
  }
94
- const H = [() => c, (e) => c = e, !0], X = [() => i, (e) => i = e, !1];
98
+ const H = [() => d, (e) => d = e, !0], X = [() => i, (e) => i = e, !1];
95
99
  function J() {
96
- const e = l;
100
+ const e = s;
97
101
  if (!e) return;
98
- const n = j(), t = f;
102
+ const n = j(), t = a;
99
103
  if (t)
100
- return G(...H, (o) => te(e, t, p, n, o), (o) => {
104
+ return C(...H, (o) => re(e, t, c, n, o), (o) => {
101
105
  b = o;
102
106
  });
103
- G(...H, (o) => re(e, p, n, o), (o) => {
104
- f = o.geometry, b = o.encoding, v = f && B ? U(f, B) : null;
107
+ C(...H, (o) => oe(e, c, n, o), (o) => {
108
+ a = o.geometry, b = o.encoding, v = a && N ? R(a, N) : null;
105
109
  });
106
110
  }
107
111
  function P() {
108
112
  i == null || i.abort(), i = null;
109
- const e = l;
110
- if (!e || y.length === 0) return;
111
- if (N === void 0) {
112
- B = null, v = null;
113
+ const e = s;
114
+ if (!e || l.length === 0) return;
115
+ if (F === void 0) {
116
+ N = null, v = null;
113
117
  return;
114
118
  }
115
- const n = N;
116
- G(...X, (t) => oe(e, y, n, t), (t) => {
117
- B = t, v = f ? U(f, t) : null;
119
+ const n = F;
120
+ C(...X, (t) => le(e, l, n, t), (t) => {
121
+ N = t, v = a ? R(a, t) : null;
118
122
  });
119
123
  }
120
- function A() {
121
- c == null || c.abort(), i == null || i.abort(), c = i = null, h = !1, f = b = v = B = null, T = [], y = [];
124
+ function $() {
125
+ d == null || d.abort(), i == null || i.abort(), d = i = null, h = !1, a = b = v = N = null, G = [], l = [];
122
126
  const e = { selection: null, focus: null, hovered: null, pinned: [] };
123
- if (!l) return g(e);
127
+ if (!s) return g(e);
124
128
  try {
125
- if (l.manifest.format !== "fossil/1") throw new Error(`the graph reads fossil/1, and this corpus is ${l.manifest.format}`);
126
- if (y = ne(l), y.length === 0) throw new Error("the corpus has no vertex type with a position to draw");
129
+ if (l = te(s), l.length === 0) throw new Y("graph/nothing-to-draw", "the corpus has no vertex type with a position to draw");
127
130
  } catch (n) {
128
- return h = !0, S(n), g(e);
131
+ return h = !0, T(n), g(e);
129
132
  }
130
133
  J(), P(), g(e);
131
134
  }
132
135
  function I(e) {
133
- if (l = null, u = ie(e) ? e : null, !u)
134
- return l = e, A();
135
- const n = u;
136
- A(), n.then(
136
+ if (s = null, y = se(e) ? e : null, !y)
137
+ return s = e, $();
138
+ const n = y;
139
+ $(), n.then(
137
140
  (t) => {
138
- u === n && (u = null, l = t, A());
141
+ y === n && (y = null, s = t, $());
139
142
  },
140
143
  (t) => {
141
- u === n && (u = null, h = !0, S(t), g());
144
+ y === n && (y = null, h = !0, T(t), g());
142
145
  }
143
146
  );
144
147
  }
@@ -147,12 +150,12 @@ function de(a) {
147
150
  const e = r.filterBy, n = () => {
148
151
  let t;
149
152
  try {
150
- t = e ? ee(e, s) : void 0;
153
+ t = e ? ne(e, f) : void 0;
151
154
  } catch (o) {
152
- S(o);
155
+ T(o);
153
156
  return;
154
157
  }
155
- le(t, N) || (N = t, P(), g());
158
+ ie(t, F) || (F = t, P(), g());
156
159
  };
157
160
  e && (e.addEventListener("value", n), w = () => e.removeEventListener("value", n)), n();
158
161
  }
@@ -163,66 +166,69 @@ function de(a) {
163
166
  * mounting everything twice.
164
167
  */
165
168
  subscribe(e) {
166
- if (m.add(e), !E && (E = !0, D(), l && !h && y.length > 0 && (!c && (!f || !b) && J(), !i && N !== void 0 && !B && P()), z !== null)) {
167
- const n = z;
168
- z = null, r.onFailure(n);
169
+ if (m.add(e), !z && (z = !0, D(), s && !h && l.length > 0 && (!d && (!a || !b) && J(), !i && F !== void 0 && !N && P()), L !== null)) {
170
+ const { error: n } = L;
171
+ L = null, r.onFailure(n);
169
172
  }
170
173
  return () => {
171
174
  m.delete(e), m.size === 0 && M.destroy();
172
175
  };
173
176
  },
174
- getSnapshot: () => d,
177
+ getSnapshot: () => p,
175
178
  getOptions: () => r,
176
179
  setOptions(e) {
177
180
  const n = r;
178
181
  r = e;
179
- const t = Q(e), o = t.category !== p.category || t.byTable !== p.byTable || t.size !== p.size || e.categories !== n.categories;
180
- if (p = t, e.corpus !== n.corpus) {
181
- I(e.corpus), E && e.filterBy !== n.filterBy && D();
182
+ const t = Q(e), o = t.category !== c.category || t.byTable !== c.byTable || t.size !== c.size || e.categories !== n.categories;
183
+ if (c = t, e.corpus !== n.corpus) {
184
+ I(e.corpus), z && e.filterBy !== n.filterBy && D();
182
185
  return;
183
186
  }
184
- E && e.filterBy !== n.filterBy && D(), o && J(), g();
187
+ z && e.filterBy !== n.filterBy && D(), o && J(), g();
185
188
  },
186
189
  destroy() {
187
- E = !1, w == null || w(), w = null, c == null || c.abort(), i == null || i.abort(), c = i = null, m.clear();
190
+ z = !1, w == null || w(), w = null, d == null || d.abort(), i == null || i.abort(), d = i = null, m.clear();
188
191
  },
189
192
  select(e, n = "node", t = "") {
190
- var k, F;
193
+ var O, E;
191
194
  const o = e && e.length > 0 ? { vertices: [...e], source: n, label: t } : null;
192
- O({ selection: o }), (k = r.onSelect) == null || k.call(r, o);
193
- const L = (F = y[0]) == null ? void 0 : F.key;
194
- r.filterBy && L && x(r.filterBy, s, L, o ? o.vertices : null);
195
+ B({ selection: o }), (O = r.onSelect) == null || O.call(r, o);
196
+ const S = (E = l[0]) == null ? void 0 : E.key;
197
+ r.filterBy && S && ee(r.filterBy, f, S, o ? o.vertices : null);
195
198
  },
196
199
  focus(e) {
197
200
  var n;
198
- e !== d.focus && (O({ focus: e }), (n = r.onFocus) == null || n.call(r, e));
201
+ e !== p.focus && (B({ focus: e }), (n = r.onFocus) == null || n.call(r, e));
199
202
  },
200
203
  hover(e) {
201
- e !== d.hovered && O({ hovered: e });
204
+ e !== p.hovered && B({ hovered: e });
202
205
  },
203
206
  pin(e) {
204
- O({ pinned: [...e] });
207
+ B({ pinned: [...e] });
205
208
  },
206
209
  setTool(e) {
207
- e !== d.tool && O({ tool: e });
210
+ e !== p.tool && B({ tool: e });
208
211
  },
209
212
  report(e) {
210
- e !== d.motion && O({ motion: e });
213
+ e !== p.motion && B({ motion: e });
211
214
  },
212
215
  reportProgress(e) {
213
- e !== d.progress && O({ progress: e });
216
+ e !== p.progress && B({ progress: e });
214
217
  },
215
- setRenderable(e) {
216
- _ !== !e && (_ = !e, g());
218
+ renderable() {
219
+ k && (k = !1, g());
220
+ },
221
+ unrenderable(e) {
222
+ k = !0, T(e), g();
217
223
  },
218
224
  reportDrawn(e) {
219
225
  const n = [e.geometry, e.encoding, e.mask];
220
- n.every((t, o) => t === T[o]) || (T = n, g());
226
+ n.every((t, o) => t === G[o]) || (G = n, g());
221
227
  }
222
228
  };
223
- return I(a.corpus), R = !1, M;
229
+ return I(u.corpus), U = !1, M;
224
230
  }
225
231
  export {
226
- de as createGraph
232
+ ye as createGraph
227
233
  };
228
234
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf } from \"./channels\";\nimport type { Corpus, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { drawnTables, loadEncoding, loadGraph, maskOf, readKept, type Encoding, type Geometry, type Kept } from \"./load\";\nimport type { Drawn, GraphOptions, GraphSnapshot, GraphStatus, GraphStore } from \"./state\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore } from \"./state\";\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\nfunction drawnOf(geometry: Geometry, encoding: Encoding, mask: Uint8Array | null): Drawn {\n const tally = encoding.domain.map(() => 0);\n let vertices = 0;\n for (let id = 0; id < geometry.size; id++) {\n if ((mask && !mask[id]) || Number.isNaN(geometry.positions[id * 2])) continue;\n vertices++;\n const rank = encoding.ranks[id] as number;\n tally[rank] = (tally[rank] ?? 0) + 1;\n }\n return { vertices, domain: encoding.domain, tally };\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 tables: readonly VertexTable[] = [];\n let binding = bindingOf(initial);\n let filter: Filter | undefined;\n let loading: AbortController | null = null;\n let filtering: AbortController | null = null;\n let geometry: Geometry | null = null;\n let encoding: Encoding | null = null;\n let kept: Kept | null = null;\n let mask: Uint8Array | null = null;\n let uploaded: readonly unknown[] = [];\n let unlisten: (() => void) | null = null;\n let active = false;\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.\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 let snapshot: GraphSnapshot = {\n status: \"none\",\n total: undefined,\n drawn: null,\n domain: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n options,\n corpus: null,\n binding,\n geometry: null,\n encoding: null,\n mask: null,\n };\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [tables, binding.byTable, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(tables, binding, options.categories) };\n return domain.value;\n }\n\n let drawn: { key: unknown[]; value: Drawn | null } = { key: [], value: null };\n function drawnNow(): Drawn | null {\n const key = [geometry, encoding, mask];\n if (key.some((part, i) => part !== drawn.key[i])) {\n drawn = { key, value: geometry && encoding ? drawnOf(geometry, encoding, mask) : null };\n }\n return drawn.value;\n }\n\n function statusOf(): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n const current = [geometry, encoding, mask];\n const shown = geometry !== null && current.every((part, i) => part === uploaded[i]);\n return loading || filtering || !shown ? \"loading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n snapshot = {\n ...snapshot,\n total: corpus ? tables.reduce((sum, table) => sum + table.record_count, 0) : undefined,\n drawn: drawnNow(),\n domain: domainNow(),\n options,\n corpus,\n binding,\n geometry,\n encoding,\n mask,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf() };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — derives nothing. */\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 /**\n * One read in flight per kind, and a newer ask aborts the older one's statements. A load that\n * fails leaves nothing to draw; a filter that fails leaves the last picture.\n */\n function run<T>(\n current: () => AbortController | null,\n set: (aborter: AbortController | null) => void,\n fatal: boolean,\n read: (signal: AbortSignal) => Promise<T>,\n done: (value: T) => void,\n ): void {\n current()?.abort();\n const aborter = new AbortController();\n set(aborter);\n read(aborter.signal).then(\n (value) => {\n if (current() !== aborter) return;\n set(null);\n done(value);\n notify();\n },\n (error: unknown) => {\n // An aborted read is one this store cancelled, not a failure of the corpus.\n if (current() !== aborter || aborter.signal.aborted) return;\n set(null);\n failed ||= fatal;\n fail(error);\n notify();\n },\n );\n }\n\n const asLoad = [() => loading, (a: AbortController | null) => (loading = a), true] as const;\n const asFilter = [() => filtering, (a: AbortController | null) => (filtering = a), false] as const;\n\n function load(): void {\n const open = corpus;\n if (!open) return;\n const seed = domainNow();\n const given = geometry;\n if (given) {\n return run(...asLoad, (signal) => loadEncoding(open, given, binding, seed, signal), (next) => {\n encoding = next;\n });\n }\n run(...asLoad, (signal) => loadGraph(open, binding, seed, signal), (next) => {\n geometry = next.geometry;\n encoding = next.encoding;\n mask = geometry && kept ? maskOf(geometry, kept) : null;\n });\n }\n\n function refilter(): void {\n filtering?.abort();\n filtering = null;\n const open = corpus;\n if (!open || tables.length === 0) return;\n if (filter === undefined) {\n kept = null;\n mask = null;\n return;\n }\n const given = filter;\n run(...asFilter, (signal) => readKept(open, tables, given, signal), (next) => {\n kept = next;\n mask = geometry ? maskOf(geometry, next) : null;\n });\n }\n\n function reopen(): void {\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n failed = false;\n geometry = encoding = mask = kept = null;\n uploaded = [];\n tables = [];\n const cleared = { selection: null, focus: null, hovered: null, pinned: [] };\n if (!corpus) return notify(cleared);\n try {\n if (corpus.manifest.format !== \"fossil/1\") throw new Error(`the graph reads fossil/1, and this corpus is ${corpus.manifest.format}`);\n tables = drawnTables(corpus);\n if (tables.length === 0) throw new Error(\"the corpus has no vertex type with a position to draw\");\n } catch (error) {\n failed = true;\n fail(error);\n return notify(cleared);\n }\n load();\n refilter();\n notify(cleared);\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 changed = () => {\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 refilter();\n notify();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", changed);\n unlisten = () => crossfilter.removeEventListener(\"value\", changed);\n }\n changed();\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 * graph 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 // StrictMode unsubscribes and subscribes again: what the unsubscribe cancelled starts over.\n if (corpus && !failed && tables.length > 0) {\n if (!loading && (!geometry || !encoding)) load();\n if (!filtering && filter !== undefined && !kept) refilter();\n }\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.byTable !== binding.byTable ||\n nextBinding.size !== binding.size ||\n next.categories !== previous.categories;\n binding = nextBinding;\n if (next.corpus !== previous.corpus) {\n adopt(next.corpus);\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) load();\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n listeners.clear();\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 const key = tables[0]?.key;\n if (options.filterBy && key) publish(options.filterBy, self, key, selection ? selection.vertices : 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(drawnSnapshot) {\n const next = [drawnSnapshot.geometry, drawnSnapshot.encoding, drawnSnapshot.mask];\n if (next.every((part, i) => part === uploaded[i])) return;\n uploaded = next;\n notify();\n },\n };\n\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["sameFilter","b","_","v","isPromise","value","drawnOf","geometry","encoding","mask","tally","vertices","id","rank","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","tables","binding","bindingOf","filter","loading","filtering","kept","uploaded","unlisten","active","building","held","fail","error","message","snapshot","domain","domainNow","key","part","i","domainOf","drawn","drawnNow","statusOf","shown","notify","fields","sum","table","emit","patch","listener","run","current","set","fatal","read","done","_a","aborter","asLoad","a","asFilter","load","open","seed","given","signal","loadEncoding","next","loadGraph","maskOf","refilter","readKept","reopen","cleared","drawnTables","adopt","promised","opened","listen","crossfilter","changed","filterFor","store","previous","nextBinding","rebound","source","label","selection","_b","publish","vertex","tool","motion","renderable","drawnSnapshot"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import { GraphError } from \"./error\";\nimport type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf } from \"./channels\";\nimport type { Corpus, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { drawnTables, loadEncoding, loadGraph, maskOf, readKept, type Encoding, type Geometry, type Kept } from \"./load\";\nimport type { Drawn, GraphOptions, GraphSnapshot, GraphStatus, GraphStore } from \"./state\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore } from \"./state\";\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\nfunction drawnOf(geometry: Geometry, encoding: Encoding, mask: Uint8Array | null): Drawn {\n const tally = encoding.domain.map(() => 0);\n const shown = new Uint8Array(geometry.size);\n let vertices = 0;\n for (let id = 0; id < geometry.size; id++) {\n if ((mask && !mask[id]) || Number.isNaN(geometry.positions[id * 2])) continue;\n shown[id] = 1;\n vertices++;\n const rank = encoding.ranks[id] as number;\n tally[rank] = (tally[rank] ?? 0) + 1;\n }\n let edges = 0;\n const { links } = geometry;\n for (let i = 0; i < links.length; i += 2) {\n if (shown[links[i] as number] && shown[links[i + 1] as number]) edges++;\n }\n return { vertices, edges, domain: encoding.domain, tally };\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 tables: readonly VertexTable[] = [];\n let binding = bindingOf(initial);\n let filter: Filter | undefined;\n let loading: AbortController | null = null;\n let filtering: AbortController | null = null;\n let geometry: Geometry | null = null;\n let encoding: Encoding | null = null;\n let kept: Kept | null = null;\n let mask: Uint8Array | null = null;\n let uploaded: readonly unknown[] = [];\n let unlisten: (() => void) | null = null;\n let active = false;\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.\n let building = true;\n let held: { error: unknown } | null = null;\n const fail = (error: unknown) => {\n if (building) held = { error };\n else options.onFailure(error);\n };\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n total: undefined,\n drawn: null,\n domain: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n options,\n corpus: null,\n binding,\n geometry: null,\n encoding: null,\n mask: null,\n };\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [tables, binding.byTable, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(tables, binding, options.categories) };\n return domain.value;\n }\n\n let drawn: { key: unknown[]; value: Drawn | null } = { key: [], value: null };\n function drawnNow(): Drawn | null {\n const key = [geometry, encoding, mask];\n if (key.some((part, i) => part !== drawn.key[i])) {\n drawn = { key, value: geometry && encoding ? drawnOf(geometry, encoding, mask) : null };\n }\n return drawn.value;\n }\n\n function statusOf(): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n const current = [geometry, encoding, mask];\n const shown = geometry !== null && current.every((part, i) => part === uploaded[i]);\n return loading || filtering || !shown ? \"loading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n snapshot = {\n ...snapshot,\n total: corpus ? tables.reduce((sum, table) => sum + table.record_count, 0) : undefined,\n drawn: drawnNow(),\n domain: domainNow(),\n options,\n corpus,\n binding,\n geometry,\n encoding,\n mask,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf() };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — derives nothing. */\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 /**\n * One read in flight per kind, and a newer ask aborts the older one's statements. A load that\n * fails leaves nothing to draw; a filter that fails leaves the last picture.\n */\n function run<T>(\n current: () => AbortController | null,\n set: (aborter: AbortController | null) => void,\n fatal: boolean,\n read: (signal: AbortSignal) => Promise<T>,\n done: (value: T) => void,\n ): void {\n current()?.abort();\n const aborter = new AbortController();\n set(aborter);\n read(aborter.signal).then(\n (value) => {\n if (current() !== aborter) return;\n set(null);\n done(value);\n notify();\n },\n (error: unknown) => {\n // An aborted read is one this store cancelled, not a failure of the corpus.\n if (current() !== aborter || aborter.signal.aborted) return;\n set(null);\n failed ||= fatal;\n fail(error);\n notify();\n },\n );\n }\n\n const asLoad = [() => loading, (a: AbortController | null) => (loading = a), true] as const;\n const asFilter = [() => filtering, (a: AbortController | null) => (filtering = a), false] as const;\n\n function load(): void {\n const open = corpus;\n if (!open) return;\n const seed = domainNow();\n const given = geometry;\n if (given) {\n return run(...asLoad, (signal) => loadEncoding(open, given, binding, seed, signal), (next) => {\n encoding = next;\n });\n }\n run(...asLoad, (signal) => loadGraph(open, binding, seed, signal), (next) => {\n geometry = next.geometry;\n encoding = next.encoding;\n mask = geometry && kept ? maskOf(geometry, kept) : null;\n });\n }\n\n function refilter(): void {\n filtering?.abort();\n filtering = null;\n const open = corpus;\n if (!open || tables.length === 0) return;\n if (filter === undefined) {\n kept = null;\n mask = null;\n return;\n }\n const given = filter;\n run(...asFilter, (signal) => readKept(open, tables, given, signal), (next) => {\n kept = next;\n mask = geometry ? maskOf(geometry, next) : null;\n });\n }\n\n function reopen(): void {\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n failed = false;\n geometry = encoding = mask = kept = null;\n uploaded = [];\n tables = [];\n const cleared = { selection: null, focus: null, hovered: null, pinned: [] };\n if (!corpus) return notify(cleared);\n try {\n tables = drawnTables(corpus);\n if (tables.length === 0) throw new GraphError(\"graph/nothing-to-draw\", \"the corpus has no vertex type with a position to draw\");\n } catch (error) {\n failed = true;\n fail(error);\n return notify(cleared);\n }\n load();\n refilter();\n notify(cleared);\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 changed = () => {\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 refilter();\n notify();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", changed);\n unlisten = () => crossfilter.removeEventListener(\"value\", changed);\n }\n changed();\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 * graph 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 // StrictMode unsubscribes and subscribes again: what the unsubscribe cancelled starts over.\n if (corpus && !failed && tables.length > 0) {\n if (!loading && (!geometry || !encoding)) load();\n if (!filtering && filter !== undefined && !kept) refilter();\n }\n if (held !== null) {\n const { error } = held;\n held = null;\n options.onFailure(error);\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.byTable !== binding.byTable ||\n nextBinding.size !== binding.size ||\n next.categories !== previous.categories;\n binding = nextBinding;\n if (next.corpus !== previous.corpus) {\n adopt(next.corpus);\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) load();\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n listeners.clear();\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 const key = tables[0]?.key;\n if (options.filterBy && key) publish(options.filterBy, self, key, selection ? selection.vertices : 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 renderable() {\n if (!unrenderable) return;\n unrenderable = false;\n notify();\n },\n unrenderable(error) {\n unrenderable = true;\n fail(error);\n notify();\n },\n reportDrawn(drawnSnapshot) {\n const next = [drawnSnapshot.geometry, drawnSnapshot.encoding, drawnSnapshot.mask];\n if (next.every((part, i) => part === uploaded[i])) return;\n uploaded = next;\n notify();\n },\n };\n\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["sameFilter","a","b","_","v","isPromise","value","drawnOf","geometry","encoding","mask","tally","shown","vertices","id","rank","edges","links","i","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","tables","binding","bindingOf","filter","loading","filtering","kept","uploaded","unlisten","active","building","held","fail","error","snapshot","domain","domainNow","key","part","domainOf","drawn","drawnNow","statusOf","notify","fields","sum","table","emit","patch","listener","run","current","set","fatal","read","done","_a","aborter","asLoad","asFilter","load","open","seed","given","signal","loadEncoding","next","loadGraph","maskOf","refilter","readKept","reopen","cleared","drawnTables","GraphError","adopt","promised","opened","listen","crossfilter","changed","filterFor","store","previous","nextBinding","rebound","source","label","selection","_b","publish","vertex","tool","motion","drawnSnapshot"],"mappings":"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"}
@@ -22,9 +22,9 @@ export type VertexId = number;
22
22
  /**
23
23
  * The selection tools, and the gesture that reaches them without a mode.
24
24
  *
25
- * `null` is the reading posture: drag pans, drag on a node pins it. Picking a tool swaps the drag
26
- * for a selection gesture — and holding Shift borrows the marquee for one drag without picking
27
- * anything, which is how most selections actually get made.
25
+ * `null` is the reading posture: drag pans, and drag on a node moves it — and pins it while a layout
26
+ * runs. Picking a tool swaps the drag for a selection gesture — and holding Shift borrows the marquee
27
+ * for one drag without picking anything, which is how most selections actually get made.
28
28
  */
29
29
  export type Tool = "rect" | "lasso" | null;
30
30
  /** `settled` converged on its own; `paused` is waiting for you. */
@@ -59,7 +59,7 @@ export interface GraphCommands {
59
59
  pause(): void;
60
60
  resume(): void;
61
61
  restart(): void;
62
- /** Let go of every pinned node, so the simulation gets the whole layout back. */
62
+ /** Let go of every pinned node and reheat the layout, so the released nodes flow back into place. */
63
63
  unpin(): void;
64
64
  /** Centre and select one vertex. */
65
65
  reveal(vertex: VertexId): void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE3C,mEAAmE;AACnE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,IAAI,IAAI,CAAC;IACZ,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,iFAAiF;IACjF,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,cAAc,IAAI,IAAI,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE3C,mEAAmE;AACnE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,IAAI,IAAI,CAAC;IACZ,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,qGAAqG;IACrG,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,cAAc,IAAI,IAAI,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;CACf"}
package/dist/index.d.ts CHANGED
@@ -12,8 +12,9 @@
12
12
  * - `react/` — `useGraph`, `GraphRoot`, `GraphRootProvider`, `useGraphContext`: Ark's four; and
13
13
  * `useGraphState`, TanStack Store's selector, because the api is commands and the state moves at
14
14
  * frame rate.
15
- * - `parts/` — `GraphCanvas`, `GraphLegend`, `GraphToolbar`, `GraphInspector`: flat parts over the
16
- * one context. They own the vocabulary; the root's callbacks are the host's policy.
15
+ * - `parts/` — `GraphCanvas`, `GraphLegend`, `GraphCounts`, `GraphToolbar`, `GraphInspector`,
16
+ * `GraphSearch`: flat parts over the one context; and `GraphLooks`, the picture's preferences,
17
+ * which needs only the theme provider. They own the vocabulary; the root's callbacks are the host's policy.
17
18
  *
18
19
  * **Why a package and not `@kanzo-tech/ui`.** The first admission rule is *domain-free — nothing
19
20
  * about RDF / SHACL / fossil / graphs / auth*. Graphs are excluded by name, and a sibling package is
@@ -25,14 +26,18 @@ export { useGraphState } from './react/use-graph-state';
25
26
  export { useGraphPrefs } from './react/use-graph-prefs';
26
27
  export { GraphCanvas, type GraphCanvasProps } from './parts/graph-canvas';
27
28
  export { GraphLegend, type GraphLegendProps } from './parts/graph-legend';
29
+ export { GraphCounts, type GraphCountsProps } from './parts/graph-counts';
28
30
  export { GraphToolbar, type GraphToolbarProps } from './parts/graph-toolbar';
29
31
  export { GraphInspector, type GraphInspectorProps } from './parts/graph-inspector';
32
+ export { GraphSearch, type GraphSearchProps } from './parts/graph-search';
33
+ export { GraphLooks, type GraphLooksProps } from './parts/graph-looks';
30
34
  export { ShapeGlyph, type ShapeGlyphProps } from './parts/shape-glyph';
31
- export { lookFrom, type Look, type LookPatch, type Shape } from './render/graph-looks';
35
+ export { lookFrom, type Look, type LookPatch, type LookPreset, type Shape } from './render/graph-looks';
32
36
  export { simFrom, type Sim } from './render/graph-sim';
33
37
  export { scaleOf } from './render/graph-model';
34
38
  export type { Channels } from './core/channels';
35
39
  export type { GraphCommands, Motion, Selection, SelectionSource, Tool, VertexId } from './core/types';
36
40
  export type { Drawn, GraphState, GraphStatus } from './core/state';
37
41
  export type { VertexDetail } from './core/detail';
42
+ export { GraphError } from './core/error';
38
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAIvE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtG,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAIvE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtG,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,29 +1,37 @@
1
- import { GraphRoot as e, GraphRootProvider as p, useGraphContext as t } from "./react/graph-root.js";
1
+ import { GraphRoot as p, GraphRootProvider as e, useGraphContext as t } from "./react/graph-root.js";
2
2
  import { useGraph as m } from "./react/use-graph.js";
3
- import { useGraphState as x } from "./react/use-graph-state.js";
3
+ import { useGraphState as h } from "./react/use-graph-state.js";
4
4
  import { useGraphPrefs as G } from "./react/use-graph-prefs.js";
5
- import { GraphCanvas as l } from "./parts/graph-canvas.js";
6
- import { GraphLegend as u } from "./parts/graph-legend.js";
5
+ import { GraphCanvas as n } from "./parts/graph-canvas.js";
6
+ import { GraphLegend as l } from "./parts/graph-legend.js";
7
+ import { GraphCounts as C } from "./parts/graph-counts.js";
7
8
  import { GraphToolbar as d } from "./parts/graph-toolbar.js";
8
- import { GraphInspector as v } from "./parts/graph-inspector.js";
9
- import { ShapeGlyph as F } from "./parts/shape-glyph.js";
10
- import { lookFrom as R } from "./render/graph-looks.js";
11
- import { simFrom as b } from "./render/graph-sim.js";
12
- import { scaleOf as k } from "./render/graph-model.js";
9
+ import { GraphInspector as k } from "./parts/graph-inspector.js";
10
+ import { GraphSearch as F } from "./parts/graph-search.js";
11
+ import { GraphLooks as P } from "./parts/graph-looks.js";
12
+ import { ShapeGlyph as b } from "./parts/shape-glyph.js";
13
+ import { lookFrom as y } from "./render/graph-looks.js";
14
+ import { simFrom as I } from "./render/graph-sim.js";
15
+ import { scaleOf as T } from "./render/graph-model.js";
16
+ import { GraphError as q } from "./core/error.js";
13
17
  export {
14
- l as GraphCanvas,
15
- v as GraphInspector,
16
- u as GraphLegend,
17
- e as GraphRoot,
18
- p as GraphRootProvider,
18
+ n as GraphCanvas,
19
+ C as GraphCounts,
20
+ q as GraphError,
21
+ k as GraphInspector,
22
+ l as GraphLegend,
23
+ P as GraphLooks,
24
+ p as GraphRoot,
25
+ e as GraphRootProvider,
26
+ F as GraphSearch,
19
27
  d as GraphToolbar,
20
- F as ShapeGlyph,
21
- R as lookFrom,
22
- k as scaleOf,
23
- b as simFrom,
28
+ b as ShapeGlyph,
29
+ y as lookFrom,
30
+ T as scaleOf,
31
+ I as simFrom,
24
32
  m as useGraph,
25
33
  t as useGraphContext,
26
34
  G as useGraphPrefs,
27
- x as useGraphState
35
+ h as useGraphState
28
36
  };
29
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}