@graview/primitives 0.1.30 → 0.1.33

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 (161) hide show
  1. package/dist/app-bar.d.ts +2 -0
  2. package/dist/app-bar.d.ts.map +1 -1
  3. package/dist/app-bar.js +9 -2
  4. package/dist/app-bar.js.map +1 -1
  5. package/dist/chat.d.ts +8 -6
  6. package/dist/chat.d.ts.map +1 -1
  7. package/dist/chat.js +6 -3
  8. package/dist/chat.js.map +1 -1
  9. package/dist/default-views.d.ts.map +1 -1
  10. package/dist/default-views.js +24 -4
  11. package/dist/default-views.js.map +1 -1
  12. package/dist/draft-frame.d.ts.map +1 -1
  13. package/dist/draft-frame.js +29 -2
  14. package/dist/draft-frame.js.map +1 -1
  15. package/dist/editable.d.ts.map +1 -1
  16. package/dist/editable.js +42 -9
  17. package/dist/editable.js.map +1 -1
  18. package/dist/find.d.ts.map +1 -1
  19. package/dist/find.js +7 -6
  20. package/dist/find.js.map +1 -1
  21. package/dist/first-look-door.d.ts +2 -2
  22. package/dist/first-look-door.js +2 -2
  23. package/dist/first-look.d.ts.map +1 -1
  24. package/dist/first-look.js +7 -4
  25. package/dist/first-look.js.map +1 -1
  26. package/dist/frame.d.ts +1 -0
  27. package/dist/frame.d.ts.map +1 -1
  28. package/dist/frame.js +2 -0
  29. package/dist/frame.js.map +1 -1
  30. package/dist/index.d.ts +13 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +13 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/inline-ai-door.d.ts +15 -0
  35. package/dist/inline-ai-door.d.ts.map +1 -0
  36. package/dist/inline-ai-door.js +54 -0
  37. package/dist/inline-ai-door.js.map +1 -0
  38. package/dist/inline-ai-env.d.ts +29 -0
  39. package/dist/inline-ai-env.d.ts.map +1 -0
  40. package/dist/inline-ai-env.js +22 -0
  41. package/dist/inline-ai-env.js.map +1 -0
  42. package/dist/inline-ai-menu.d.ts +58 -0
  43. package/dist/inline-ai-menu.d.ts.map +1 -0
  44. package/dist/inline-ai-menu.js +297 -0
  45. package/dist/inline-ai-menu.js.map +1 -0
  46. package/dist/lens/calendar-dates.d.ts.map +1 -1
  47. package/dist/lens/calendar-dates.js +12 -0
  48. package/dist/lens/calendar-dates.js.map +1 -1
  49. package/dist/lens/calendar-options.d.ts +1 -1
  50. package/dist/lens-keeping.js +2 -3
  51. package/dist/lens-keeping.js.map +1 -1
  52. package/dist/map-panel.js +51 -2
  53. package/dist/map-panel.js.map +1 -1
  54. package/dist/notice-place.d.ts +2 -2
  55. package/dist/notice-place.js +2 -2
  56. package/dist/notify-door.d.ts +57 -0
  57. package/dist/notify-door.d.ts.map +1 -0
  58. package/dist/notify-door.js +136 -0
  59. package/dist/notify-door.js.map +1 -0
  60. package/dist/notify-sheet.d.ts +27 -0
  61. package/dist/notify-sheet.d.ts.map +1 -0
  62. package/dist/notify-sheet.js +102 -0
  63. package/dist/notify-sheet.js.map +1 -0
  64. package/dist/pages.d.ts +15 -4
  65. package/dist/pages.d.ts.map +1 -1
  66. package/dist/pages.js +15 -4
  67. package/dist/pages.js.map +1 -1
  68. package/dist/primitives/measure.d.ts +10 -0
  69. package/dist/primitives/measure.d.ts.map +1 -1
  70. package/dist/primitives/measure.js +27 -7
  71. package/dist/primitives/measure.js.map +1 -1
  72. package/dist/quick-ask-desk.d.ts +38 -0
  73. package/dist/quick-ask-desk.d.ts.map +1 -0
  74. package/dist/quick-ask-desk.js +36 -0
  75. package/dist/quick-ask-desk.js.map +1 -0
  76. package/dist/quick-ask-door.d.ts +33 -0
  77. package/dist/quick-ask-door.d.ts.map +1 -0
  78. package/dist/quick-ask-door.js +70 -0
  79. package/dist/quick-ask-door.js.map +1 -0
  80. package/dist/quick-ask-setting.d.ts +9 -0
  81. package/dist/quick-ask-setting.d.ts.map +1 -0
  82. package/dist/quick-ask-setting.js +11 -0
  83. package/dist/quick-ask-setting.js.map +1 -0
  84. package/dist/quick-ask.d.ts +23 -0
  85. package/dist/quick-ask.d.ts.map +1 -0
  86. package/dist/quick-ask.js +327 -0
  87. package/dist/quick-ask.js.map +1 -0
  88. package/dist/record-interactions-door.d.ts +8 -0
  89. package/dist/record-interactions-door.d.ts.map +1 -0
  90. package/dist/record-interactions-door.js +42 -0
  91. package/dist/record-interactions-door.js.map +1 -0
  92. package/dist/record-interactions.d.ts +13 -0
  93. package/dist/record-interactions.d.ts.map +1 -0
  94. package/dist/record-interactions.js +9 -0
  95. package/dist/record-interactions.js.map +1 -0
  96. package/dist/scene-css.d.ts.map +1 -1
  97. package/dist/scene-css.js +47 -13
  98. package/dist/scene-css.js.map +1 -1
  99. package/dist/scene.d.ts +9 -2
  100. package/dist/scene.d.ts.map +1 -1
  101. package/dist/scene.js +8 -1
  102. package/dist/scene.js.map +1 -1
  103. package/dist/shell.d.ts +14 -25
  104. package/dist/shell.d.ts.map +1 -1
  105. package/dist/shell.js +5 -3
  106. package/dist/shell.js.map +1 -1
  107. package/dist/spec-views.d.ts.map +1 -1
  108. package/dist/spec-views.js +6 -3
  109. package/dist/spec-views.js.map +1 -1
  110. package/dist/stretched-link.d.ts +18 -0
  111. package/dist/stretched-link.d.ts.map +1 -0
  112. package/dist/stretched-link.js +47 -0
  113. package/dist/stretched-link.js.map +1 -0
  114. package/dist/timeline.d.ts.map +1 -1
  115. package/dist/timeline.js +23 -2
  116. package/dist/timeline.js.map +1 -1
  117. package/dist/when-input-door.d.ts +8 -0
  118. package/dist/when-input-door.d.ts.map +1 -0
  119. package/dist/when-input-door.js +19 -0
  120. package/dist/when-input-door.js.map +1 -0
  121. package/dist/when-input.d.ts +34 -0
  122. package/dist/when-input.d.ts.map +1 -0
  123. package/dist/when-input.js +122 -0
  124. package/dist/when-input.js.map +1 -0
  125. package/dist/when-picker-door.d.ts +6 -0
  126. package/dist/when-picker-door.d.ts.map +1 -0
  127. package/dist/when-picker-door.js +15 -0
  128. package/dist/when-picker-door.js.map +1 -0
  129. package/dist/when-picker.d.ts +16 -0
  130. package/dist/when-picker.d.ts.map +1 -0
  131. package/dist/when-picker.js +108 -0
  132. package/dist/when-picker.js.map +1 -0
  133. package/dist/workbench/activity.d.ts +4 -0
  134. package/dist/workbench/activity.d.ts.map +1 -1
  135. package/dist/workbench/activity.js +41 -12
  136. package/dist/workbench/activity.js.map +1 -1
  137. package/dist/workbench/agent-seat.d.ts.map +1 -1
  138. package/dist/workbench/agent-seat.js +5 -2
  139. package/dist/workbench/agent-seat.js.map +1 -1
  140. package/dist/workbench/ai-entries.d.ts +22 -0
  141. package/dist/workbench/ai-entries.d.ts.map +1 -0
  142. package/dist/workbench/ai-entries.js +75 -0
  143. package/dist/workbench/ai-entries.js.map +1 -0
  144. package/dist/workbench/ai-feed.d.ts +12 -0
  145. package/dist/workbench/ai-feed.d.ts.map +1 -0
  146. package/dist/workbench/ai-feed.js +14 -0
  147. package/dist/workbench/ai-feed.js.map +1 -0
  148. package/dist/workbench/answer-args.d.ts.map +1 -1
  149. package/dist/workbench/answer-args.js +23 -5
  150. package/dist/workbench/answer-args.js.map +1 -1
  151. package/dist/workbench/inspector.js +1 -1
  152. package/dist/workbench/inspector.js.map +1 -1
  153. package/package.json +6 -6
  154. package/dist/seat-field.d.ts +0 -58
  155. package/dist/seat-field.d.ts.map +0 -1
  156. package/dist/seat-field.js +0 -185
  157. package/dist/seat-field.js.map +0 -1
  158. package/dist/seat-panel.d.ts +0 -38
  159. package/dist/seat-panel.d.ts.map +0 -1
  160. package/dist/seat-panel.js +0 -212
  161. package/dist/seat-panel.js.map +0 -1
