@graview/primitives 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 (207) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +25 -0
  3. package/dist/arrange-bar.d.ts +49 -0
  4. package/dist/arrange-bar.d.ts.map +1 -0
  5. package/dist/arrange-bar.js +264 -0
  6. package/dist/arrange-bar.js.map +1 -0
  7. package/dist/chat.d.ts +46 -0
  8. package/dist/chat.d.ts.map +1 -0
  9. package/dist/chat.js +343 -0
  10. package/dist/chat.js.map +1 -0
  11. package/dist/companion.d.ts +58 -0
  12. package/dist/companion.d.ts.map +1 -0
  13. package/dist/companion.js +433 -0
  14. package/dist/companion.js.map +1 -0
  15. package/dist/connections.d.ts +23 -0
  16. package/dist/connections.d.ts.map +1 -0
  17. package/dist/connections.js +100 -0
  18. package/dist/connections.js.map +1 -0
  19. package/dist/default-views.d.ts +35 -0
  20. package/dist/default-views.d.ts.map +1 -0
  21. package/dist/default-views.js +605 -0
  22. package/dist/default-views.js.map +1 -0
  23. package/dist/editable.d.ts +71 -0
  24. package/dist/editable.d.ts.map +1 -0
  25. package/dist/editable.js +225 -0
  26. package/dist/editable.js.map +1 -0
  27. package/dist/figure.d.ts +30 -0
  28. package/dist/figure.d.ts.map +1 -0
  29. package/dist/figure.js +66 -0
  30. package/dist/figure.js.map +1 -0
  31. package/dist/find.d.ts +5 -0
  32. package/dist/find.d.ts.map +1 -0
  33. package/dist/find.js +252 -0
  34. package/dist/find.js.map +1 -0
  35. package/dist/index.d.ts +51 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +44 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/installation.d.ts +17 -0
  40. package/dist/installation.d.ts.map +1 -0
  41. package/dist/installation.js +37 -0
  42. package/dist/installation.js.map +1 -0
  43. package/dist/ladder.d.ts +2 -0
  44. package/dist/ladder.d.ts.map +1 -0
  45. package/dist/ladder.js +53 -0
  46. package/dist/ladder.js.map +1 -0
  47. package/dist/lens/arranging.d.ts +41 -0
  48. package/dist/lens/arranging.d.ts.map +1 -0
  49. package/dist/lens/arranging.js +38 -0
  50. package/dist/lens/arranging.js.map +1 -0
  51. package/dist/lens/board.d.ts +146 -0
  52. package/dist/lens/board.d.ts.map +1 -0
  53. package/dist/lens/board.js +658 -0
  54. package/dist/lens/board.js.map +1 -0
  55. package/dist/lens/calendar-dates.d.ts +19 -0
  56. package/dist/lens/calendar-dates.d.ts.map +1 -0
  57. package/dist/lens/calendar-dates.js +55 -0
  58. package/dist/lens/calendar-dates.js.map +1 -0
  59. package/dist/lens/calendar-drawing.d.ts +59 -0
  60. package/dist/lens/calendar-drawing.d.ts.map +1 -0
  61. package/dist/lens/calendar-drawing.js +229 -0
  62. package/dist/lens/calendar-drawing.js.map +1 -0
  63. package/dist/lens/calendar-options.d.ts +107 -0
  64. package/dist/lens/calendar-options.d.ts.map +1 -0
  65. package/dist/lens/calendar-options.js +19 -0
  66. package/dist/lens/calendar-options.js.map +1 -0
  67. package/dist/lens/calendar-placing.d.ts +35 -0
  68. package/dist/lens/calendar-placing.d.ts.map +1 -0
  69. package/dist/lens/calendar-placing.js +113 -0
  70. package/dist/lens/calendar-placing.js.map +1 -0
  71. package/dist/lens/calendar-spans.d.ts +48 -0
  72. package/dist/lens/calendar-spans.d.ts.map +1 -0
  73. package/dist/lens/calendar-spans.js +146 -0
  74. package/dist/lens/calendar-spans.js.map +1 -0
  75. package/dist/lens/calendar-view.d.ts +34 -0
  76. package/dist/lens/calendar-view.d.ts.map +1 -0
  77. package/dist/lens/calendar-view.js +228 -0
  78. package/dist/lens/calendar-view.js.map +1 -0
  79. package/dist/lens/calendar.d.ts +43 -0
  80. package/dist/lens/calendar.d.ts.map +1 -0
  81. package/dist/lens/calendar.js +43 -0
  82. package/dist/lens/calendar.js.map +1 -0
  83. package/dist/lens/coverage.d.ts +183 -0
  84. package/dist/lens/coverage.d.ts.map +1 -0
  85. package/dist/lens/coverage.js +732 -0
  86. package/dist/lens/coverage.js.map +1 -0
  87. package/dist/lens/horizon.d.ts +14 -0
  88. package/dist/lens/horizon.d.ts.map +1 -0
  89. package/dist/lens/horizon.js +20 -0
  90. package/dist/lens/horizon.js.map +1 -0
  91. package/dist/lens/more.d.ts +16 -0
  92. package/dist/lens/more.d.ts.map +1 -0
  93. package/dist/lens/more.js +17 -0
  94. package/dist/lens/more.js.map +1 -0
  95. package/dist/lens/plan-lens.d.ts +17 -0
  96. package/dist/lens/plan-lens.d.ts.map +1 -0
  97. package/dist/lens/plan-lens.js +24 -0
  98. package/dist/lens/plan-lens.js.map +1 -0
  99. package/dist/lens/plan-state.d.ts +122 -0
  100. package/dist/lens/plan-state.d.ts.map +1 -0
  101. package/dist/lens/plan-state.js +152 -0
  102. package/dist/lens/plan-state.js.map +1 -0
  103. package/dist/lens/plan-view.d.ts +10 -0
  104. package/dist/lens/plan-view.d.ts.map +1 -0
  105. package/dist/lens/plan-view.js +576 -0
  106. package/dist/lens/plan-view.js.map +1 -0
  107. package/dist/lens/plan.d.ts +25 -0
  108. package/dist/lens/plan.d.ts.map +1 -0
  109. package/dist/lens/plan.js +25 -0
  110. package/dist/lens/plan.js.map +1 -0
  111. package/dist/lens/reach.d.ts +47 -0
  112. package/dist/lens/reach.d.ts.map +1 -0
  113. package/dist/lens/reach.js +67 -0
  114. package/dist/lens/reach.js.map +1 -0
  115. package/dist/lens/timeline.d.ts +137 -0
  116. package/dist/lens/timeline.d.ts.map +1 -0
  117. package/dist/lens/timeline.js +426 -0
  118. package/dist/lens/timeline.js.map +1 -0
  119. package/dist/markup.d.ts +23 -0
  120. package/dist/markup.d.ts.map +1 -0
  121. package/dist/markup.js +24 -0
  122. package/dist/markup.js.map +1 -0
  123. package/dist/places.d.ts +24 -0
  124. package/dist/places.d.ts.map +1 -0
  125. package/dist/places.js +227 -0
  126. package/dist/places.js.map +1 -0
  127. package/dist/popover.d.ts +28 -0
  128. package/dist/popover.d.ts.map +1 -0
  129. package/dist/popover.js +59 -0
  130. package/dist/popover.js.map +1 -0
  131. package/dist/primitives/index.d.ts +214 -0
  132. package/dist/primitives/index.d.ts.map +1 -0
  133. package/dist/primitives/index.js +381 -0
  134. package/dist/primitives/index.js.map +1 -0
  135. package/dist/profile.d.ts +65 -0
  136. package/dist/profile.d.ts.map +1 -0
  137. package/dist/profile.js +233 -0
  138. package/dist/profile.js.map +1 -0
  139. package/dist/quick-relations.d.ts +16 -0
  140. package/dist/quick-relations.d.ts.map +1 -0
  141. package/dist/quick-relations.js +183 -0
  142. package/dist/quick-relations.js.map +1 -0
  143. package/dist/relation-key.d.ts +44 -0
  144. package/dist/relation-key.d.ts.map +1 -0
  145. package/dist/relation-key.js +196 -0
  146. package/dist/relation-key.js.map +1 -0
  147. package/dist/seat.d.ts +137 -0
  148. package/dist/seat.d.ts.map +1 -0
  149. package/dist/seat.js +162 -0
  150. package/dist/seat.js.map +1 -0
  151. package/dist/seats.d.ts +21 -0
  152. package/dist/seats.d.ts.map +1 -0
  153. package/dist/seats.js +62 -0
  154. package/dist/seats.js.map +1 -0
  155. package/dist/seeding.d.ts +150 -0
  156. package/dist/seeding.d.ts.map +1 -0
  157. package/dist/seeding.js +538 -0
  158. package/dist/seeding.js.map +1 -0
  159. package/dist/shell.d.ts +74 -0
  160. package/dist/shell.d.ts.map +1 -0
  161. package/dist/shell.js +86 -0
  162. package/dist/shell.js.map +1 -0
  163. package/dist/theme.d.ts +50 -0
  164. package/dist/theme.d.ts.map +1 -0
  165. package/dist/theme.js +1692 -0
  166. package/dist/theme.js.map +1 -0
  167. package/dist/wordmark.d.ts +15 -0
  168. package/dist/wordmark.d.ts.map +1 -0
  169. package/dist/wordmark.js +55 -0
  170. package/dist/wordmark.js.map +1 -0
  171. package/dist/workbench/activity.d.ts +75 -0
  172. package/dist/workbench/activity.d.ts.map +1 -0
  173. package/dist/workbench/activity.js +259 -0
  174. package/dist/workbench/activity.js.map +1 -0
  175. package/dist/workbench/agent-seat.d.ts +51 -0
  176. package/dist/workbench/agent-seat.d.ts.map +1 -0
  177. package/dist/workbench/agent-seat.js +112 -0
  178. package/dist/workbench/agent-seat.js.map +1 -0
  179. package/dist/workbench/answer-args.d.ts +31 -0
  180. package/dist/workbench/answer-args.d.ts.map +1 -0
  181. package/dist/workbench/answer-args.js +257 -0
  182. package/dist/workbench/answer-args.js.map +1 -0
  183. package/dist/workbench/back-out.d.ts +71 -0
  184. package/dist/workbench/back-out.d.ts.map +1 -0
  185. package/dist/workbench/back-out.js +238 -0
  186. package/dist/workbench/back-out.js.map +1 -0
  187. package/dist/workbench/following.d.ts +7 -0
  188. package/dist/workbench/following.d.ts.map +1 -0
  189. package/dist/workbench/following.js +26 -0
  190. package/dist/workbench/following.js.map +1 -0
  191. package/dist/workbench/index.d.ts +23 -0
  192. package/dist/workbench/index.d.ts.map +1 -0
  193. package/dist/workbench/index.js +23 -0
  194. package/dist/workbench/index.js.map +1 -0
  195. package/dist/workbench/inspector.d.ts +27 -0
  196. package/dist/workbench/inspector.d.ts.map +1 -0
  197. package/dist/workbench/inspector.js +745 -0
  198. package/dist/workbench/inspector.js.map +1 -0
  199. package/dist/workbench/standing.d.ts +16 -0
  200. package/dist/workbench/standing.d.ts.map +1 -0
  201. package/dist/workbench/standing.js +102 -0
  202. package/dist/workbench/standing.js.map +1 -0
  203. package/dist/workbench/trail.d.ts +35 -0
  204. package/dist/workbench/trail.d.ts.map +1 -0
  205. package/dist/workbench/trail.js +150 -0
  206. package/dist/workbench/trail.js.map +1 -0
  207. package/package.json +62 -0
