@graview/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +20 -0
  3. package/dist/activity.d.ts +113 -0
  4. package/dist/activity.d.ts.map +1 -0
  5. package/dist/activity.js +207 -0
  6. package/dist/activity.js.map +1 -0
  7. package/dist/animation.d.ts +64 -0
  8. package/dist/animation.d.ts.map +1 -0
  9. package/dist/animation.js +245 -0
  10. package/dist/animation.js.map +1 -0
  11. package/dist/captions.d.ts +43 -0
  12. package/dist/captions.d.ts.map +1 -0
  13. package/dist/captions.js +61 -0
  14. package/dist/captions.js.map +1 -0
  15. package/dist/channels.d.ts +15 -0
  16. package/dist/channels.d.ts.map +1 -0
  17. package/dist/channels.js +114 -0
  18. package/dist/channels.js.map +1 -0
  19. package/dist/connectors.d.ts +176 -0
  20. package/dist/connectors.d.ts.map +1 -0
  21. package/dist/connectors.js +837 -0
  22. package/dist/connectors.js.map +1 -0
  23. package/dist/context.d.ts +348 -0
  24. package/dist/context.d.ts.map +1 -0
  25. package/dist/context.js +568 -0
  26. package/dist/context.js.map +1 -0
  27. package/dist/drawn.d.ts +60 -0
  28. package/dist/drawn.d.ts.map +1 -0
  29. package/dist/drawn.js +58 -0
  30. package/dist/drawn.js.map +1 -0
  31. package/dist/edge-signs.d.ts +13 -0
  32. package/dist/edge-signs.d.ts.map +1 -0
  33. package/dist/edge-signs.js +76 -0
  34. package/dist/edge-signs.js.map +1 -0
  35. package/dist/hooks.d.ts +160 -0
  36. package/dist/hooks.d.ts.map +1 -0
  37. package/dist/hooks.js +457 -0
  38. package/dist/hooks.js.map +1 -0
  39. package/dist/index.d.ts +37 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +22 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/keyboard.d.ts +5 -0
  44. package/dist/keyboard.d.ts.map +1 -0
  45. package/dist/keyboard.js +178 -0
  46. package/dist/keyboard.js.map +1 -0
  47. package/dist/kit.d.ts +10 -0
  48. package/dist/kit.d.ts.map +1 -0
  49. package/dist/kit.js +32 -0
  50. package/dist/kit.js.map +1 -0
  51. package/dist/local-intelligence.d.ts +31 -0
  52. package/dist/local-intelligence.d.ts.map +1 -0
  53. package/dist/local-intelligence.js +66 -0
  54. package/dist/local-intelligence.js.map +1 -0
  55. package/dist/motion.d.ts +17 -0
  56. package/dist/motion.d.ts.map +1 -0
  57. package/dist/motion.js +26 -0
  58. package/dist/motion.js.map +1 -0
  59. package/dist/occupants.d.ts +45 -0
  60. package/dist/occupants.d.ts.map +1 -0
  61. package/dist/occupants.js +57 -0
  62. package/dist/occupants.js.map +1 -0
  63. package/dist/parallel.d.ts +19 -0
  64. package/dist/parallel.d.ts.map +1 -0
  65. package/dist/parallel.js +30 -0
  66. package/dist/parallel.js.map +1 -0
  67. package/dist/picking.d.ts +30 -0
  68. package/dist/picking.d.ts.map +1 -0
  69. package/dist/picking.js +140 -0
  70. package/dist/picking.js.map +1 -0
  71. package/dist/plots.d.ts +106 -0
  72. package/dist/plots.d.ts.map +1 -0
  73. package/dist/plots.js +306 -0
  74. package/dist/plots.js.map +1 -0
  75. package/dist/pointer.d.ts +27 -0
  76. package/dist/pointer.d.ts.map +1 -0
  77. package/dist/pointer.js +39 -0
  78. package/dist/pointer.js.map +1 -0
  79. package/dist/presence.d.ts +110 -0
  80. package/dist/presence.d.ts.map +1 -0
  81. package/dist/presence.js +280 -0
  82. package/dist/presence.js.map +1 -0
  83. package/dist/rails.d.ts +11 -0
  84. package/dist/rails.d.ts.map +1 -0
  85. package/dist/rails.js +15 -0
  86. package/dist/rails.js.map +1 -0
  87. package/dist/resolved-view.d.ts +78 -0
  88. package/dist/resolved-view.d.ts.map +1 -0
  89. package/dist/resolved-view.js +365 -0
  90. package/dist/resolved-view.js.map +1 -0
  91. package/dist/robot.d.ts +114 -0
  92. package/dist/robot.d.ts.map +1 -0
  93. package/dist/robot.js +93 -0
  94. package/dist/robot.js.map +1 -0
  95. package/dist/routes.d.ts +50 -0
  96. package/dist/routes.d.ts.map +1 -0
  97. package/dist/routes.js +150 -0
  98. package/dist/routes.js.map +1 -0
  99. package/dist/scene-camera.d.ts +25 -0
  100. package/dist/scene-camera.d.ts.map +1 -0
  101. package/dist/scene-camera.js +130 -0
  102. package/dist/scene-camera.js.map +1 -0
  103. package/dist/scene-hand.d.ts +110 -0
  104. package/dist/scene-hand.d.ts.map +1 -0
  105. package/dist/scene-hand.js +317 -0
  106. package/dist/scene-hand.js.map +1 -0
  107. package/dist/scene-helpers.d.ts +46 -0
  108. package/dist/scene-helpers.d.ts.map +1 -0
  109. package/dist/scene-helpers.js +108 -0
  110. package/dist/scene-helpers.js.map +1 -0
  111. package/dist/scene-lines.d.ts +76 -0
  112. package/dist/scene-lines.d.ts.map +1 -0
  113. package/dist/scene-lines.js +578 -0
  114. package/dist/scene-lines.js.map +1 -0
  115. package/dist/scene-root.d.ts +71 -0
  116. package/dist/scene-root.d.ts.map +1 -0
  117. package/dist/scene-root.js +790 -0
  118. package/dist/scene-root.js.map +1 -0
  119. package/dist/scene.d.ts +17 -0
  120. package/dist/scene.d.ts.map +1 -0
  121. package/dist/scene.js +17 -0
  122. package/dist/scene.js.map +1 -0
  123. package/dist/seat-marks.d.ts +35 -0
  124. package/dist/seat-marks.d.ts.map +1 -0
  125. package/dist/seat-marks.js +43 -0
  126. package/dist/seat-marks.js.map +1 -0
  127. package/dist/settings.d.ts +30 -0
  128. package/dist/settings.d.ts.map +1 -0
  129. package/dist/settings.js +73 -0
  130. package/dist/settings.js.map +1 -0
  131. package/dist/view-boundary.d.ts +33 -0
  132. package/dist/view-boundary.d.ts.map +1 -0
  133. package/dist/view-boundary.js +53 -0
  134. package/dist/view-boundary.js.map +1 -0
  135. package/dist/view-host.d.ts +57 -0
  136. package/dist/view-host.d.ts.map +1 -0
  137. package/dist/view-host.js +474 -0
  138. package/dist/view-host.js.map +1 -0
  139. package/dist/view-registry.d.ts +122 -0
  140. package/dist/view-registry.d.ts.map +1 -0
  141. package/dist/view-registry.js +20 -0
  142. package/dist/view-registry.js.map +1 -0
  143. package/dist/where-drawn.d.ts +151 -0
  144. package/dist/where-drawn.d.ts.map +1 -0
  145. package/dist/where-drawn.js +231 -0
  146. package/dist/where-drawn.js.map +1 -0
  147. package/package.json +60 -0