@@ -0,0 +1,327 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { layer, pluralOf } from "@graview/core";
3
+ import { aiTargetOf, catalogOf, recordsOfTarget } from "@graview/core/catalog";
4
+ import { search } from "@graview/core/search";
5
+ import { useAiDeskState, useGraview } from "@graview/react/provider";
6
+ import { applyAffordance, deriveAffordances, previewAffordance } from "@graview/tools/derive";
7
+ import { answerHere, targetWords } from "@graview/tools/inline-ai";
8
+ import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
9
+ import { askOf, drawPanel, GhostTray, takeOffer } from "./inline-ai-menu.js";
10
+ import { useInlineEnv } from "./inline-ai-env.js";
11
+ import { VISUALLY_HIDDEN } from "./primitives/measure.js";
12
+ import "./frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
13
+ /** Words that say what kind of row is wanted, not which: "show", "go to", "open". */
14
+ const LEADING = new Set(["show", "go", "to", "open", "the", "a", "an", "me"]);
15
+ const folded = (text) => text.toLowerCase().normalize("NFKD").replace(/[̀-ͯ]/g, "");
16
+ /** Whether every word typed (but the leading ones) is in the row's words. */
17
+ const fits = (label, words) => {
18
+ const said = folded(label);
19
+ return words.every((word) => said.includes(word));
20
+ };
21
+ const sentenceCase = (text) => (text ? `${text[0].toLowerCase()}${text.slice(1)}` : text);
22
+ /** How many of each kind of row the bar lists. */
23
+ const MOST = { act: 4, show: 3, place: 3, record: 4 };
24
+ /** The card's width on a desk, and its distance from what it stands beside and from the window's edges. */
25
+ const WIDTH = 360;
26
+ const GAP = 12;
27
+ export function QuickAskCard({ face, opening, close }) {
28
+ const env = useInlineEnv();
29
+ const { setMenuAt } = useGraview();
30
+ const target = useMemo(() => opening.target ?? aiTargetOf(opening.pointed ?? { about: [] }, (id) => env.store.graph.has(id)), [opening, env.store]);
31
+ const about = useMemo(() => targetWords(env.store, target, env.places), [env.store, target, env.places]);
32
+ const [words, setWords] = useState("");
33
+ const [active, setActive] = useState(-1);
34
+ const [answering, setAnswering] = useState(null);
35
+ const [said, setSaid] = useState(null);
36
+ const pane = useRef(null);
37
+ const field = useRef(null);
38
+ const list = useId();
39
+ const live = useRef(true);
40
+ const { ghost: held } = useAiDeskState(env.desk);
41
+ useEffect(() => () => {
42
+ live.current = false;
43
+ // Put away with a change still proposed on it: the change waits on the tray at the foot instead.
44
+ const waiting = env.desk.get().ghost;
45
+ if (waiting?.onCard)
46
+ env.desk.setGhost({ ...waiting, onCard: false });
47
+ }, [env.desk]);
48
+ /* THE CATALOG OF THIS TARGET: its panels ("Show …") and places, and the acts the derivation offers this viewer on its records. */
49
+ const catalog = useMemo(() => {
50
+ const ask = askOf(env, target);
51
+ return catalogOf(env.store, target, { principal: env.principal, places: env.places, ...(ask.acts ? { acts: ask.acts } : {}) });
52
+ }, [env, target]);
53
+ const acts = useMemo(() => {
54
+ const ids = recordsOfTarget(target);
55
+ if (ids.length === 0)
56
+ return [];
57
+ const offered = new Set(catalog.candidates.flatMap((candidate) => (candidate.type === "act" ? [candidate.mutation] : [])));
58
+ return deriveAffordances(env.store, ids, { principal: env.principal, ...(ids.length === 1 ? { focus: ids[0] } : {}) }).affordances.filter((affordance) => !affordance.destructive && offered.has(affordance.mutation));
59
+ }, [env.store, env.principal, target, catalog]);
60
+ /* Where the keyboard goes when the card is put away: where it was, else the thing it was about, else the face. */
61
+ const putAway = useCallback(() => {
62
+ const back = opening.returnTo;
63
+ const anchor = anchorOf(pane.current, target, face);
64
+ close();
65
+ requestAnimationFrame(() => {
66
+ if (back?.isConnected && !back.closest("[inert]"))
67
+ return back.focus({ preventScroll: true });
68
+ const home = (anchor && anchor.tabIndex >= 0 ? anchor : null) ?? document.querySelector("[data-graview-page-title]") ?? document.querySelector("main");
69
+ if (home && home.tabIndex < 0 && !home.hasAttribute("tabindex"))
70
+ home.setAttribute("tabindex", "-1");
71
+ home?.focus({ preventScroll: true });
72
+ });
73
+ }, [opening.returnTo, target, face, close]);
74
+ const act = useCallback((affordance) => {
75
+ if (affordance.open.length > 0) {
76
+ // An act that asks for something is asked in its own form, on the menu at its subject.
77
+ const box = pane.current?.getBoundingClientRect();
78
+ close();
79
+ setMenuAt({ x: box?.left ?? 0, y: box?.top ?? 0, on: affordance.args["id"] ?? recordsOfTarget(target)[0], about: recordsOfTarget(target) });
80
+ return;
81
+ }
82
+ try {
83
+ previewAffordance(env.store, affordance, {});
84
+ applyAffordance(env.store, affordance, {}, { author: env.principal });
85
+ putAway();
86
+ }
87
+ catch (error) {
88
+ setSaid(error instanceof Error ? error.message : String(error));
89
+ }
90
+ }, [env.store, env.principal, close, putAway, setMenuAt, target]);
91
+ const ask = useCallback(async (question) => {
92
+ const asked = question.trim();
93
+ if (!asked)
94
+ return;
95
+ const before = answering?.result?.answer ? { said: answering.said, answer: answering.result.answer } : undefined;
96
+ setWords("");
97
+ setActive(-1);
98
+ setSaid(null);
99
+ setAnswering({ said: asked, result: null });
100
+ const result = await answerHere(env.ai, { ...askOf(env, target, asked), said: asked, ...(before ? { follows: before } : {}) });
101
+ env.desk.record(result.interaction);
102
+ // Its proposed change is a ghost, drawn on this card: accepted there as one batch, with its one undo.
103
+ if (result.ghost && result.ghost.proposals.length > 0)
104
+ env.desk.setGhost({ ghost: result.ghost, onCard: true });
105
+ if (live.current)
106
+ setAnswering({ said: asked, result });
107
+ }, [answering, env, target]);
108
+ /* Opened with words already (Find's "Ask: ‘…’", Activity's "Ask again"): asked at once. */
109
+ const first = useRef(opening.asked);
110
+ useEffect(() => {
111
+ const asked = first.current;
112
+ first.current = undefined;
113
+ if (asked)
114
+ void ask(asked);
115
+ // Once, as the card opens.
116
+ // eslint-disable-next-line react-hooks/exhaustive-deps
117
+ }, []);
118
+ /* THE ROWS: what fits the words, of each kind, then the words asked. */
119
+ const rows = useMemo(() => {
120
+ const typed = words.trim();
121
+ // An answer card lists nothing until a follow-up is typed: the answer is what it shows.
122
+ if (!typed && answering)
123
+ return [];
124
+ const wanted = folded(typed).split(/\s+/).filter((word) => word && !LEADING.has(word));
125
+ const showing = /^show\b/i.test(typed);
126
+ const going = /^(go|open)\b/i.test(typed);
127
+ const out = [];
128
+ if (!showing && !going) {
129
+ for (const affordance of acts.filter((one) => fits(one.label, wanted)).slice(0, MOST.act)) {
130
+ out.push({ id: `act:${affordance.id}`, kind: "act", label: affordance.label, hint: affordance.open.length > 0 ? "asks more" : "do it", take: () => act(affordance) });
131
+ }
132
+ }
133
+ if (!going) {
134
+ const panels = catalog.candidates.filter((candidate) => candidate.type === "panel");
135
+ for (const panel of panels.filter((one) => fits(`show ${one.label}`, wanted)).slice(0, MOST.show)) {
136
+ out.push({
137
+ id: panel.id,
138
+ kind: "show",
139
+ label: `Show ${sentenceCase(panel.label)}`,
140
+ hint: "a panel",
141
+ take: () => {
142
+ close();
143
+ void drawPanel(env, { title: panel.label, recipe: { ...panel.panel, title: panel.label } });
144
+ },
145
+ });
146
+ }
147
+ }
148
+ if (!showing) {
149
+ for (const place of env.places.filter((one) => fits(one.title, wanted)).slice(0, MOST.place)) {
150
+ out.push({ id: `place:${place.as}`, kind: "place", label: `Go to ${place.title}`, take: () => (close(), env.goTo.place(place.as)) });
151
+ }
152
+ if (wanted.length > 0) {
153
+ const hits = search(env.store, typed.replace(/^(go to|open)\s+/i, ""), { principal: env.principal, from: recordsOfTarget(target), limit: MOST.record }).hits;
154
+ for (const hit of hits) {
155
+ if (hit.about !== "node")
156
+ continue;
157
+ out.push({ id: `record:${hit.id}`, kind: "record", label: hit.label, hint: pluralOf(env.store.schema, hit.kind), take: () => (close(), env.goTo.record(hit.id)) });
158
+ }
159
+ }
160
+ }
161
+ if (typed)
162
+ out.push({ id: "ask", kind: "ask", label: typed, take: () => void ask(typed) });
163
+ return out;
164
+ }, [words, acts, catalog, env, target, act, ask, close, answering]);
165
+ // Words typed light the first row; with none, nothing is lit until the arrows move.
166
+ useEffect(() => setActive(words.trim() ? 0 : -1), [words]);
167
+ /* PLACED BESIDE WHAT IT IS ABOUT, in the top layer, following it as the picture moves. */
168
+ useLayoutEffect(() => {
169
+ const element = pane.current;
170
+ if (!element)
171
+ return;
172
+ if (typeof element.showPopover === "function") {
173
+ try {
174
+ element.showPopover();
175
+ }
176
+ catch {
177
+ // Shown already, or not in the page yet: the ladder's rung still holds it over the rails.
178
+ }
179
+ }
180
+ field.current?.focus({ preventScroll: true });
181
+ let frame = 0;
182
+ const follow = () => {
183
+ placeBeside(element, anchorOf(element, target, face));
184
+ frame = requestAnimationFrame(follow);
185
+ };
186
+ follow();
187
+ return () => cancelAnimationFrame(frame);
188
+ }, [target, face]);
189
+ /* A press outside the bar puts it away; an answer stays until it is closed. */
190
+ useEffect(() => {
191
+ if (answering)
192
+ return;
193
+ const outside = (event) => {
194
+ if (event.target instanceof Node && pane.current?.contains(event.target))
195
+ return;
196
+ close();
197
+ };
198
+ document.addEventListener("pointerdown", outside, true);
199
+ return () => document.removeEventListener("pointerdown", outside, true);
200
+ }, [answering, close]);
201
+ const onKeyDown = (event) => {
202
+ if (event.key === "ArrowDown" && rows.length > 0) {
203
+ event.preventDefault();
204
+ setActive((at) => Math.min(rows.length - 1, at + 1));
205
+ }
206
+ else if (event.key === "ArrowUp" && rows.length > 0) {
207
+ event.preventDefault();
208
+ setActive((at) => Math.max(0, at - 1));
209
+ }
210
+ else if (event.key === "Enter") {
211
+ event.preventDefault();
212
+ const row = rows[active];
213
+ if (row)
214
+ row.take();
215
+ else if (words.trim())
216
+ void ask(words);
217
+ }
218
+ };
219
+ const result = answering?.result ?? null;
220
+ const lit = rows[active];
221
+ return (_jsxs("section", { ref: pane, popover: "manual", role: "region", "aria-label": answering ? `Answer about ${about}` : `Ask about ${about}`, "data-testid": "quick-ask", "data-quick-ask": answering ? "answer" : "bar", "data-quick-ask-face": face, "data-graview-offstage": "", "data-graview-overlay": "", onKeyDown: (event) => {
222
+ if (event.key !== "Escape")
223
+ return;
224
+ // The card's Escape is the card's: the scene's back-out does not hear it too.
225
+ event.preventDefault();
226
+ event.stopPropagation();
227
+ putAway();
228
+ }, onMouseDown: (event) => event.stopPropagation(), style: CARD, children: [_jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 8 }, children: [_jsxs("p", { "data-testid": "quick-ask-about", style: { margin: 0, flex: "1 1 auto", minWidth: 0, fontSize: "0.75rem", color: "var(--graview-ink-muted)", overflowWrap: "anywhere" }, children: ["About ", about] }), _jsx("button", { type: "button", "data-testid": "quick-ask-close", "aria-label": "Close", title: "Close", onClick: putAway, style: ICON, children: _jsx("span", { "aria-hidden": "true", children: "\u2715" }) })] }), answering ? (_jsxs("div", { "data-testid": "quick-answer", style: { display: "grid", gap: 8 }, children: [_jsxs("p", { "data-testid": "quick-answer-asked", style: { margin: 0, fontSize: "0.8125rem", color: "var(--graview-ink-muted)", fontStyle: "italic", overflowWrap: "anywhere" }, children: ["\u201C", answering.said, "\u201D"] }), _jsx("p", { "data-testid": "quick-answer-text", "aria-live": "polite", style: { margin: 0, fontSize: "0.9375rem", lineHeight: 1.45, color: result?.interaction.outcome === "failed" ? "var(--graview-warn)" : "var(--graview-ink)", overflowWrap: "anywhere" }, children: result === null ? "Thinking…" : result.interaction.outcome === "failed" ? (result.interaction.failed ?? "The AI could not answer that here.") : (result.answer ?? "") }), result && result.offers.length > 0 ? (_jsx("ul", { "aria-label": "What acts on it", style: { margin: 0, padding: 0, listStyle: "none", display: "flex", flexWrap: "wrap", gap: 6 }, children: result.offers.map((offer) => (_jsx("li", { children: _jsx("button", { type: "button", "data-testid": "quick-answer-offer", "data-ai-offer": offer.id, "data-ai-offer-type": offer.type, onClick: () => {
229
+ close();
230
+ void takeOffer(env, result, offer);
231
+ }, style: OFFER, children: offer.type === "panel" ? `Show ${sentenceCase(offer.label)}` : offer.type === "place" ? `Go to ${offer.label}` : offer.label }) }, offer.id))) })) : null, held?.onCard && held.ghost.interaction === result?.interaction.id ? _jsx(GhostTray, { placement: "card" }) : null] })) : null, _jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsx("input", { ref: field, type: "text", role: "combobox", "data-testid": "quick-ask-input", "aria-label": answering ? `Ask a follow-up about ${about}` : `Ask about ${about}, or go somewhere`, "aria-expanded": rows.length > 0, "aria-controls": list, "aria-autocomplete": "list", ...(lit ? { "aria-activedescendant": `${list}-${active}` } : {}), autoComplete: "off", enterKeyHint: "go", placeholder: answering ? "Ask a follow-up…" : "Ask, or go to…", value: words,
232
+ // Read-only while it answers, never disabled: a disabled field lets go of the keyboard.
233
+ readOnly: answering !== null && result === null, "aria-busy": answering !== null && result === null, onChange: (event) => setWords(event.target.value), onKeyDown: onKeyDown, style: FIELD }), _jsx("div", { id: list, role: "listbox", "aria-label": words.trim() ? `What “${words.trim()}” finds here` : "What can be done here", hidden: rows.length === 0, style: { display: rows.length === 0 ? "none" : "grid", gap: 1, maxHeight: 280, overflowY: "auto" }, children: rows.map((row, at) => (_jsx("div", { id: `${list}-${at}`, role: "option", "aria-selected": at === active, "data-testid": "quick-ask-option", "data-quick-ask-kind": row.kind, "data-quick-ask-row": row.id, onMouseEnter: () => setActive(at), onMouseDown: (event) => event.preventDefault(), onClick: row.take, style: { ...OPTION, background: at === active ? "var(--graview-panel-muted)" : "transparent", ...(row.kind === "ask" ? { borderTop: "1px solid var(--graview-edge)", marginTop: 2 } : {}) }, children: row.kind === "ask" ? (_jsxs("span", { children: ["Ask: ", _jsxs("span", { style: { fontWeight: 600 }, children: ["\u2018", row.label, "\u2019"] })] })) : (_jsxs("span", { children: [row.label, row.hint ? _jsxs("span", { style: { color: "var(--graview-ink-faint)" }, children: [" \u00B7 ", row.hint] }) : null] })) }, row.id))) })] }), said ? (_jsx("p", { role: "alert", "data-testid": "quick-ask-refused", style: { margin: 0, fontSize: "0.8125rem", color: "var(--graview-warn)" }, children: said })) : null, _jsx("span", { style: VISUALLY_HIDDEN, "aria-live": "polite", children: rows.length > 0 && words.trim() ? `${rows.length} ${rows.length === 1 ? "way" : "ways"} to go on` : "" })] }));
234
+ }
235
+ /**
236
+ * WHAT THE CARD STANDS BESIDE: the record's card or the kind's district on
237
+ * the scene, else where the record is picked from (a district's row, a
238
+ * page's row), else the page's own heading; nothing for a place, and the
239
+ * card stands under the bar.
240
+ */
241
+ function anchorOf(pane, target, face) {
242
+ const root = pane?.closest("[data-graview-embed]") ?? document;
243
+ const ids = target.on === "list" ? [`aggregate:${target.kind}`, `kind:${target.kind}`] : target.on === "lens" && target.kind ? [`aggregate:${target.kind}`] : recordsOfTarget(target);
244
+ for (const id of ids) {
245
+ // The record's own card where the picture draws one; else where it is picked from (a row of a district's list).
246
+ for (const element of root.querySelectorAll(`[data-graview-view="${CSS.escape(id)}"], [data-graview-pick="${CSS.escape(id)}"]`)) {
247
+ if (pane?.contains(element))
248
+ continue;
249
+ const box = element.getBoundingClientRect();
250
+ if (box.width > 0 && box.height > 0)
251
+ return element;
252
+ }
253
+ }
254
+ if (face === "pages")
255
+ return root.querySelector("main [data-graview-page-title]") ?? root.querySelector("main h1");
256
+ return null;
257
+ }
258
+ /** Beside the anchor where the window has room — its right, else its left — else under it (over it, near the window's foot); under the bar for nothing. */
259
+ function placeBeside(pane, anchor) {
260
+ const view = { width: document.documentElement.clientWidth || innerWidth, height: innerHeight };
261
+ const width = Math.min(WIDTH, view.width - 2 * GAP);
262
+ const height = pane.getBoundingClientRect().height;
263
+ const at = anchor?.getBoundingClientRect();
264
+ let left;
265
+ let top;
266
+ let side;
267
+ const clampTop = (wanted) => Math.max(GAP, Math.min(wanted, view.height - height - GAP));
268
+ if (at && at.width > 0 && at.bottom > 0 && at.top < view.height) {
269
+ if (at.right + GAP + width <= view.width - GAP) {
270
+ left = at.right + GAP;
271
+ top = clampTop(at.top);
272
+ side = "right";
273
+ }
274
+ else if (at.left - GAP - width >= GAP) {
275
+ left = at.left - GAP - width;
276
+ top = clampTop(at.top);
277
+ side = "left";
278
+ }
279
+ else {
280
+ left = Math.max(GAP, Math.min(at.left, view.width - width - GAP));
281
+ const below = at.bottom + GAP;
282
+ top = below + height <= view.height - GAP ? below : clampTop(at.top - GAP - height);
283
+ side = below + height <= view.height - GAP ? "below" : "above";
284
+ }
285
+ }
286
+ else {
287
+ left = (view.width - width) / 2;
288
+ top = clampTop(72);
289
+ side = "top";
290
+ }
291
+ const style = pane.style;
292
+ const next = { left: `${Math.round(left)}px`, top: `${Math.round(top)}px`, width: `${Math.round(width)}px` };
293
+ if (style.left !== next.left)
294
+ style.left = next.left;
295
+ if (style.top !== next.top)
296
+ style.top = next.top;
297
+ if (style.width !== next.width)
298
+ style.width = next.width;
299
+ const beside = anchor?.getAttribute("data-graview-view") ?? anchor?.getAttribute("data-graview-pick") ?? (anchor ? "page" : "");
300
+ if (pane.getAttribute("data-quick-ask-beside") !== beside)
301
+ pane.setAttribute("data-quick-ask-beside", beside);
302
+ if (pane.getAttribute("data-quick-ask-side") !== side)
303
+ pane.setAttribute("data-quick-ask-side", side);
304
+ }
305
+ const CARD = {
306
+ position: "fixed",
307
+ inset: "auto",
308
+ margin: 0,
309
+ zIndex: layer("popover"),
310
+ boxSizing: "border-box",
311
+ display: "grid",
312
+ gap: 10,
313
+ padding: 12,
314
+ borderRadius: 12,
315
+ border: "1px solid var(--graview-edge)",
316
+ background: "var(--graview-float)",
317
+ color: "var(--graview-ink)",
318
+ boxShadow: "var(--graview-lift-high)",
319
+ maxHeight: "calc(100dvh - 24px)",
320
+ overflowY: "auto",
321
+ fontSize: "0.875rem",
322
+ };
323
+ const ICON = { display: "inline-grid", placeItems: "center", width: 28, height: 28, padding: 0, font: "inherit", fontSize: "0.875rem", lineHeight: 1, color: "var(--graview-ink-muted)", background: "transparent", border: "1px solid transparent", borderRadius: 6, boxShadow: "none", cursor: "pointer" };
324
+ const FIELD = { boxSizing: "border-box", width: "100%", height: 36, padding: "0 10px", font: "inherit", fontSize: "max(1rem,16px)", color: "var(--graview-ink)", background: "var(--graview-panel)", border: "1px solid var(--graview-edge)", borderRadius: 8 };
325
+ const OPTION = { display: "flex", alignItems: "center", minHeight: 30, padding: "4px 8px", borderRadius: 6, cursor: "pointer", overflowWrap: "anywhere" };
326
+ const OFFER = { display: "inline-flex", alignItems: "center", minHeight: 30, padding: "2px 10px", font: "inherit", fontSize: "0.8125rem", borderRadius: 8 };
327
+ //# sourceMappingURL=quick-ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-ask.js","sourceRoot":"","sources":["../src/quick-ask.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type CSSProperties } from "react";
2
+ export declare function RecordInteractionsDoor({ id, style, headingStyle, className }: {
3
+ readonly id: string;
4
+ readonly style?: CSSProperties;
5
+ readonly headingStyle?: CSSProperties;
6
+ readonly className?: string;
7
+ }): import("react").JSX.Element | null;
8
+ //# sourceMappingURL=record-interactions-door.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-interactions-door.d.ts","sourceRoot":"","sources":["../src/record-interactions-door.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAoD,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AA0B7F,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sCAoBzM"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { retryingImport } from "@graview/core/retry";
3
+ import { lazyModule, useAiDeskState, useGraview } from "@graview/react/provider";
4
+ import { Suspense, useEffect, useMemo } from "react";
5
+ /**
6
+ * WHAT AI DID ON A RECORD, ON ITS PAGE (Roadmap f-activity-ai-entries): the
7
+ * interactions about it — asked of it, offering it, or making a change
8
+ * that wrote it — as Activity draws them, with their undo. Nothing at all
9
+ * while there are none, or when the host says AI is off; the rows are
10
+ * fetched with the first.
11
+ */
12
+ const rowsModule = /* @__PURE__ */ lazyModule(retryingImport(() => import("./record-interactions.js")));
13
+ const Rows = /* @__PURE__ */ rowsModule.part((module, props) => {
14
+ const Drawn = module.RecordInteractions;
15
+ return _jsx(Drawn, { ...props });
16
+ }, { quiet: true });
17
+ /** Whether an entry is about this record: its target names it, it offered it, or a batch it made wrote it. */
18
+ function about(entry, id, written) {
19
+ const target = entry.target;
20
+ const named = target.on === "record" || target.on === "field" ? target.id === id : target.on === "selection" ? target.ids.includes(id) : target.on === "act" ? target.id === id : false;
21
+ return named || entry.offered.some((offer) => offer.id === `record:${id}` || offer.id.startsWith(`fill:${id}:`)) || (entry.batches ?? []).some((batch) => written(batch).includes(id));
22
+ }
23
+ export function RecordInteractionsDoor({ id, style, headingStyle, className }) {
24
+ const { ai, aiDesk, store } = useGraview();
25
+ const { entries } = useAiDeskState(aiDesk);
26
+ const off = ai.off === true;
27
+ useEffect(() => {
28
+ if (!off)
29
+ aiDesk.load();
30
+ }, [aiDesk, off]);
31
+ const length = store.log.length;
32
+ const here = useMemo(() => {
33
+ const written = (batch) => store.log.all().flatMap((op) => (op.batch === batch ? op.writes : []));
34
+ return entries.filter((entry) => about(entry, id, written));
35
+ // The log only grows at its end: its length says when to read it again.
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [entries, id, store, length]);
38
+ if (off || here.length === 0)
39
+ return null;
40
+ return (_jsx(Suspense, { fallback: null, children: _jsx(Rows, { entries: here, ...(style ? { style } : {}), ...(headingStyle ? { headingStyle } : {}), ...(className ? { className } : {}) }) }));
41
+ }
42
+ //# sourceMappingURL=record-interactions-door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-interactions-door.js","sourceRoot":"","sources":["../src/record-interactions-door.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AiInteraction } from "@graview/core/catalog";
2
+ import type { CSSProperties } from "react";
3
+ import "./frame.js";
4
+ export interface RecordInteractionsProps {
5
+ readonly entries: readonly AiInteraction[];
6
+ /** The section's own look and its heading's, where the page has them. */
7
+ readonly style?: CSSProperties;
8
+ readonly headingStyle?: CSSProperties;
9
+ readonly className?: string;
10
+ }
11
+ /** The AI's entries about one record, as Activity draws them — fetched with the first (`record-interactions-door.tsx`). */
12
+ export declare function RecordInteractions({ entries, style, headingStyle, className }: RecordInteractionsProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=record-interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-interactions.d.ts","sourceRoot":"","sources":["../src/record-interactions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,2HAA2H;AAC3H,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAWtG"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { UndoTurn } from "./workbench/activity.js";
3
+ import { InteractionRow } from "./workbench/ai-entries.js";
4
+ import "./frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
5
+ /** The AI's entries about one record, as Activity draws them — fetched with the first (`record-interactions-door.tsx`). */
6
+ export function RecordInteractions({ entries, style, headingStyle, className }) {
7
+ return (_jsxs("section", { ...(className ? { className } : {}), "data-testid": "record-ai", "aria-label": "What AI did here", style: { display: "grid", gap: 10, ...style }, children: [_jsx("h2", { style: headingStyle ?? { margin: 0, fontSize: "1rem" }, children: "What AI did here" }), _jsx("ol", { style: { margin: 0, padding: 0, listStyle: "none", display: "grid", gap: 8, fontSize: "0.875rem" }, children: entries.slice(0, 8).map((entry) => (_jsx(InteractionRow, { entry: entry, undo: (batch) => _jsx(UndoTurn, { batch: batch }) }, entry.id))) })] }));
8
+ }
9
+ //# sourceMappingURL=record-interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-interactions.js","sourceRoot":"","sources":["../src/record-interactions.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,YAAY,CAAC,CAAC,2FAA2F;AAUhH,2HAA2H;AAC3H,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAA2B;IACrG,OAAO,CACL,sBAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAc,WAAW,gBAAY,kBAAkB,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,aAChJ,aAAI,KAAK,EAAE,YAAY,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,iCAAuB,EACjF,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,YACnG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAClC,KAAC,cAAc,IAAgB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,GAAI,IAAnE,KAAK,CAAC,EAAE,CAA+D,CAC7F,CAAC,GACC,IACG,CACX,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scene-css.d.ts","sourceRoot":"","sources":["../src/scene-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAA0C,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AA2zCtG,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,MAAM,GAAE,MAAe,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAGvF;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,GAAE,MAAe,EAAE,KAAK,GAAE,KAAqB,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAGrH"}
1
+ {"version":3,"file":"scene-css.d.ts","sourceRoot":"","sources":["../src/scene-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAA0C,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AA61CtG,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,MAAM,GAAE,MAAe,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAGvF;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,GAAE,MAAe,EAAE,KAAK,GAAE,KAAqB,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAGrH"}
package/dist/scene-css.js CHANGED
@@ -181,8 +181,7 @@ ${ /* The press: the whole name, laid over it. */""}
181
181
  ${ /* THE OTHERS: people and their agents in the city, each a small figure in
182
182
  the scene's own line vocabulary with a name under it. They move by a
183
183
  transition on transform — one number, the layout tween's curve — so a
184
- quiet city runs nothing. This tab's own seat is not drawn here: the
185
- ask field is where it speaks. */""}
184
+ quiet city runs nothing. This tab's own seat is not drawn here. */""}
186
185
  .graview-occupants {
187
186
  position: absolute;
188
187
  inset: 0;
@@ -245,16 +244,18 @@ ${ /* THE OTHERS: people and their agents in the city, each a small figure in
245
244
  ${ /* ANOTHER PERSON, on your map: a head and shoulders in their own hue, at
246
245
  the plot their stop names or in the audience row of the showing they are
247
246
  watching. Press to follow them; their name is under them like a robot's. */""}
247
+ ${ /* A fingertip wide, the head and shoulders drawn 22 wide inside it: at 22 a press beside the next person's was a press too small to tell them apart. */""}
248
248
  .graview-figure[data-graview-person] .graview-figure-body {
249
- left: -11px;
249
+ left: -12px;
250
250
  top: -24px;
251
- width: 22px;
251
+ width: 24px;
252
252
  height: 24px;
253
253
  min-height: 0;
254
254
  }
255
255
  .graview-figure[data-graview-person] .graview-figure-body svg {
256
256
  width: 22px;
257
257
  height: 24px;
258
+ margin: 0 auto;
258
259
  }
259
260
  .graview-figure[data-graview-person][data-graview-followed] .graview-figure-body {
260
261
  color: var(--graview-accent);
@@ -1106,8 +1107,12 @@ ${ /* Over the plot and its blocks, or beside it, where the ground under it is t
1106
1107
  opacity: 1;
1107
1108
  pointer-events: auto;
1108
1109
  }
1110
+ ${ /* And a district whose showings stand open under its name: they hang over
1111
+ the ground beside it, and a neighbor later in the city's order stood over
1112
+ them, so a press on "The fortnight" landed on the volunteers' district. */""}
1109
1113
  [data-graview-altitude] [data-graview-plot]:hover,
1110
- [data-graview-altitude] [data-graview-plot]:focus-within {
1114
+ [data-graview-altitude] [data-graview-plot]:focus-within,
1115
+ [data-graview-altitude] [data-graview-plot]:has(.graview-drive-in[data-graview-showing]) {
1111
1116
  z-index: ${SCENE_LAYERS.opened} !important;
1112
1117
  }
1113
1118
  ${ /* A landmark WITHOUT a plot — a nested card — keeps its plate floating
@@ -1120,7 +1125,8 @@ ${ /* THE SHOWINGS COME UP WHEN THE DISTRICT IS REACHED FOR: under its name,
1120
1125
  on a backing of their own, and in the bar's place list always. */""}
1121
1126
  [data-graview-altitude] .graview-drive-in {
1122
1127
  ${ /* Straight under the name, touching it, so the hand that reached for the name reaches the showings without crossing a gap. */""}
1123
- top: calc(var(--graview-front-y, 42px) + var(--graview-plate-h, 26px));
1128
+ ${ /* The name stands 4 pixels below the front (above); its height is as drawn, measured into --graview-plate-h. */""}
1129
+ top: calc(var(--graview-front-y, 42px) + 4px + var(--graview-plate-h, 28px));
1124
1130
  padding: 4px 6px;
1125
1131
  border-radius: 5px;
1126
1132
  background: var(--graview-panel);
@@ -1146,10 +1152,9 @@ ${ /* THE LANDMARK STANDS IN THE SQUARE: its feet at the plot's center, among
1146
1152
  }
1147
1153
  ${ /* ZOOM, in the ground's corner: the way a map carries its own. Two
1148
1154
  fingertip-sized buttons and the level between them, shown from altitude. */""}
1149
- ${ /* THE SCENE'S FOOT: a sheet over it, and on a phone the ask field across
1150
- it. On a desk the field stands at the foot's other end; on a phone it is
1151
- the foot's whole width, and the zoom stood under it, every control of it
1152
- covered (the watch's "control-covered", the tenth walk's carried pass). */""}
1155
+ ${ /* THE SCENE'S FOOT: a sheet over it. A control at the foot stood under
1156
+ what was laid over it once, every control of it covered (the watch's
1157
+ "control-covered", the tenth walk's carried pass). */""}
1153
1158
  .graview-zoom,
1154
1159
  .graview-edge-sign {
1155
1160
  --graview-scene-foot: var(--graview-sheet, 0px);
@@ -1157,12 +1162,13 @@ ${ /* THE SCENE'S FOOT: a sheet over it, and on a phone the ask field across
1157
1162
  @container (max-width: 639px) {
1158
1163
  .graview-zoom,
1159
1164
  .graview-edge-sign {
1160
- --graview-scene-foot: calc(var(--graview-sheet, 0px) + var(--graview-foot-room, 0px));
1165
+ ${ /* A sheet stands over the field, so the foot is the taller of the two, not both. */""}
1166
+ --graview-scene-foot: max(var(--graview-sheet, 0px), var(--graview-foot-room, 0px));
1161
1167
  }
1162
1168
  }
1163
1169
  .graview-zoom {
1164
1170
  position: absolute;
1165
- ${ /* Clear of a panel floating over the scene's right edge, or a sheet over its foot, or the ask field across it. */""}
1171
+ ${ /* Clear of a panel floating over the scene's right edge, or a sheet over its foot. */""}
1166
1172
  right: calc(16px + var(--graview-dock, 0px));
1167
1173
  bottom: calc(16px + var(--graview-scene-foot, var(--graview-sheet, 0px)));
1168
1174
  ${ /* Above the occupants: a robot walking past a control must not cover it. */""}
@@ -1243,7 +1249,35 @@ ${ /* AND NOT FROM ALTITUDE, where a district is a village on a plot and its
1243
1249
  outline: none;
1244
1250
  }
1245
1251
  [data-graview-stage="dom"] [data-graview-view] > :not([data-graview-natural]),
1246
- [data-graview-stage="dom"] [data-graview-view] > [data-graview-natural] > * {
1252
+ [data-graview-stage="dom"] [data-graview-view] > [data-graview-natural] > *,
1253
+ [data-graview-stage="gpu"][data-graview-hit="platform"] > [data-graview-view] > :not([data-graview-natural]),
1254
+ [data-graview-stage="gpu"][data-graview-hit="platform"] > [data-graview-view] > [data-graview-natural] > * {
1255
+ pointer-events: auto;
1256
+ }
1257
+ ${ /* A DISTRICT TAKES A PRESS ON ITS OWN GROUND, not on the box around it.
1258
+ Its card is the plot's bounding box, and the box's four corners are bare
1259
+ ground the next district's name may stand on (the layout keeps names off
1260
+ a neighbor's diamond, not its box): a phone's "CATEGORIES 2 ⚠ 2" ended
1261
+ over the corner of the vendors' box, and a press on "⚠ 2" landed on the
1262
+ vendors. So the card itself takes no press; a diamond over its plot
1263
+ does, and its name and its showings take theirs as before, unless a
1264
+ rule above hides them (a name said "none", showings not come up yet).
1265
+ After the rule above, which hands every view's content the press. */""}
1266
+ [data-graview-altitude] [data-graview-view][data-graview-plot] > .graview-kind-card {
1267
+ pointer-events: none;
1268
+ }
1269
+ [data-graview-altitude] [data-graview-plot] > .graview-kind-card > .graview-kind-face:not([data-graview-nameplate="none"]),
1270
+ [data-graview-altitude] [data-graview-plot] > .graview-kind-card > .graview-drive-in {
1271
+ pointer-events: auto;
1272
+ }
1273
+ [data-graview-altitude] [data-graview-plot] > .graview-kind-card::before {
1274
+ content: "";
1275
+ position: absolute;
1276
+ left: 0;
1277
+ top: 0;
1278
+ width: 100%;
1279
+ height: calc(2 * var(--graview-center-y, 50%));
1280
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
1247
1281
  pointer-events: auto;
1248
1282
  }
1249
1283
  ${ /* THE RECORD IN FOCUS KEEPS TO ITS BOX (FR-141). Whatever draws it — the