@@ -0,0 +1,433 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { labelOf, placeSlug } from "@graview/core";
3
+ import { withFocus } from "@graview/layout";
4
+ import { aggregateId, bandAggregateWords, isAggregateId, kindOfCard } from "@graview/layout";
5
+ import { useGraview, useSeatWork, useSelection } from "@graview/react";
6
+ import { useEffect, useLayoutEffect, useRef, useState } from "react";
7
+ import { ChatPanel } from "./chat.js";
8
+ import { QuickRelations } from "./quick-relations.js";
9
+ import { RelationKey } from "./relation-key.js";
10
+ import { Inspector } from "./workbench/index.js";
11
+ /*
12
+ * A dwell, so a pointer crossing the picture on its way somewhere does not
13
+ * rename the panel six times. Long enough to be a look, short enough that
14
+ * asking "what's wrong with this?" about the thing under the pointer works
15
+ * the moment you stop moving.
16
+ */
17
+ const DWELL_MS = 220;
18
+ /**
19
+ * The pick target under a scene point, read from the DOM the way a click
20
+ * would. The point is in the scene's own coordinates — the space the layout
21
+ * places things in — so the stage's box is what turns it into the window's.
22
+ */
23
+ function pickAt(stage, point) {
24
+ if (!stage || !point || typeof document === "undefined")
25
+ return null;
26
+ const box = stage.getBoundingClientRect();
27
+ const element = document.elementFromPoint(box.left + point.x, box.top + point.y);
28
+ const picked = element?.closest("[data-graview-pick]")?.getAttribute("data-graview-pick");
29
+ if (picked)
30
+ return picked;
31
+ const view = element?.closest("[data-graview-view]")?.getAttribute("data-graview-view");
32
+ return view ?? null;
33
+ }
34
+ /**
35
+ * WHAT "THIS" MEANS, without a gesture to turn it on.
36
+ *
37
+ * The selection when there is one — something chosen outranks something
38
+ * glanced at. Otherwise what the pointer has settled on. Otherwise where
39
+ * you are: the focused place, district or record, or the whole thing.
40
+ */
41
+ export function useSubject() {
42
+ const { store, view, views, pointer } = useGraview();
43
+ const { selection } = useSelection();
44
+ const [dwelt, setDwelt] = useState(null);
45
+ /*
46
+ * THE POINTER IS WATCHED, NOT SUBSCRIBED TO.
47
+ *
48
+ * Reading it the ordinary way — `useScenePointer`, a store subscription
49
+ * React re-renders on — re-rendered this whole rail on every pointer
50
+ * move: the acts, the relations, the conversation and the key, sixty
51
+ * times a second, for a subject that changes when you stop rather than
52
+ * while you move. The moves are taken here without a render; only what
53
+ * the pointer SETTLED on is state, and only when it is a different
54
+ * thing from last time.
55
+ */
56
+ useEffect(() => {
57
+ let timer = null;
58
+ let handOn = false;
59
+ /*
60
+ * AND NOT WHILE THE PICTURE IS MOVING UNDER THE POINTER.
61
+ *
62
+ * Dragging the city slides one district after another past a pointer
63
+ * that never moved, and the subject chased every one of them: the
64
+ * rail's header, its acts and its relations flickered through the
65
+ * whole map on the way. The pointer says what you are looking at when
66
+ * YOU move it over a picture that is still — so while a hand is down,
67
+ * and while the scene is still travelling, the question is not asked.
68
+ */
69
+ const stillMoving = () => typeof document !== "undefined" && document.querySelector("[data-graview-reach]") !== null
70
+ ? document.querySelector("[data-graview-settled]") === null
71
+ : false;
72
+ const settle = () => {
73
+ if (timer)
74
+ clearTimeout(timer);
75
+ if (handOn)
76
+ return;
77
+ const at = pointer.snapshot();
78
+ if (!at) {
79
+ setDwelt((was) => (was === null ? was : null));
80
+ return;
81
+ }
82
+ timer = setTimeout(() => {
83
+ if (handOn || stillMoving()) {
84
+ settle();
85
+ return;
86
+ }
87
+ const stage = typeof document === "undefined" ? null : document.querySelector("[data-graview-stage]");
88
+ const on = pickAt(stage, at);
89
+ setDwelt((was) => (was === on ? was : on));
90
+ }, DWELL_MS);
91
+ };
92
+ const down = () => {
93
+ handOn = true;
94
+ if (timer)
95
+ clearTimeout(timer);
96
+ };
97
+ const up = () => {
98
+ handOn = false;
99
+ settle();
100
+ };
101
+ const stop = pointer.subscribe(settle);
102
+ document.addEventListener("pointerdown", down, true);
103
+ document.addEventListener("pointerup", up, true);
104
+ document.addEventListener("pointercancel", up, true);
105
+ settle();
106
+ return () => {
107
+ stop();
108
+ document.removeEventListener("pointerdown", down, true);
109
+ document.removeEventListener("pointerup", up, true);
110
+ document.removeEventListener("pointercancel", up, true);
111
+ if (timer)
112
+ clearTimeout(timer);
113
+ };
114
+ }, [pointer]);
115
+ const name = (id) => {
116
+ const node = store.graph.getNode(id);
117
+ if (node)
118
+ return labelOf(store.schema.tryDefinition(node.kind), node);
119
+ const band = bandAggregateWords(id, store.schema);
120
+ if (band)
121
+ return band;
122
+ const kind = kindOfCard(id) ?? (isAggregateId(id) ? id.slice("aggregate:".length) : null);
123
+ if (kind)
124
+ return store.schema.tryDefinition(kind)?.plural ?? kind;
125
+ return null;
126
+ };
127
+ const chosen = selection[selection.length - 1];
128
+ if (chosen !== undefined) {
129
+ const said = name(chosen);
130
+ if (said) {
131
+ return {
132
+ id: chosen,
133
+ name: selection.length > 1 ? `${said} and ${selection.length - 1} more` : said,
134
+ because: "selection",
135
+ };
136
+ }
137
+ }
138
+ if (dwelt !== null && dwelt !== undefined) {
139
+ const said = name(dwelt);
140
+ if (said)
141
+ return { id: dwelt, name: said, because: "hover" };
142
+ }
143
+ /* Where you are: the picture being shown, else the district in focus, else the whole thing. */
144
+ const showing = view.within?.["view"];
145
+ const place = showing ? views.places().find((one) => one.as === showing || placeSlug(one.title) === showing) : undefined;
146
+ if (place)
147
+ return { id: null, name: place.title, because: "place" };
148
+ if (view.focusId) {
149
+ const said = name(view.focusId);
150
+ if (said)
151
+ return { id: view.focusId, name: said, because: "place" };
152
+ }
153
+ return { id: null, name: "the whole thing", because: "place" };
154
+ }
155
+ /**
156
+ * The key a card answers with its acts. A letter, and only on the card that
157
+ * has the keyboard — a character key bound to focus is not one a voice
158
+ * user's dictation sets off by accident (WCAG 2.1.4).
159
+ */
160
+ export const ACTS_KEY = "A";
161
+ /** What the seat is doing, in one word, from the state it already reports. */
162
+ function seatSays(mode) {
163
+ switch (mode) {
164
+ case "reading":
165
+ return { word: "reading", tone: "var(--graview-ink-muted)" };
166
+ case "writing":
167
+ return { word: "working", tone: "var(--graview-accent)" };
168
+ case "asking":
169
+ return { word: "asked you something", tone: "var(--graview-accent)" };
170
+ case "refused":
171
+ return { word: "refused", tone: "var(--graview-warn)" };
172
+ default:
173
+ return { word: "listening", tone: "var(--graview-ink-faint)" };
174
+ }
175
+ }
176
+ export function Companion({ respond, onCall, onPick, chat = true, framed = false } = {}) {
177
+ const { seatWho, robots, session, store, setView: setViewOf, registerActsDoor } = useGraview();
178
+ const { set: chooseOf } = useSelection();
179
+ const subject = useSubject();
180
+ const [open, setOpen] = useState(true);
181
+ const robot = robots.get(`agent:${seatWho ?? "chat"}:${session}`);
182
+ const state = seatSays(robot?.mode);
183
+ const said = robot?.say ?? null;
184
+ const name = seatWho ?? "the seat";
185
+ /*
186
+ * A NARROW SCENE HAS NO RAIL. The same argument the inspector makes: a
187
+ * rail down the side of a 390-wide picture covers the picture. There it
188
+ * is a sheet along the bottom, which is where a phone has always put
189
+ * this, and it starts closed so the picture is the first thing.
190
+ */
191
+ const [narrow, setNarrow] = useState(false);
192
+ const frame = useRef(null);
193
+ useEffect(() => {
194
+ if (framed)
195
+ return;
196
+ const element = frame.current?.parentElement;
197
+ if (!element || typeof ResizeObserver === "undefined")
198
+ return;
199
+ const watch = new ResizeObserver(() => setNarrow(element.getBoundingClientRect().width < 640));
200
+ watch.observe(element);
201
+ setNarrow(element.getBoundingClientRect().width < 640);
202
+ return () => watch.disconnect();
203
+ }, []);
204
+ useEffect(() => {
205
+ if (narrow && !framed)
206
+ setOpen(false);
207
+ }, [narrow, framed]);
208
+ /*
209
+ * AND THE PICTURE MAKES ROOM FOR THE SHEET. Laid over a 390-wide scene,
210
+ * an open sheet covers the districts and the control that opens one —
211
+ * the very thing it is about. The same trade the actions strip makes: the
212
+ * scene's box loses the sheet's height while it is there, and the layout
213
+ * runs again into what is left.
214
+ */
215
+ useLayoutEffect(() => {
216
+ const parent = frame.current?.offsetParent;
217
+ if (!parent || !narrow || framed)
218
+ return;
219
+ const room = `${Math.round(frame.current?.getBoundingClientRect().height ?? 0) + 20}px`;
220
+ if (parent.style.paddingBottom === room)
221
+ return;
222
+ const before = parent.style.paddingBottom;
223
+ parent.style.paddingBottom = room;
224
+ return () => {
225
+ parent.style.paddingBottom = before;
226
+ };
227
+ });
228
+ /*
229
+ * AND THE KEYBOARD GETS THERE IN ONE KEY. Folded, the sheet's toggle sat a
230
+ * dozen Tabs from the card the keyboard was on — past every other card
231
+ * and the controls inside them — so every act from the keyboard on a
232
+ * phone began with that walk. The scene's cards answer A instead, the way
233
+ * a right-click is answered: the card chosen, the seat opened, and the
234
+ * keyboard put on its first act. Put away again from the keyboard, the
235
+ * keyboard goes back to the card it came from. The rail does the same
236
+ * where it is already open, so a laptop's keyboard gets the short way too.
237
+ */
238
+ const cameFrom = useRef(null);
239
+ const dock = useRef(null);
240
+ const [asked, setAsked] = useState(0);
241
+ useEffect(() => {
242
+ if (framed)
243
+ return;
244
+ registerActsDoor({
245
+ key: ACTS_KEY,
246
+ open: (from) => {
247
+ cameFrom.current = from;
248
+ setOpen(true);
249
+ setAsked((count) => count + 1);
250
+ },
251
+ });
252
+ return () => registerActsDoor(null);
253
+ }, [framed, registerActsDoor]);
254
+ /* Whether the keyboard stands on a card, so the seat can say the key where it is seen. */
255
+ const [onACard, setOnACard] = useState(false);
256
+ useEffect(() => {
257
+ if (framed || typeof document === "undefined")
258
+ return;
259
+ const watch = () => {
260
+ const active = document.activeElement;
261
+ setOnACard(active instanceof HTMLElement && active.closest("[data-graview-view][aria-keyshortcuts]") !== null);
262
+ };
263
+ document.addEventListener("focusin", watch);
264
+ document.addEventListener("focusout", watch);
265
+ return () => {
266
+ document.removeEventListener("focusin", watch);
267
+ document.removeEventListener("focusout", watch);
268
+ };
269
+ }, [framed]);
270
+ const anything = store.graph.allEdges().length > 0;
271
+ const docked = !narrow && !framed;
272
+ /* The conversation, rendered once and placed by the pane's shape. */
273
+ const conversation = (_jsx(ChatPanel, { inside: true, ...(onPick ? { onPick } : {}),
274
+ /* What the graph can answer about THIS, offered before anybody types. */
275
+ offer: [
276
+ "What's wrong?",
277
+ ...(subject.id && store.graph.getNode(subject.id) ? [`Tell me about ${subject.name}`] : []),
278
+ "What is here?",
279
+ ], ...(respond ? { respond } : {}), ...(onCall ? { onCall } : {}) }));
280
+ const work = useSeatWork();
281
+ /* Questions back, from every seat in this tab: they wait for an answer, so they are listed until answered. */
282
+ const asking = [...robots.values()].filter((one) => one.mode === "asking" && one.say);
283
+ const { setView, choose } = { setView: setViewOf, choose: chooseOf };
284
+ /*
285
+ * THE WAY BACK TO WHAT IT DID. Where you are decides what "show me"
286
+ * means: from altitude the district the thing lives in, since a single
287
+ * task is a building up there; on the ground the thing itself, chosen
288
+ * and focused, which is what a person would have clicked.
289
+ */
290
+ const showMe = (id) => {
291
+ const node = store.graph.getNode(id);
292
+ choose([id]);
293
+ setView((current) => current.overview && node
294
+ ? withFocus(current, aggregateId(node.kind))
295
+ : withFocus(current, id));
296
+ };
297
+ /*
298
+ * AN ASK COMES TO THE TOP. Answering an act's open question is a
299
+ * conversation of its own, and in a scrolling column it can open below
300
+ * the fold — the pane asking a question nobody can see.
301
+ */
302
+ const column = useRef(null);
303
+ useEffect(() => {
304
+ const scroller = column.current;
305
+ if (!scroller || typeof MutationObserver === "undefined")
306
+ return;
307
+ const bring = () => {
308
+ const ask = scroller.querySelector("[data-graview-asking]");
309
+ ask?.scrollIntoView?.({ block: "nearest" });
310
+ };
311
+ const watch = new MutationObserver(bring);
312
+ watch.observe(scroller, { childList: true, subtree: true, attributes: true, attributeFilter: ["data-graview-asking"] });
313
+ return () => watch.disconnect();
314
+ }, [open]);
315
+ useEffect(() => {
316
+ if (asked === 0)
317
+ return;
318
+ /*
319
+ * The acts are derived after the choice the key made, so the first one
320
+ * may be a frame or two behind the press: asked for a little while, and
321
+ * only while the keyboard has not gone somewhere else meanwhile.
322
+ */
323
+ let tries = 12;
324
+ let frame = 0;
325
+ const land = () => {
326
+ const active = document.activeElement;
327
+ const stillThere = active === document.body || active === null || (active instanceof Node && cameFrom.current?.closest("[data-graview-view]")?.contains(active));
328
+ if (!stillThere)
329
+ return;
330
+ const pane = column.current;
331
+ const act = pane?.querySelector('[data-testid="affordances"] button:not([disabled])');
332
+ if (act) {
333
+ act.focus();
334
+ return;
335
+ }
336
+ if (tries-- > 0) {
337
+ frame = requestAnimationFrame(land);
338
+ return;
339
+ }
340
+ // Nothing to do here: the first thing the seat holds, so the keyboard is in what opened.
341
+ (pane?.querySelector("button:not([disabled]), input, select, textarea, summary") ?? dock.current)?.focus();
342
+ };
343
+ frame = requestAnimationFrame(land);
344
+ return () => cancelAnimationFrame(frame);
345
+ }, [asked]);
346
+ return (_jsxs("aside", { ref: frame, "aria-label": `The seat — about ${subject.name}`, "data-testid": "companion", "data-graview-companion": open ? "open" : "shut", "data-graview-subject": subject.id ?? "", "data-graview-because": subject.because, "data-graview-offstage": "", onMouseDown: (event) => event.stopPropagation(), style: {
347
+ zIndex: 40,
348
+ boxSizing: "border-box",
349
+ display: "flex",
350
+ flexDirection: "column",
351
+ gap: 8,
352
+ borderRadius: "var(--graview-radius, 12px)",
353
+ border: "1px solid var(--graview-edge)",
354
+ background: "var(--graview-float)",
355
+ boxShadow: "var(--graview-lift-high)",
356
+ ...(framed
357
+ ? { position: "static", width: "auto", maxHeight: "100%", padding: "10px 12px" }
358
+ : narrow
359
+ ? { position: "absolute", left: 10, right: 10, bottom: 10, maxHeight: open ? "min(58cqh, 420px)" : undefined, padding: open ? "10px 12px" : "6px 10px" }
360
+ : {
361
+ /*
362
+ * DOCKED, NOT FLOATING. The layout keeps this rail clear of the
363
+ * picture in every mode (see railInset), so the pane stands in
364
+ * it as a column of the interface — the scene's height, a rule
365
+ * down its right edge, no shadow — rather than as a card
366
+ * dropped over the corner of the picture. The width is the
367
+ * rail's share, so the two can never disagree.
368
+ */
369
+ position: "absolute",
370
+ left: 0,
371
+ top: 0,
372
+ bottom: 0,
373
+ width: "min(264px, 22cqw)",
374
+ padding: open ? "12px 12px 10px" : "10px 12px",
375
+ borderRadius: 0,
376
+ border: "none",
377
+ borderRight: "1px solid var(--graview-edge)",
378
+ boxShadow: "none",
379
+ background: "var(--graview-bar)",
380
+ ...(open ? { display: "grid", gridTemplateRows: "auto minmax(0, 1fr) auto" } : {}),
381
+ }),
382
+ overflow: "hidden",
383
+ }, children: [_jsxs("button", { type: "button", ref: dock, "data-testid": "companion-dock", "aria-expanded": open, onClick: (event) => {
384
+ setOpen(!open);
385
+ /*
386
+ * Put away from the keyboard (a click no pointer made), the
387
+ * keyboard goes back to the card the key brought it from rather
388
+ * than staying on a toggle at the foot of the screen.
389
+ */
390
+ const back = cameFrom.current;
391
+ cameFrom.current = null;
392
+ if (open && narrow && event.detail === 0 && back?.isConnected)
393
+ back.focus({ preventScroll: true });
394
+ }, title: open ? "Put the seat away" : `Talk to the seat about ${subject.name}`, style: {
395
+ all: "unset",
396
+ outline: "revert-layer",
397
+ cursor: "pointer",
398
+ display: "grid",
399
+ gridTemplateColumns: "auto minmax(0, 1fr) auto",
400
+ alignItems: "center",
401
+ gap: 8,
402
+ minHeight: 32,
403
+ }, children: [_jsxs("span", { style: { display: "grid", gap: 1, minWidth: 0 }, children: [_jsx("span", { style: { fontSize: "0.6875rem", letterSpacing: "0.12em", textTransform: "uppercase", color: subject.because === "selection" ? "var(--graview-accent)" : "var(--graview-ink-faint)" }, children: subject.because === "selection" ? "Selected" : subject.because === "hover" ? "Under the pointer" : "In view" }), _jsx("span", { style: { fontSize: "0.9375rem", fontWeight: 600, color: "var(--graview-ink)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: _jsx("span", { "data-testid": "companion-subject", children: subject.name }) }), _jsxs("span", { "data-testid": "companion-state", style: state.word === "listening"
404
+ ? { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }
405
+ : { fontSize: "0.75rem", color: state.tone, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: [name, " \u00B7 ", state.word] })] }), _jsxs("span", { style: { display: "flex", alignItems: "center", gap: 6, fontSize: "0.75rem", color: "var(--graview-ink-faint)" }, children: [onACard ? (_jsxs("span", { "data-testid": "companion-acts-key", style: { color: "var(--graview-ink-muted)", whiteSpace: "nowrap" }, children: [_jsx("kbd", { style: { font: "inherit", fontWeight: 600, padding: "0 4px", border: "1px solid var(--graview-edge)", borderRadius: 4 }, children: ACTS_KEY }), " its acts"] })) : null, _jsx("span", { "aria-hidden": "true", children: open ? "▾" : "▸" })] })] }), open && said && (robot?.mode === "refused" || robot?.mode === "asking") ? (_jsx("p", { "data-testid": "companion-said", style: { margin: 0, fontSize: "0.8125rem", color: state.tone }, children: said })) : null, open ? (_jsxs("div", { ref: column, style: {
406
+ display: "grid",
407
+ /*
408
+ * EVERY SECTION IS AS TALL AS ITS CONTENT, and the column
409
+ * scrolls. Left to itself a grid with a definite height hands
410
+ * each row a share of the space — and a row whose item has no
411
+ * automatic minimum is compressed below what is in it, which
412
+ * paints the conversation's chips and field straight over the
413
+ * relations underneath. Rows sized by their content, packed at
414
+ * the top, cannot do that: what does not fit is scrolled to.
415
+ */
416
+ gridAutoRows: "min-content",
417
+ alignContent: "start",
418
+ gap: 10,
419
+ minHeight: 0,
420
+ overflowY: "auto",
421
+ overflowX: "hidden",
422
+ }, children: [_jsx(Inspector, { placement: "rail" }), _jsx(QuickRelations, { inside: true }), chat && !docked ? conversation : null, asking.length > 0 ? (_jsxs("section", { "data-testid": "companion-asking", style: { display: "grid", gap: 6 }, children: [_jsx("span", { style: { fontSize: "0.75rem", letterSpacing: "0.12em", textTransform: "uppercase", color: "var(--graview-accent)" }, children: asking.length === 1 ? "It asked" : `It asked ${asking.length} things` }), _jsx("ul", { style: { margin: 0, padding: 0, listStyle: "none", display: "grid", gap: 4 }, children: asking.map((one) => (_jsxs("li", { style: { display: "grid", gridTemplateColumns: "minmax(0, 1fr) auto", gap: 6, alignItems: "baseline" }, children: [_jsx("span", { style: { fontSize: "0.8125rem", color: "var(--graview-ink)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, title: one.say, children: one.say }), one.at ? (_jsx("button", { type: "button", "data-testid": "companion-show-me", "data-graview-show": one.at, "aria-label": `Show me what ${one.who} is asking about`, title: "Show me what it is asking about", onClick: () => showMe(one.at), style: { font: "inherit", fontSize: "0.75rem", minHeight: 24, padding: "0 8px", maxWidth: 110, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: (() => {
423
+ const about = store.graph.getNode(one.at);
424
+ return about ? labelOf(store.schema.tryDefinition(about.kind), about) : "Show me";
425
+ })() })) : null] }, one.participant))) })] })) : null, work.acts.length > 0 ? (_jsxs("section", { "data-testid": "companion-log", style: { display: "grid", gap: 6 }, children: [_jsx("span", { style: { fontSize: "0.75rem", letterSpacing: "0.12em", textTransform: "uppercase", color: "var(--graview-ink-faint)" }, children: "What it did" }), _jsx("ul", { style: { margin: 0, padding: 0, listStyle: "none", display: "grid", gap: 4 }, children: work.acts.slice(0, 4).map((act) => {
426
+ const first = act.wrote[0];
427
+ const node = first ? store.graph.getNode(first) : undefined;
428
+ return (_jsxs("li", { style: { display: "grid", gridTemplateColumns: "minmax(0, 1fr) auto", gap: 6, alignItems: "baseline" }, children: [_jsx("span", { style: { fontSize: "0.8125rem", color: "var(--graview-ink)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, title: act.intent, children: act.intent }), node ? (
429
+ /* Named, not "Show me" three times: a row of identical labels is a list nobody can read. */
430
+ _jsx("button", { type: "button", "data-testid": "companion-show-me", "data-graview-show": first, "aria-label": `Show me ${labelOf(store.schema.tryDefinition(node.kind), node)}`, title: `Show me ${labelOf(store.schema.tryDefinition(node.kind), node)}`, onClick: () => showMe(first), style: { font: "inherit", fontSize: "0.75rem", minHeight: 24, padding: "0 8px", maxWidth: 110, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: labelOf(store.schema.tryDefinition(node.kind), node) })) : null] }, act.batch));
431
+ }) })] })) : null, anything ? (_jsxs("details", { "data-testid": "companion-key", children: [_jsx("summary", { style: { cursor: "pointer", fontSize: "0.75rem", letterSpacing: "0.12em", textTransform: "uppercase", color: "var(--graview-ink-faint)", minHeight: 24 }, children: "What the lines mean" }), _jsx(RelationKey, { inside: true })] })) : null] })) : null, open && chat && docked ? (_jsx("div", { style: { paddingTop: 8, borderTop: "1px solid var(--graview-edge)", minWidth: 0 }, children: conversation })) : null] }));
432
+ }
433
+ //# sourceMappingURL=companion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion.js","sourceRoot":"","sources":["../src/companion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Everything one edge away from a node, in the schema's own words.
3
+ *
4
+ * This is the answer to "I clicked a thing and nothing happened". A node in a
5
+ * typed graph is never an island: an event has people at it, an agreement
6
+ * that judges it, a reason it exists. All of that is already declared — every
7
+ * edge carries a description like "who does the run" or "a nap that must not
8
+ * be interrupted" — and until now no surface read any of it.
9
+ *
10
+ * Derived entirely from the schema and the graph, so a kind nobody wrote a
11
+ * view for still shows its relationships, and a new edge kind appears here
12
+ * the moment it is declared. Each neighbour is a `data-graview-pick` target,
13
+ * so the scene routes a click on it to that node.
14
+ */
15
+ export interface ConnectionsProps {
16
+ readonly id: string;
17
+ /** Chips per group before it says "+N more" rather than truncating. */
18
+ readonly max?: number;
19
+ /** Shown when the node has no edges at all. Omit for silence. */
20
+ readonly empty?: string;
21
+ }
22
+ export declare function Connections({ id, max, empty }: ConnectionsProps): import("react").JSX.Element | null;
23
+ //# sourceMappingURL=connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../src/connections.tsx"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,WAAW,CAAC,EAAE,EAAE,EAAE,GAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,sCAmEnE"}
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { labelOf } from "@graview/core";
3
+ import { useGraph, useGraview } from "@graview/react";
4
+ import { Chip } from "./primitives/index.js";
5
+ import { hueFor } from "./default-views.js";
6
+ export function Connections({ id, max = 8, empty }) {
7
+ const { store } = useGraview();
8
+ // Subscribing to the graph keeps this current when an edge is added.
9
+ useGraph();
10
+ // What it JUDGES counts as a connection: a rule's violations name the
11
+ // nodes it is about, and a card saying "nothing is connected" over a band
12
+ // of them was two surfaces disagreeing.
13
+ const groups = groupsFor(store, id, store.violations());
14
+ if (groups.length === 0) {
15
+ return empty ? (_jsx("p", { style: { margin: 0, fontSize: "0.875rem", color: "var(--graview-ink-faint)" }, children: empty })) : null;
16
+ }
17
+ return (_jsx("div", { "data-graview-primitive": "connections", style: { display: "flex", flexDirection: "column", gap: 12 }, children: groups.map((group) => {
18
+ const shown = group.ids.slice(0, max);
19
+ const hidden = group.ids.length - shown.length;
20
+ return (_jsxs("section", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: [_jsx("h2", { style: {
21
+ margin: 0,
22
+ fontSize: "0.75rem",
23
+ fontWeight: 600,
24
+ letterSpacing: "0.09em",
25
+ textTransform: "uppercase",
26
+ color: "var(--graview-ink-faint)",
27
+ }, children: group.label }), _jsxs("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: [shown.map((neighbourId) => {
28
+ const node = store.graph.getNode(neighbourId);
29
+ if (!node)
30
+ return null;
31
+ return (_jsx(Chip, { pickId: neighbourId, hue: hueFor(node.kind), title: `Go to ${node.kind}`, label: labelOf(store.schema.tryDefinition(node.kind), node) }, neighbourId));
32
+ }), hidden > 0 ? _jsx(Chip, { label: `+${hidden} more` }) : null] })] }, group.key));
33
+ }) }));
34
+ }
35
+ /**
36
+ * Neighbours grouped by the edge that reaches them.
37
+ *
38
+ * An outbound edge is described by the focus's own declaration; an inbound
39
+ * one by the declaration of whatever points at it. Both are the schema
40
+ * author's words about that relationship, which is what makes this readable
41
+ * without anyone writing UI copy.
42
+ */
43
+ function groupsFor(store, id, violations = []) {
44
+ const focus = store.graph.getNode(id);
45
+ if (!focus)
46
+ return [];
47
+ const byKey = new Map();
48
+ const judged = [];
49
+ for (const violation of violations) {
50
+ if (violation.subjectId !== id)
51
+ continue;
52
+ for (const other of violation.nodeIds)
53
+ if (other !== id && !judged.includes(other) && store.graph.has(other))
54
+ judged.push(other);
55
+ }
56
+ if (judged.length > 0)
57
+ byKey.set("judges", { key: "judges", label: "what it finds wrong", ids: judged });
58
+ for (const edge of store.graph.allEdges()) {
59
+ const otherId = edge.from === id ? edge.to : edge.to === id ? edge.from : null;
60
+ if (otherId === null || otherId === id)
61
+ continue;
62
+ const other = store.graph.getNode(otherId);
63
+ if (!other)
64
+ continue;
65
+ const direction = edge.from === id ? "out" : "in";
66
+ // The edge is declared by whichever kind it leaves, wherever you are
67
+ // reading it from.
68
+ const owner = direction === "out" ? focus.kind : other.kind;
69
+ const key = `${edge.kind}:${direction}`;
70
+ const group = byKey.get(key) ??
71
+ {
72
+ key,
73
+ /*
74
+ * READ FROM THE END YOU ARE STANDING ON.
75
+ *
76
+ * An edge has one direction and two readings. Using the declaring
77
+ * side's words for both captioned a task's page "the tasks in this
78
+ * list", as though the task contained tasks. Incoming edges take the
79
+ * declaration's `inverse` when it has one, and the edge kind in plain
80
+ * words when it does not — which says less and is at least not wrong.
81
+ */
82
+ label: (direction === "out"
83
+ ? describeEdge(store.schema, owner, edge.kind)?.description
84
+ : describeEdge(store.schema, owner, edge.kind)?.inverse) ??
85
+ edge.kind.replace(/-/g, " "),
86
+ ids: [],
87
+ };
88
+ if (!group.ids.includes(otherId))
89
+ group.ids.push(otherId);
90
+ byKey.set(key, group);
91
+ }
92
+ for (const group of byKey.values())
93
+ group.ids.sort();
94
+ return [...byKey.values()].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
95
+ }
96
+ function describeEdge(schema, ownerKind, edgeKind) {
97
+ const edges = schema.tryDefinition(ownerKind)?.edges;
98
+ return edges?.[edgeKind];
99
+ }
100
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../src/connections.tsx"],"names":[],"mappings":"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"}