package/dist/hooks.js ADDED
@@ -0,0 +1,457 @@
1
+ import { aggregateId, edgeOfSelection, fromUrl, kindsOf, toggleExpanded, toUrl, withFocus, withRelation, withZoom, sameView, EMPTY_VIEW, withJackIn, } from "@graview/layout";
2
+ import { applyAffordance, deriveAffordances, editableFields, previewAffordance, } from "@graview/tools";
3
+ import { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
4
+ import { useFound, useGraph, useGraview } from "./context.js";
5
+ /** The current selection, and the ways an interface changes it. */
6
+ export function useSelection() {
7
+ const { selection, setSelection } = useGraview();
8
+ return useMemo(() => ({
9
+ selection,
10
+ set: (ids) => setSelection(ids),
11
+ clear: () => setSelection([]),
12
+ toggle: (id) => setSelection((current) => current.includes(id) ? current.filter((other) => other !== id) : [...current, id]),
13
+ isSelected: (id) => selection.includes(id),
14
+ }), [selection, setSelection]);
15
+ }
16
+ /**
17
+ * Everything currently broken, recomputed whenever the graph changes.
18
+ *
19
+ * The invariant engine has always known this and the interface only ever
20
+ * showed it to someone who happened to select an implicated node. An
21
+ * agreement nobody can see the state of is not an agreement anyone is
22
+ * keeping — "is anything wrong?" is the first question a person asks of a
23
+ * week, and it should never require hunting for it.
24
+ */
25
+ export function useViolations() {
26
+ const { store } = useGraview();
27
+ const nodes = useGraph();
28
+ // `nodes` changes with the graph, so a re-render after an edit asks again.
29
+ return useMemo(() => violationsOf(store), [store, nodes]);
30
+ }
31
+ const evaluated = new WeakMap();
32
+ function violationsOf(store) {
33
+ let entry = evaluated.get(store);
34
+ if (!entry) {
35
+ const fresh = { violations: null };
36
+ // Cleared inside the store's notify, before React renders anything that asks again.
37
+ store.subscribe(() => {
38
+ fresh.violations = null;
39
+ });
40
+ evaluated.set(store, fresh);
41
+ entry = fresh;
42
+ }
43
+ entry.violations ??= store.violations();
44
+ return entry.violations;
45
+ }
46
+ /** Ids implicated in some current violation, for marking them in place. */
47
+ export function useFlagged() {
48
+ const violations = useViolations();
49
+ return useMemo(() => [...new Set(violations.flatMap((violation) => violation.nodeIds))], [violations]);
50
+ }
51
+ /**
52
+ * Everything the selection reaches: the selected nodes, plus everything one
53
+ * edge away from them.
54
+ *
55
+ * Selecting a person and having the week sit there unchanged is the same
56
+ * failure as clicking an event and getting an empty plane — the graph knows
57
+ * which five events that person is in, and the calendar is right there
58
+ * drawing all eighteen of them. A view that receives this can say so in its
59
+ * own idiom: a calendar lights up the spans, a roster rings the chips.
60
+ *
61
+ * Empty when nothing is selected, which every view must read as "no
62
+ * emphasis" rather than "nothing is related".
63
+ */
64
+ export function useImplicated() {
65
+ const reachedBySelection = useReached();
66
+ const found = useFound();
67
+ /*
68
+ * AND WHAT THE WORDS FIND. A search lights its hits in whatever picture
69
+ * is open, through the same set every view already dims by — so a lens
70
+ * learns nothing new to take part. Words that find nothing dim it all:
71
+ * the one id nothing is called keeps the set non-empty.
72
+ */
73
+ return useMemo(() => {
74
+ if (!found)
75
+ return reachedBySelection;
76
+ // Every match, not the strip's capped index: a real hit is never drawn dimmed.
77
+ const hits = found.matched;
78
+ if (hits.length === 0 && reachedBySelection.length === 0)
79
+ return [NOTHING_FOUND];
80
+ return [...new Set([...reachedBySelection, ...hits])];
81
+ }, [found, reachedBySelection]);
82
+ }
83
+ /**
84
+ * What the SELECTION alone reaches — `useImplicated` without the search.
85
+ * For the one reading that must not confuse the two: a district's "tied"
86
+ * count is about what you picked, not what you typed.
87
+ */
88
+ export function useReached() {
89
+ const { store, selection } = useGraview();
90
+ const nodes = useGraph();
91
+ return useMemo(() => {
92
+ if (selection.length === 0)
93
+ return [];
94
+ const chosen = new Set(selection);
95
+ const reached = new Set(chosen);
96
+ for (const edge of store.graph.allEdges()) {
97
+ if (chosen.has(edge.from))
98
+ reached.add(edge.to);
99
+ if (chosen.has(edge.to))
100
+ reached.add(edge.from);
101
+ }
102
+ /*
103
+ * What a selected thing JUDGES, as well as what it touches.
104
+ *
105
+ * A rule has no edges, so selecting one reached nothing and the screen
106
+ * did not change — it read as broken. What a rule is about is derivable
107
+ * from its violations, which name the nodes they implicate, so selecting
108
+ * one now lights those wherever they are drawn.
109
+ */
110
+ for (const violation of store.violations()) {
111
+ if (violation.subjectId !== undefined && chosen.has(violation.subjectId)) {
112
+ for (const id of violation.nodeIds)
113
+ reached.add(id);
114
+ }
115
+ }
116
+ return [...reached];
117
+ }, [store, selection, nodes]);
118
+ }
119
+ /** Stands in the implicated set when a search found nothing, so every view dims. */
120
+ export const NOTHING_FOUND = "search:nothing";
121
+ /**
122
+ * What can be done with the current selection, recomputed whenever the
123
+ * selection or the graph changes.
124
+ *
125
+ * Derivation is cheap enough to run on every selection change — measured
126
+ * under a millisecond on the household example's whole graph — so there is no cache to go
127
+ * stale and no "refresh actions" button.
128
+ */
129
+ export function useAffordances(options = {}) {
130
+ const { store, selection: chosen, principal, providers } = useGraview();
131
+ const { about, ...rest } = options;
132
+ const selection = about ?? chosen;
133
+ const nodes = useGraph();
134
+ return useMemo(() => {
135
+ // A selected kind card or district denotes KINDS; the binding owns those
136
+ // ids, so it translates here and providers only ever see the kinds.
137
+ const kindSelection = [...new Set(selection.flatMap((id) => kindsOf(id)))];
138
+ const edgeSelection = selection
139
+ .map((id) => edgeOfSelection(id))
140
+ .filter((edge) => edge !== null);
141
+ // Asked as WHOEVER IS HERE, so what the strip offers is what the store
142
+ // would accept — and what it withholds is stated with a reason rather
143
+ // than quietly missing. The installation's declared providers apply to
144
+ // every surface that asks, unless a caller deliberately overrides.
145
+ return deriveAffordances(store, selection, {
146
+ principal,
147
+ kindSelection,
148
+ edgeSelection,
149
+ ...(providers ? { providers } : {}),
150
+ ...rest,
151
+ });
152
+ }, [store, selection, options, nodes, principal, providers]);
153
+ }
154
+ /** Runs an affordance, or shows what it would do first. */
155
+ export function useApplyAffordance() {
156
+ const { store, principal } = useGraview();
157
+ return useMemo(() => ({
158
+ preview: (affordance, args) => previewAffordance(store, affordance, args ?? {}),
159
+ apply: (affordance, args) => applyAffordance(store, affordance, args ?? {}, {
160
+ // The principal, not a bare "human": the store enforces against
161
+ // this and the log attributes to it, and they must be one object.
162
+ author: principal,
163
+ }),
164
+ }), [store, principal]);
165
+ }
166
+ /** Navigation: every stop is a view, and every view is a URL. */
167
+ export function useNavigation() {
168
+ const { view, setView } = useGraview();
169
+ return useMemo(() => ({
170
+ view,
171
+ url: toUrl(view),
172
+ focus: (id) => setView((current) => withFocus(current, id)),
173
+ show: (relation) => setView((current) => withRelation(current, relation)),
174
+ toggle: (aggregateId) => setView((current) => toggleExpanded(current, aggregateId)),
175
+ go: (next) => setView(next),
176
+ }), [view, setView]);
177
+ }
178
+ /**
179
+ * Keeps the view in the URL fragment and honours the back button.
180
+ *
181
+ * The back button returning to the exact prior view is not a nicety here: it
182
+ * is the thing that makes a spatial interface navigable at all, because it
183
+ * means no arrangement is ever unreachable once you have left it.
184
+ */
185
+ /**
186
+ * `useUrlSync` as a component, for shells that make syncing conditional —
187
+ * a hook inside `if (syncUrl)` is a Rules-of-Hooks trap the moment the
188
+ * flag ever changes; a conditionally RENDERED component is not.
189
+ */
190
+ export function UrlSync() {
191
+ useUrlSync();
192
+ return null;
193
+ }
194
+ export function useUrlSync() {
195
+ const { view, setView, views } = useGraview();
196
+ /*
197
+ * A STOP THAT NAMES A PLACE AND NOT ITS GROUP STILL GOES THERE.
198
+ *
199
+ * `#view=grounds-map` is the link a page can actually write: the page knows
200
+ * the picture it is talking about, not how the layout spells the aggregate
201
+ * id of the kind behind it. The registry does know — a named place carries
202
+ * its kind — so the place is looked up here and the group it is a picture
203
+ * of becomes the focus. Without this the short form lands on the default
204
+ * view, which is the pasted-link problem one level up.
205
+ */
206
+ const settled = useCallback((state) => {
207
+ const asked = state.within?.["view"];
208
+ if (asked === undefined || state.focusId)
209
+ return state;
210
+ const place = views.places().find((candidate) => candidate.as === asked);
211
+ return place ? { ...state, focusId: aggregateId(place.kind) } : state;
212
+ }, [views]);
213
+ /*
214
+ * Adopt the fragment on FIRST load, not only on navigation.
215
+ *
216
+ * "Every stop is a URL" was only half true: the view was written to the
217
+ * fragment and the back button honoured it, but opening a shared link
218
+ * landed on the default view and silently overwrote the address bar. A
219
+ * pasted link that does not go where it says is worse than no link.
220
+ */
221
+ useEffect(() => {
222
+ if (typeof window === "undefined")
223
+ return;
224
+ const initial = settled(fromUrl(window.location.hash));
225
+ // Adopt ANY address that says something — overview, zoom, a selection —
226
+ // not only the focus-shaped ones. A pasted link that does not go where
227
+ // it says is worse than no link.
228
+ if (!sameView(initial, EMPTY_VIEW)) {
229
+ setView(initial);
230
+ }
231
+ // Once, on mount: later changes are this hook's own writes.
232
+ }, []);
233
+ useEffect(() => {
234
+ if (typeof window === "undefined")
235
+ return;
236
+ const onPop = () => setView(settled(fromUrl(window.location.hash)));
237
+ window.addEventListener("popstate", onPop);
238
+ window.addEventListener("hashchange", onPop);
239
+ return () => {
240
+ window.removeEventListener("popstate", onPop);
241
+ window.removeEventListener("hashchange", onPop);
242
+ };
243
+ }, [setView, settled]);
244
+ const landed = useRef(false);
245
+ const written = useRef(null);
246
+ useEffect(() => {
247
+ if (typeof window === "undefined")
248
+ return;
249
+ const next = toUrl(view);
250
+ // Only write when the view actually changed, or the back stack fills with
251
+ // duplicates and the back button stops meaning anything. The baseline
252
+ // still moves: after a popstate re-syncs the view, a stale baseline made
253
+ // the next drag read as travel and push a phantom stop.
254
+ if (window.location.hash === next) {
255
+ written.current = view;
256
+ return;
257
+ }
258
+ /*
259
+ * ARRIVING is not a navigation.
260
+ *
261
+ * The first write is the app adopting its own default view, and pushing it
262
+ * put a stop in the history that nobody went to — so the back control was
263
+ * offered the moment the page loaded, and pressing it went to the blank
264
+ * URL the app had just left. Replacing is what a page does when it tidies
265
+ * its own address.
266
+ */
267
+ if (!landed.current) {
268
+ landed.current = true;
269
+ written.current = view;
270
+ window.history.replaceState({ graview: trail.at }, "", next);
271
+ return;
272
+ }
273
+ /*
274
+ * MOVING THE FURNITURE IS NOT TRAVELLING.
275
+ *
276
+ * A drag writes the view state on every pointer move, because that is what
277
+ * makes the connectors follow the card. Pushed, one drag would be sixty
278
+ * history entries and Back would mean "one pixel ago". A change that
279
+ * touches only the camera or where things were dragged is an adjustment of
280
+ * the stop you are on, so it replaces: the address stays shareable and
281
+ * Back still means the place you were before you started fiddling.
282
+ */
283
+ if (adjustment(written.current, view)) {
284
+ window.history.replaceState({ graview: trail.at }, "", next);
285
+ written.current = view;
286
+ return;
287
+ }
288
+ written.current = view;
289
+ window.history.pushState({ graview: ++trail.at }, "", next);
290
+ // A new stop discards anything that was ahead of it, exactly as the
291
+ // browser does.
292
+ trail.depth = trail.at;
293
+ trail.tell();
294
+ }, [view]);
295
+ }
296
+ /**
297
+ * Where you are in your own history.
298
+ *
299
+ * The History API says nothing about whether there is anywhere to go forward
300
+ * to, and an interface cannot offer a control it does not know the state of —
301
+ * a forward arrow that is always enabled and usually does nothing is worse
302
+ * than none. So the position is tracked here, from the pushes this hook makes
303
+ * and the pops the browser reports.
304
+ *
305
+ * Module-level because there is one history per document, and because a hook
306
+ * that re-created it per component would count each navigation once per
307
+ * mounted consumer.
308
+ */
309
+ /**
310
+ * Whether one view differs from another only in what the user MOVED.
311
+ *
312
+ * Where you are is the focus, the relation, what is expanded and whether you
313
+ * have risen above the stack. Where you dragged things to is not a different
314
+ * place; it is the same place, rearranged.
315
+ */
316
+ /**
317
+ * WHETHER A CHANGE IS A STOP OR JUST A NUDGE OF THE ONE YOU ARE ON.
318
+ *
319
+ * Exported so it can be read and held to: what belongs in here is the
320
+ * difference between the back button meaning something and meaning "one
321
+ * pixel ago", and the two things that went wrong went wrong silently — the
322
+ * address changed, no entry was pushed, and the arrows stayed grey.
323
+ */
324
+ export function adjustment(before, after) {
325
+ if (!before)
326
+ return false;
327
+ return (before.focusId === after.focusId &&
328
+ before.relation === after.relation &&
329
+ (before.overview ?? false) === (after.overview ?? false) &&
330
+ (before.zoom ?? false) === (after.zoom ?? false) &&
331
+ (before.past ?? false) === (after.past ?? false) &&
332
+ before.expanded.join(",") === after.expanded.join(",") &&
333
+ /*
334
+ * SHOWING A MODULE IS TRAVELLING. "Show the installation" raises whole
335
+ * districts into the scene — who is here, who has been invited — and
336
+ * its own comment always said it was a stop Back knew the way out of.
337
+ * It was not: `shown` was missing from this comparison, so the address
338
+ * gained `show=installation` and the entry was REPLACED, the arrows
339
+ * stayed grey, and one Back from the installation left the app.
340
+ */
341
+ (before.shown ?? []).join(",") === (after.shown ?? []).join(",") &&
342
+ /*
343
+ * A VIEW MOVING ALONG ITS OWN DIMENSION IS TRAVELLING.
344
+ *
345
+ * Turning the calendar to October is going somewhere: a URL to send
346
+ * somebody, a place to come back to, a Back that means "the month I was
347
+ * looking at". Left out of this comparison it read as an adjustment of
348
+ * the stop — the address updated, no entry was pushed, and one Back
349
+ * from October landed past the calendar entirely, at the place before
350
+ * anyone opened it. That is the exact failure `within` exists to fix.
351
+ */
352
+ sameWithin(before.within, after.within));
353
+ }
354
+ function sameWithin(before, after) {
355
+ const say = (held) => Object.entries(held ?? {})
356
+ .sort(([a], [b]) => a.localeCompare(b))
357
+ .map(([key, value]) => `${key}=${value}`)
358
+ .join("&");
359
+ return say(withoutWords(before)) === say(withoutWords(after));
360
+ }
361
+ /*
362
+ * TYPING IS NOT TRAVELLING. The words a row narrows by (`in.q`) change on
363
+ * every keystroke, and each one pushed a history entry — five letters, five
364
+ * Backs to leave a list. The scene's own `q` was never compared; the row's
365
+ * words are the same act and read the same way.
366
+ */
367
+ function withoutWords(held) {
368
+ if (!held || !("q" in held))
369
+ return held;
370
+ const { q: _words, ...rest } = held;
371
+ return rest;
372
+ }
373
+ const trail = {
374
+ at: 0,
375
+ depth: 0,
376
+ listeners: new Set(),
377
+ tell() {
378
+ for (const listener of this.listeners)
379
+ listener();
380
+ },
381
+ };
382
+ if (typeof window !== "undefined") {
383
+ window.addEventListener("popstate", (event) => {
384
+ const state = event.state;
385
+ // A stop this app pushed knows its own position. Anything else — a link
386
+ // out and back, another app's entry — resets to the start rather than
387
+ // guessing, since a wrong answer here offers a control that does nothing.
388
+ trail.at = typeof state?.graview === "number" ? state.graview : 0;
389
+ if (trail.at > trail.depth)
390
+ trail.depth = trail.at;
391
+ trail.tell();
392
+ });
393
+ }
394
+ /**
395
+ * Whether there is anywhere to go, and the way to go there.
396
+ *
397
+ * Every stop in a Graview app is a URL — that was the point of view state
398
+ * being serialisable — so back and forward are the BROWSER's, and this only
399
+ * makes them visible. An interface whose navigation is the browser's should
400
+ * not require the person using it to know that.
401
+ */
402
+ export function useBacktrack() {
403
+ const subscribe = useCallback((listener) => {
404
+ trail.listeners.add(listener);
405
+ return () => trail.listeners.delete(listener);
406
+ }, []);
407
+ const at = useSyncExternalStore(subscribe, () => trail.at, () => 0);
408
+ const depth = useSyncExternalStore(subscribe, () => trail.depth, () => 0);
409
+ return useMemo(() => ({
410
+ canGoBack: at > 0,
411
+ canGoForward: at < depth,
412
+ back: () => window.history.back(),
413
+ forward: () => window.history.forward(),
414
+ }), [at, depth]);
415
+ }
416
+ /**
417
+ * "Jack in": lift one view out of the scene into a conventional full page.
418
+ *
419
+ * A FAMILIARITY affordance, not an interactivity escape hatch. Because
420
+ * pointer routing keeps the in-scene view fully interactive, jacking in is a
421
+ * comfort for a novel interface rather than a requirement to get work done —
422
+ * and every view has to render correctly both ways.
423
+ */
424
+ export function useJackIn() {
425
+ const { view, setView } = useGraview();
426
+ /*
427
+ * Jacking in ZOOMS now — it does not jump. The gesture keeps its name and
428
+ * this hook keeps its contract, but underneath it is ordinary view state:
429
+ * focus the thing and zoom the scene in close, so entering tweens from
430
+ * wherever you were and the back button backs out of it. The modal page
431
+ * this used to open isolated the view from every relation it had.
432
+ */
433
+ const enter = useCallback((id) => setView((current) => withJackIn(current, id)), [setView]);
434
+ const exit = useCallback(() => setView((current) => withZoom(current, false)), [setView]);
435
+ const jackedIn = view.zoom ? view.focusId : null;
436
+ return useMemo(() => ({ jackedIn, enter, exit, isJackedIn: view.zoom === true }), [jackedIn, enter, exit, view.zoom]);
437
+ }
438
+ /**
439
+ * The fields of a node that can be changed where they are shown, and the way
440
+ * to change one.
441
+ *
442
+ * `commit` runs the mutation the framework found, with the author set to a
443
+ * person — so an in-place edit lands in the op log, can be undone, and is
444
+ * judged by the invariants exactly like an edit made from the actions strip.
445
+ * There is no second write path.
446
+ */
447
+ export function useEditableFields(id) {
448
+ const { store, principal } = useGraview();
449
+ const nodes = useGraph();
450
+ const fields = useMemo(() => (id === null ? [] : editableFields(store, id)), [store, id, nodes]);
451
+ const commit = useCallback((field, value, rest = {}) => {
452
+ const call = field.call(value);
453
+ store.apply({ name: call.name, args: { ...call.args, ...rest } }, { author: principal });
454
+ }, [store, principal]);
455
+ return { fields, commit };
456
+ }
457
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export { GraviewProvider, ROBOT_REST_MS, useFound, useGraph, useGraview, useGraviewIfAny, useNode, useRobots, useScenePointer, useViewMode, useWhereIs, ViewModeProvider } from "./context.js";
2
+ export { Figure, Occupants, PersonFigure } from "./occupants.js";
3
+ export { anchorOf, AUDIENCE_ROW, HEARTBEAT_MS, placeOthers, PRESENCE_SETTINGS, SHARE_OVER, SHARE_WHERE, tabSession, usePresenceState } from "./presence.js";
4
+ export type { Placed, PresenceInputs, PresenceState } from "./presence.js";
5
+ export type { OccupantsProps } from "./occupants.js";
6
+ export { foldRobots, participantOf, standingFor, VISIT_EACH_UP_TO } from "./robot.js";
7
+ export type { RobotEvent, RobotMode, RobotState, SeatNote } from "./robot.js";
8
+ export type { ActsDoor, AdministeredModule, DrawnBox, GraviewContextValue, GraviewProviderProps, PointerMenu, SceneHandle, Scheme, Seat, ViewMode } from "./context.js";
9
+ export { createPointerStore } from "./pointer.js";
10
+ export type { PointerStore, ScenePoint } from "./pointer.js";
11
+ export { applySettings, honourSetting, loadSetting, rememberSetting } from "./settings.js";
12
+ export { createViews, DEFAULT_VIEW, isDefaultView, markDefaultView } from "./view-registry.js";
13
+ export { ViewBoundary } from "./view-boundary.js";
14
+ export type { ViewBoundaryProps } from "./view-boundary.js";
15
+ export type { Cardinality, Fidelity, ReactViewRegistry, ViewCell, ViewComponent, ViewProps, } from "./view-registry.js";
16
+ export { clipQuadratic, connectorStrands, altitudeOpacity, stackOpacity, onScreen, ResolvedView, Scene, selectionFor, tieRoute, whereIsIn, } from "./scene.js";
17
+ export type { SceneNode, Strand } from "./scene.js";
18
+ export { useAnimatedLayout, useSeatWork, useTouched } from "./animation.js";
19
+ export { SeatMarks } from "./seat-marks.js";
20
+ export type { SeatAct, SeatWork } from "./animation.js";
21
+ export type { TransitionOptions } from "./animation.js";
22
+ export { ACTIVITY_HOLD_MS, markActivity, useActivity, useAttention, } from "./activity.js";
23
+ export type { ActivityMark, Attention, Manner, ToolCallLike } from "./activity.js";
24
+ export type { ResolvedViewProps, SceneProps } from "./scene.js";
25
+ export { NOTHING_FOUND, useFlagged, useImplicated, useReached, useViolations } from "./hooks.js";
26
+ export { useLocalIntelligence } from "./local-intelligence.js";
27
+ export type { Ask, LocalIntelligence } from "./local-intelligence.js";
28
+ export { kitConnector, useKit } from "./kit.js";
29
+ export { clipPolyline, latticePoints, orthogonalPoints, polylineD, roundedPolylineD, routePoint, routedQuadratic } from "./routes.js";
30
+ export { bandRows, channelRoute } from "./channels.js";
31
+ export { useAffordances, useApplyAffordance, adjustment, useBacktrack, useEditableFields, useJackIn, useNavigation, useSelection, UrlSync, useUrlSync, } from "./hooks.js";
32
+ export { useDrawnSize, useTextMeasure } from "./drawn.js";
33
+ export type { DrawnOptions, DrawnSize } from "./drawn.js";
34
+ export { createMotionStore, useSceneStill } from "./motion.js";
35
+ export type { MotionStore } from "./motion.js";
36
+ export { landingIn, useTheKeyboardLandsSomewhere } from "./keyboard.js";
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/L,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5J,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxK,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EACV,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,SAAS,GACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnF,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtI,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ export { GraviewProvider, ROBOT_REST_MS, useFound, useGraph, useGraview, useGraviewIfAny, useNode, useRobots, useScenePointer, useViewMode, useWhereIs, ViewModeProvider } from "./context.js";
2
+ export { Figure, Occupants, PersonFigure } from "./occupants.js";
3
+ export { anchorOf, AUDIENCE_ROW, HEARTBEAT_MS, placeOthers, PRESENCE_SETTINGS, SHARE_OVER, SHARE_WHERE, tabSession, usePresenceState } from "./presence.js";
4
+ export { foldRobots, participantOf, standingFor, VISIT_EACH_UP_TO } from "./robot.js";
5
+ export { createPointerStore } from "./pointer.js";
6
+ export { applySettings, honourSetting, loadSetting, rememberSetting } from "./settings.js";
7
+ export { createViews, DEFAULT_VIEW, isDefaultView, markDefaultView } from "./view-registry.js";
8
+ export { ViewBoundary } from "./view-boundary.js";
9
+ export { clipQuadratic, connectorStrands, altitudeOpacity, stackOpacity, onScreen, ResolvedView, Scene, selectionFor, tieRoute, whereIsIn, } from "./scene.js";
10
+ export { useAnimatedLayout, useSeatWork, useTouched } from "./animation.js";
11
+ export { SeatMarks } from "./seat-marks.js";
12
+ export { ACTIVITY_HOLD_MS, markActivity, useActivity, useAttention, } from "./activity.js";
13
+ export { NOTHING_FOUND, useFlagged, useImplicated, useReached, useViolations } from "./hooks.js";
14
+ export { useLocalIntelligence } from "./local-intelligence.js";
15
+ export { kitConnector, useKit } from "./kit.js";
16
+ export { clipPolyline, latticePoints, orthogonalPoints, polylineD, roundedPolylineD, routePoint, routedQuadratic } from "./routes.js";
17
+ export { bandRows, channelRoute } from "./channels.js";
18
+ export { useAffordances, useApplyAffordance, adjustment, useBacktrack, useEditableFields, useJackIn, useNavigation, useSelection, UrlSync, useUrlSync, } from "./hooks.js";
19
+ export { useDrawnSize, useTextMeasure } from "./drawn.js";
20
+ export { createMotionStore, useSceneStill } from "./motion.js";
21
+ export { landingIn, useTheKeyboardLandsSomewhere } from "./keyboard.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/L,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG5J,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtI,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type RefObject } from "react";
2
+ /** Where the keyboard goes inside what still stands. Exported for its test. */
3
+ export declare function landingIn(standing: Element, gone?: Element): HTMLElement | null;
4
+ export declare function useTheKeyboardLandsSomewhere(root: RefObject<HTMLElement | null>): void;
5
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA6DlD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAU/E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAiGtF"}