@graview/primitives 0.1.64 → 0.1.65

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 (127) hide show
  1. package/README.md +1 -1
  2. package/dist/app-bar.js +1 -1
  3. package/dist/app-bar.js.map +1 -1
  4. package/dist/chat.js +1 -1
  5. package/dist/chat.js.map +1 -1
  6. package/dist/find.js +3 -3
  7. package/dist/find.js.map +1 -1
  8. package/dist/first-look.js +1 -1
  9. package/dist/first-look.js.map +1 -1
  10. package/dist/here.d.ts +1 -1
  11. package/dist/here.js +2 -2
  12. package/dist/here.js.map +1 -1
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/inline-ai-menu.d.ts +4 -2
  18. package/dist/inline-ai-menu.d.ts.map +1 -1
  19. package/dist/inline-ai-menu.js +34 -8
  20. package/dist/inline-ai-menu.js.map +1 -1
  21. package/dist/kind-stop.d.ts.map +1 -1
  22. package/dist/kind-stop.js +204 -21
  23. package/dist/kind-stop.js.map +1 -1
  24. package/dist/lines-key.d.ts.map +1 -1
  25. package/dist/lines-key.js +22 -2
  26. package/dist/lines-key.js.map +1 -1
  27. package/dist/map-panel.js +98 -6
  28. package/dist/map-panel.js.map +1 -1
  29. package/dist/menu-rank.d.ts +25 -0
  30. package/dist/menu-rank.d.ts.map +1 -0
  31. package/dist/menu-rank.js +56 -0
  32. package/dist/menu-rank.js.map +1 -0
  33. package/dist/menu-told-door.d.ts +17 -0
  34. package/dist/menu-told-door.d.ts.map +1 -0
  35. package/dist/menu-told-door.js +49 -0
  36. package/dist/menu-told-door.js.map +1 -0
  37. package/dist/menu-told.d.ts +37 -0
  38. package/dist/menu-told.d.ts.map +1 -0
  39. package/dist/menu-told.js +66 -0
  40. package/dist/menu-told.js.map +1 -0
  41. package/dist/menu-words.d.ts +15 -0
  42. package/dist/menu-words.d.ts.map +1 -0
  43. package/dist/menu-words.js +28 -0
  44. package/dist/menu-words.js.map +1 -0
  45. package/dist/pages.d.ts +2 -0
  46. package/dist/pages.d.ts.map +1 -1
  47. package/dist/pages.js +2 -0
  48. package/dist/pages.js.map +1 -1
  49. package/dist/quick-ask-desk.d.ts +16 -0
  50. package/dist/quick-ask-desk.d.ts.map +1 -1
  51. package/dist/quick-ask-desk.js +20 -0
  52. package/dist/quick-ask-desk.js.map +1 -1
  53. package/dist/quick-ask-door.d.ts.map +1 -1
  54. package/dist/quick-ask-door.js +5 -0
  55. package/dist/quick-ask-door.js.map +1 -1
  56. package/dist/quick-ask-plan.d.ts +52 -0
  57. package/dist/quick-ask-plan.d.ts.map +1 -0
  58. package/dist/quick-ask-plan.js +112 -0
  59. package/dist/quick-ask-plan.js.map +1 -0
  60. package/dist/quick-ask.d.ts.map +1 -1
  61. package/dist/quick-ask.js +341 -19
  62. package/dist/quick-ask.js.map +1 -1
  63. package/dist/scene-css.d.ts.map +1 -1
  64. package/dist/scene-css.js +16 -6
  65. package/dist/scene-css.js.map +1 -1
  66. package/dist/scene-places.d.ts +3 -2
  67. package/dist/scene-places.d.ts.map +1 -1
  68. package/dist/scene-places.js +47 -8
  69. package/dist/scene-places.js.map +1 -1
  70. package/dist/scene.d.ts +2 -0
  71. package/dist/scene.d.ts.map +1 -1
  72. package/dist/scene.js +2 -0
  73. package/dist/scene.js.map +1 -1
  74. package/dist/section-better.d.ts +38 -0
  75. package/dist/section-better.d.ts.map +1 -0
  76. package/dist/section-better.js +411 -0
  77. package/dist/section-better.js.map +1 -0
  78. package/dist/section-door.d.ts +32 -0
  79. package/dist/section-door.d.ts.map +1 -0
  80. package/dist/section-door.js +32 -0
  81. package/dist/section-door.js.map +1 -0
  82. package/dist/section-menu.d.ts +18 -0
  83. package/dist/section-menu.d.ts.map +1 -0
  84. package/dist/section-menu.js +76 -0
  85. package/dist/section-menu.js.map +1 -0
  86. package/dist/section-outline.d.ts +8 -0
  87. package/dist/section-outline.d.ts.map +1 -0
  88. package/dist/section-outline.js +48 -0
  89. package/dist/section-outline.js.map +1 -0
  90. package/dist/section-words.d.ts +24 -0
  91. package/dist/section-words.d.ts.map +1 -0
  92. package/dist/section-words.js +91 -0
  93. package/dist/section-words.js.map +1 -0
  94. package/dist/shell.d.ts.map +1 -1
  95. package/dist/shell.js +2 -1
  96. package/dist/shell.js.map +1 -1
  97. package/dist/subject.js +2 -2
  98. package/dist/subject.js.map +1 -1
  99. package/dist/told-card.d.ts +66 -0
  100. package/dist/told-card.d.ts.map +1 -0
  101. package/dist/told-card.js +197 -0
  102. package/dist/told-card.js.map +1 -0
  103. package/dist/told-listed.d.ts +14 -0
  104. package/dist/told-listed.d.ts.map +1 -0
  105. package/dist/told-listed.js +46 -0
  106. package/dist/told-listed.js.map +1 -0
  107. package/dist/told-panel-door.d.ts +17 -0
  108. package/dist/told-panel-door.d.ts.map +1 -0
  109. package/dist/told-panel-door.js +6 -0
  110. package/dist/told-panel-door.js.map +1 -0
  111. package/dist/told-panel.d.ts +19 -0
  112. package/dist/told-panel.d.ts.map +1 -0
  113. package/dist/told-panel.js +83 -0
  114. package/dist/told-panel.js.map +1 -0
  115. package/dist/told-ui.d.ts +5 -0
  116. package/dist/told-ui.d.ts.map +1 -0
  117. package/dist/told-ui.js +12 -0
  118. package/dist/told-ui.js.map +1 -0
  119. package/dist/workbench/ai-entries.d.ts.map +1 -1
  120. package/dist/workbench/ai-entries.js +23 -2
  121. package/dist/workbench/ai-entries.js.map +1 -1
  122. package/dist/workbench/back-out.js +1 -1
  123. package/dist/workbench/back-out.js.map +1 -1
  124. package/dist/workbench/inspector.d.ts.map +1 -1
  125. package/dist/workbench/inspector.js +218 -18
  126. package/dist/workbench/inspector.js.map +1 -1
  127. package/package.json +6 -6
@@ -190,7 +190,7 @@ export function OverviewButton() {
190
190
  */
191
191
  const label = overview ? "Close the map" : "Up";
192
192
  const said = overview && landing ? `Close the map, down to ${landing}` : label;
193
- return (_jsxs("button", { type: "button", "data-testid": "overview", className: "graview-altitude-control", "aria-pressed": overview, "aria-label": said, title: overview ? said : "Up — the whole thing, from above",
193
+ return (_jsxs("button", { type: "button", "data-testid": "overview", className: "graview-altitude-control", "aria-pressed": overview, "aria-label": said, title: overview ? said : "Up — everything, from above",
194
194
  // A view state, so it is a URL, the back button works, and the cards
195
195
  // already on screen fly out into the ring rather than being replaced.
196
196
  onClick: () => (overview ? descend() : go(withOverview(view, true))),
@@ -1 +1 @@
1
- {"version":3,"file":"back-out.js","sourceRoot":"","sources":["../../src/workbench/back-out.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"back-out.js","sourceRoot":"","sources":["../../src/workbench/back-out.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/workbench/inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4E,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAKrI,OAAO,EAAgI,KAAK,gBAAgB,EAAoB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAMxN,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,aAAa,CAAC;AAErB;;;;;;GAMG;AACH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,IAAI,CAGvI;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAmB,EAAE,MAAa,EAAE,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,sCAKhJ"}
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/workbench/inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4E,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAKrI,OAAO,EAAgI,KAAK,gBAAgB,EAAoB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUxN,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,aAAa,CAAC;AAErB;;;;;;GAMG;AACH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,IAAI,CAGvI;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAmB,EAAE,MAAa,EAAE,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,sCAKhJ"}
@@ -10,6 +10,10 @@ import { Fragment, useEffect, useLayoutEffect, useMemo, useRef, useState } from
10
10
  import { AnswerArgs, nameOf } from "./answer-args.js";
11
11
  import { VISUALLY_HIDDEN } from "../primitives/index.js";
12
12
  import { ROVING_ITEM, useRoving } from "../roving.js";
13
+ import { menuMatches } from "../menu-words.js";
14
+ import { MENU_RANK_FLOOR, useFastRank } from "../menu-rank.js";
15
+ import { TOLD_SUGGESTED_MOST, useToldSuggestions } from "../menu-told-door.js";
16
+ import { openQuickAsk, preloadQuickAsk, useQuickAskDrawn, whereMenuStands } from "../quick-ask-desk.js";
13
17
  import "../frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
14
18
  /**
15
19
  * The pane itself (`Inspector` in `./inspector-door.tsx` draws it): what is
@@ -44,19 +48,29 @@ export function InspectorPane({ placement = "float", chosen = true } = {}) {
44
48
  * "Acts…", which opens the same menu. Measured from the scene's box, so it
45
49
  * stands in the box it is drawn in; under Up and the key, in the picture's
46
50
  * column of controls, because at the picture's foot a notice stood over it.
51
+ * On a phone's ground Up and the Key share a row above the picture, and a
52
+ * card under it takes the width: "Acts…" stands in that row too, to the
53
+ * left of them, where it covers no card's "Open".
47
54
  */
48
55
  function ChosenActs() {
49
56
  const { store, setMenuAt, view } = useGraview();
50
57
  const { selection } = useSelection();
51
58
  const mark = useRef(null);
52
59
  const [width, setWidth] = useState(null);
60
+ // How far from the right the row's leftmost control (the Key, else Up) stands: "Acts…" goes to its left.
61
+ const [rowRight, setRowRight] = useState(null);
53
62
  useLayoutEffect(() => {
54
63
  const parent = mark.current?.offsetParent ?? mark.current?.parentElement;
55
64
  if (!parent)
56
65
  return;
57
- const measured = Math.round(parent.getBoundingClientRect().width);
66
+ const box = parent.getBoundingClientRect();
67
+ const measured = Math.round(box.width);
58
68
  if (measured !== width)
59
69
  setWidth(measured);
70
+ const row = [...parent.querySelectorAll('[data-testid="lines-key"][data-graview-up-row], [data-testid="overview"]')].map((one) => one.getBoundingClientRect()).filter((one) => one.width > 0 && one.top - box.top < 40);
71
+ const right = row.length > 0 ? Math.round(box.right - Math.min(...row.map((one) => one.left)) + 8) : null;
72
+ if (right !== rowRight)
73
+ setRowRight(right);
60
74
  });
61
75
  const one = selection.length === 1 && !view.overview ? store.graph.getNode(selection[0]) : undefined;
62
76
  if (!one || width === null || width >= RAIL_NEEDS)
@@ -64,12 +78,12 @@ function ChosenActs() {
64
78
  return (_jsx("button", { type: "button", ref: mark, "data-testid": "chosen-acts", "aria-label": `What can be done with ${nameOf(store, one.id)}`, "aria-haspopup": "menu", onClick: (event) => {
65
79
  const at = event.currentTarget.getBoundingClientRect();
66
80
  setMenuAt({ x: Math.round(at.right), y: Math.round(at.bottom + 4), on: one.id });
67
- }, style: { position: "absolute", right: "calc(14px + var(--graview-dock, 0px))", top: 98, zIndex: "var(--graview-layer-overview, 10)", minHeight: 30, padding: "0 12px", borderRadius: 8, fontSize: "0.8125rem", background: "var(--graview-float)", boxShadow: "var(--graview-lift-low)" }, children: "Acts\u2026" }));
81
+ }, style: { position: "absolute", ...(rowRight !== null ? { right: rowRight, top: 14, minHeight: 38 } : { right: "calc(14px + var(--graview-dock, 0px))", top: 98 }), zIndex: "var(--graview-layer-overview, 10)", ...(rowRight === null ? { minHeight: 30 } : {}), padding: "0 12px", borderRadius: 8, fontSize: "0.8125rem", background: "var(--graview-float)", boxShadow: "var(--graview-lift-low)" }, children: "Acts\u2026" }));
68
82
  }
69
83
  /** Whether the picture has room for a rail beside it: the scene's own box, not the window's. */
70
84
  const RAIL_NEEDS = 14 + 236 + 14 + 300;
71
85
  function Pane({ placement }) {
72
- const { store, menuAt, setMenuAt, view, signIn } = useGraview();
86
+ const { store, menuAt, setMenuAt, view, signIn, aiDesk, ai, principal } = useGraview();
73
87
  /*
74
88
  * The pane is positioned within the SCENE'S BOX, not the window. It was
75
89
  * fixed to the viewport, which put it at the page's edge when the scene
@@ -222,7 +236,7 @@ function Pane({ placement }) {
222
236
  */
223
237
  const target = menuAt === null
224
238
  ? null
225
- : { face: menuAt.face ?? "scene", on: menuAt.on, about: selection, field: menuAt.field, place: menuAt.place, href: menuAt.href, act: menuAt.act, column: menuAt.column, element: menuAt.returnTo };
239
+ : { face: menuAt.face ?? "scene", on: menuAt.on, about: selection, field: menuAt.field, place: menuAt.place, href: menuAt.href, act: menuAt.act, column: menuAt.column, ...(menuAt.section ? { section: menuAt.section } : {}), element: menuAt.returnTo };
226
240
  const beside = useMenuSections(target);
227
241
  /*
228
242
  * Whether the derivation is withholding a creating act for want of the
@@ -249,7 +263,48 @@ function Pane({ placement }) {
249
263
  * and the eleventh act of a menu was twenty-one Tabs from the key that
250
264
  * opened it (walks XI and XII).
251
265
  */
252
- const roving = useRoving({ letters: true });
266
+ /*
267
+ * In the menu a letter is typed into the menu's own field instead (Roadmap
268
+ * f-menu-type-anything), so the menu's list takes no letters: only the
269
+ * strip keeps the type-ahead.
270
+ */
271
+ const roving = useRoving({ letters: menuAt === null });
272
+ /*
273
+ * WHAT IS TYPED IN THE MENU (Roadmap f-menu-type-anything): every row —
274
+ * the acts, the withheld, Open, Copy link, Show, Inspect — narrowed to
275
+ * those whose words begin with it (`menuMatches`), Enter running the one
276
+ * lit; and, where the host lent the app a model, the words asked of it
277
+ * about what the menu was opened on, as the last row. A new menu starts
278
+ * with nothing typed.
279
+ */
280
+ const [typed, setTyped] = useState("");
281
+ const typeField = useRef(null);
282
+ useEffect(() => setTyped(""), [menuAt]);
283
+ /* Asked where the quick ask is drawn at all: a host's model, AI not off, the app's setting on. */
284
+ const asks = useQuickAskDrawn(aiDesk);
285
+ /* What worked before, like the words typed here (Roadmap f-menu-learns): kept tellings re-aimed at what the menu is on, ranked with the rows. */
286
+ const toldLike = useToldSuggestions(asks ? ai : undefined, store, principal, menuAt === null ? "" : typed, menuAt?.on, menuAt);
287
+ /* The Fast slot's ranking of every row the menu could show, for the words typed, once the typing rests (`useFastRank`). */
288
+ const rankRows = useMemo(() => menuAt === null
289
+ ? []
290
+ : [
291
+ ...beside.start.flatMap((section) => (section.items ?? []).map((item) => ({ key: `item:${item.id}`, label: item.label }))),
292
+ ...affordances.map((affordance) => ({ key: `act:${affordance.id}`, label: affordance.label })),
293
+ ...beside.end.flatMap((section) => (section.items ?? []).map((item) => ({ key: `item:${item.id}`, label: item.label }))),
294
+ ...toldLike.map((one) => ({ key: one.key, label: one.label })),
295
+ ], [menuAt, beside, affordances, toldLike]);
296
+ const fastRanked = useFastRank(ai, menuAt === null ? "" : typed, rankRows);
297
+ /*
298
+ * NOTHING MOVES UNDER A POINTER ON A ROW: while it rests on one, a ranking
299
+ * that arrives is held, and the rows stay as they were drawn; it applies
300
+ * once the pointer is off the rows. What the person types still narrows
301
+ * at once — that is theirs.
302
+ */
303
+ const [onRow, setOnRow] = useState(false);
304
+ const heldRank = useRef({ words: "", rank: null });
305
+ if (!onRow)
306
+ heldRank.current = { words: typed.trim(), rank: fastRanked };
307
+ const fastRank = onRow ? (heldRank.current.words === typed.trim() ? heldRank.current.rank : null) : fastRanked;
253
308
  /*
254
309
  * A REFUSAL IS A RESULT, said where the button was pressed.
255
310
  *
@@ -469,8 +524,102 @@ function Pane({ placement }) {
469
524
  const matched = searchable && trimmedQuery.length > 0
470
525
  ? arranged.filter((entry) => `${entry.label} ${entry.why}`.toLowerCase().includes(trimmedQuery))
471
526
  : null;
472
- const shown = matched ?? (expanded || atPointer ? arranged : arranged.slice(0, fits));
473
- const hidden = matched ? 0 : arranged.length - shown.length;
527
+ /* Typed in the menu: its words, and whether a row's label begins with them. */
528
+ const words = atPointer ? typed.trim() : "";
529
+ /* A row fits what is typed when its words begin with it, or when the Fast slot finds it likely enough. */
530
+ const fitsTyped = (key, label) => words === "" || menuMatches(label, words) || (fastRank?.get(key) ?? 0) >= MENU_RANK_FLOOR;
531
+ const shown = (matched ?? (expanded || atPointer ? arranged : arranged.slice(0, fits))).filter((entry) => fitsTyped(`act:${entry.id}`, entry.label));
532
+ const hidden = matched || words ? 0 : arranged.length - shown.length;
533
+ const withheldShown = words ? withheld.filter((action) => fitsTyped(`act:${action.id}`, action.label)) : withheld;
534
+ /* A section's rows narrowed to what is typed; one drawn in place of rows (the AI's) stands down while words are typed, the Ask row below standing for it. */
535
+ const narrowed = (list) => words === ""
536
+ ? list
537
+ : list.flatMap((section) => {
538
+ const items = (section.items ?? []).filter((item) => fitsTyped(`item:${item.id}`, item.label));
539
+ return items.length > 0 ? [{ id: section.id, ...(section.heading ? { heading: section.heading } : {}), items }] : [];
540
+ });
541
+ const startSections = narrowed(beside.start);
542
+ const endSections = narrowed(beside.end);
543
+ /* What the words are asked about, said in the Ask row: the menu's title, the one record, else "this". */
544
+ const askedAbout = menuAt?.title ?? (selection.length === 1 ? nameOf(store, selection[0]) : selection.length > 1 ? `${selection.length} selected` : "this");
545
+ const askRow = atPointer && words !== "" && asks;
546
+ /* Up to two that worked before, the Fast slot's likeliest first once it has answered. */
547
+ const toldShown = atPointer && words !== "" ? (fastRank === null ? toldLike : [...toldLike].sort((a, b) => (fastRank.get(b.key) ?? 0) - (fastRank.get(a.key) ?? 0))).slice(0, TOLD_SUGGESTED_MOST) : [];
548
+ /*
549
+ * THE ROW ENTER RUNS FROM THE FIELD, lit: the first that fits the words
550
+ * — never one that cannot be taken back, which keeps its aimed press —
551
+ * else the Ask row. Nothing is lit with nothing typed.
552
+ */
553
+ /* The Fast slot's best among the rows shown, when it has answered for these words. */
554
+ const shownKeys = [
555
+ ...startSections.flatMap((section) => (section.items ?? []).map((item) => `item:${item.id}`)),
556
+ ...shown.filter((entry) => !entry.destructive).map((entry) => `act:${entry.id}`),
557
+ ...endSections.flatMap((section) => (section.items ?? []).map((item) => `item:${item.id}`)),
558
+ ...toldShown.map((one) => one.key),
559
+ ];
560
+ const ranked = fastRank === null ? undefined : [...shownKeys].sort((a, b) => (fastRank.get(b) ?? 0) - (fastRank.get(a) ?? 0)).find((key) => (fastRank.get(key) ?? 0) >= MENU_RANK_FLOOR);
561
+ const lit = words === ""
562
+ ? null
563
+ : (ranked ??
564
+ startSections.flatMap((section) => (section.items ?? []).map((item) => `item:${item.id}`))[0] ??
565
+ shown.filter((entry) => !entry.destructive).map((entry) => `act:${entry.id}`)[0] ??
566
+ endSections.flatMap((section) => (section.items ?? []).map((item) => `item:${item.id}`))[0] ??
567
+ (askRow ? "ask" : null));
568
+ const ask = () => {
569
+ if (!menuAt)
570
+ return;
571
+ const asked = words;
572
+ const back = menuAt.returnTo ?? null;
573
+ // The card opens where the menu stood, read before the menu goes.
574
+ const from = whereMenuStands(asideRef.current);
575
+ setMenuAt(null);
576
+ // The quick ask's card, where the menu stood, answering the words at once: its thinking marked on the thing itself.
577
+ openQuickAsk(aiDesk, { pointed: { on: menuAt.on, about: selection, field: menuAt.field, place: menuAt.place }, asked, returnTo: back, ...(from ? { from } : {}) });
578
+ };
579
+ /* A suggestion taken: its words asked on the card, about what the menu is on, previewed like any plan — never applied from the menu. */
580
+ const takeTold = (one) => {
581
+ if (!menuAt)
582
+ return;
583
+ const back = menuAt.returnTo ?? null;
584
+ const from = whereMenuStands(asideRef.current);
585
+ setMenuAt(null);
586
+ // Asked as the plain act the row says, where the menu stood: where it came from is the Studio's to say, never the card's.
587
+ openQuickAsk(aiDesk, { pointed: { on: menuAt.on, about: selection, field: menuAt.field, place: menuAt.place }, asked: one.label, suggested: one.telling.id, returnTo: back, ...(from ? { from } : {}) });
588
+ };
589
+ /* The menu's rows the keyboard walks, in the order they are drawn: not a disabled one, nor a field of a form an act opened. */
590
+ const walkable = () => [...(asideRef.current?.querySelectorAll("[data-affordance]:not([disabled]), [data-menu-item]") ?? [])].filter((row) => row.closest("[data-graview-asking], [hidden]") === null);
591
+ const litRow = () => asideRef.current?.querySelector("[data-menu-lit]") ?? null;
592
+ /*
593
+ * A LETTER TYPED ANYWHERE IN THE MENU GOES INTO ITS FIELD, the keyboard
594
+ * with it: the menu opens with the keyboard on its first row, so the
595
+ * arrows walk the rows as they always did, and on a phone no keyboard
596
+ * rises until the field is tapped. Space still presses the row it is on;
597
+ * a form an act opened in the menu types its own answers; the arrow up
598
+ * from the first row goes back to the field.
599
+ */
600
+ const typeInto = (event) => {
601
+ const target = event.target;
602
+ const field = typeField.current;
603
+ if (!field || target === field || event.metaKey || event.ctrlKey || event.altKey)
604
+ return;
605
+ if (target.closest("[data-graview-asking]") || typingIn(target))
606
+ return;
607
+ const typing = event.key.length === 1 && event.key !== " ";
608
+ if (typing || (event.key === "Backspace" && typed !== "")) {
609
+ event.preventDefault();
610
+ event.stopPropagation();
611
+ if (typing && typed === "" && aiDesk)
612
+ preloadQuickAsk(aiDesk);
613
+ setTyped((was) => (typing ? was + event.key : was.slice(0, -1)));
614
+ field.focus({ preventScroll: true });
615
+ return;
616
+ }
617
+ if (event.key === "ArrowUp" && walkable()[0] === target) {
618
+ event.preventDefault();
619
+ event.stopPropagation();
620
+ field.focus({ preventScroll: true });
621
+ }
622
+ };
474
623
  /*
475
624
  * GROUPED BY WHAT THEY ANSWER. A repair arrives carrying the violation
476
625
  * that produced it, and without that sentence over it, "Cut X from
@@ -547,7 +696,13 @@ function Pane({ placement }) {
547
696
  // Somewhere else to go means they went there on purpose.
548
697
  if (event.relatedTarget !== null)
549
698
  keptFocus.current = null;
550
- }, onMouseDown: (event) => event.stopPropagation(), style: {
699
+ }, onMouseDown: (event) => event.stopPropagation(), onKeyDownCapture: atPointer ? (event) => typeInto(event) : undefined, onPointerMove: atPointer
700
+ ? (event) => {
701
+ const row = event.target.closest?.("[data-menu-item], [data-affordance]") != null;
702
+ if (row !== onRow)
703
+ setOnRow(row);
704
+ }
705
+ : undefined, onPointerLeave: atPointer && onRow ? () => setOnRow(false) : undefined, style: {
551
706
  /*
552
707
  * Above the jacked-in page, not only above the scene.
553
708
  *
@@ -666,7 +821,41 @@ function Pane({ placement }) {
666
821
  fontSize: "0.8125rem",
667
822
  lineHeight: 1.45,
668
823
  color: "var(--graview-ink-muted)",
669
- }, children: [observation.text, observation === said[1] && said.length > 2 ? (_jsxs("span", { style: { color: "var(--graview-ink-faint)" }, children: [" +", said.length - 2] })) : null] }, observation.id))) })) : null, atPointer ? beside.start.map((section) => _jsx(SectionDrawn, { section: section, close: () => setMenuAt(null) }, section.id)) : null, failed ? (_jsx("p", { "data-testid": "refused", style: { margin: 0, fontSize: "0.8125rem", lineHeight: 1.45, color: "var(--graview-warn)" }, children: failed })) : null, searchable ? (_jsx("input", { "data-testid": "action-filter", value: query, onChange: (event) => setQuery(event.target.value), placeholder: `Filter ${arranged.length} actions…`, "aria-label": "Filter actions", onKeyDown: (event) => {
824
+ }, children: [observation.text, observation === said[1] && said.length > 2 ? (_jsxs("span", { style: { color: "var(--graview-ink-faint)" }, children: [" +", said.length - 2] })) : null] }, observation.id))) })) : null, atPointer ? (_jsx("input", { ref: typeField, type: "text", "data-testid": "menu-type", "data-graview-not-first": "", value: typed, onChange: (event) => {
825
+ // The first letter fetches what Enter will need; the filter itself never waits on it.
826
+ if (typed === "" && event.target.value !== "" && aiDesk)
827
+ preloadQuickAsk(aiDesk);
828
+ setTyped(event.target.value);
829
+ }, onKeyDown: (event) => {
830
+ if (event.key === "Enter") {
831
+ event.preventDefault();
832
+ // As Enter on the row itself: the keyboard on it first, so a form the act opens takes the keyboard from it.
833
+ const row = litRow();
834
+ row?.focus({ preventScroll: true });
835
+ row?.click();
836
+ }
837
+ else if (event.key === "ArrowDown") {
838
+ event.preventDefault();
839
+ (litRow() ?? walkable()[0])?.focus();
840
+ }
841
+ else if (event.key === "Escape" && typed !== "") {
842
+ // The words go first; the next Escape puts the menu away.
843
+ event.preventDefault();
844
+ event.stopPropagation();
845
+ setTyped("");
846
+ }
847
+ }, placeholder: asks ? "Type to filter, or tell Graview…" : "Type to filter…", "aria-label": asks ? `Filter what can be done here, or tell Graview what to do about ${askedAbout}` : "Filter what can be done here", autoComplete: "off", autoCorrect: "off", spellCheck: false, enterKeyHint: "go", style: {
848
+ boxSizing: "border-box",
849
+ width: "100%",
850
+ font: "inherit",
851
+ // A phone zooms into a field set under 16px.
852
+ fontSize: "max(1rem, 16px)",
853
+ padding: "5px 9px",
854
+ borderRadius: 8,
855
+ border: "1px solid var(--graview-edge)",
856
+ background: "var(--graview-panel)",
857
+ color: "var(--graview-ink)",
858
+ } })) : null, atPointer ? startSections.map((section) => _jsx(SectionDrawn, { section: section, lit: lit, close: () => setMenuAt(null) }, section.id)) : null, failed ? (_jsx("p", { "data-testid": "refused", style: { margin: 0, fontSize: "0.8125rem", lineHeight: 1.45, color: "var(--graview-warn)" }, children: failed })) : null, searchable ? (_jsx("input", { "data-testid": "action-filter", value: query, onChange: (event) => setQuery(event.target.value), placeholder: `Filter ${arranged.length} actions…`, "aria-label": "Filter actions", onKeyDown: (event) => {
670
859
  if (event.key === "Escape") {
671
860
  // Clearing the filter must not also clear the selection —
672
861
  // the document-level Escape stays out of it either way.
@@ -698,7 +887,7 @@ function Pane({ placement }) {
698
887
  border: "1px solid var(--graview-edge)",
699
888
  background: "var(--graview-panel)",
700
889
  color: "var(--graview-ink)",
701
- } })) : null, matched !== null && matched.length === 0 ? (_jsxs("p", { "data-testid": "no-matches", style: { margin: 0, fontSize: "0.8125rem", lineHeight: 1.45, color: "var(--graview-ink-muted)" }, children: ["Nothing offered here matches \u201C", query.trim(), "\u201D."] })) : null, gain && affordances.length === 0 ? null : affordances.length === 0 && !waiting && selection.length === 0 ? null : affordances.length === 0 && !waiting ? (
890
+ } })) : null, matched !== null && matched.length === 0 ? (_jsxs("p", { "data-testid": "no-matches", style: { margin: 0, fontSize: "0.8125rem", lineHeight: 1.45, color: "var(--graview-ink-muted)" }, children: ["Nothing offered here matches \u201C", query.trim(), "\u201D."] })) : null, (words !== "" && shown.length === 0) || (gain && affordances.length === 0) ? null : affordances.length === 0 && !waiting && selection.length === 0 ? null : affordances.length === 0 && !waiting ? (
702
891
  /*
703
892
  * An empty action list is a RESULT, not a blank space. Saying which
704
893
  * kind has no mutations declaring it as a subject is the same honesty
@@ -759,7 +948,7 @@ function Pane({ placement }) {
759
948
  event.preventDefault();
760
949
  event.stopPropagation();
761
950
  to.focus();
762
- }, children: [_jsxs("button", { type: "button", [ROVING_ITEM]: "", "data-affordance": affordance.id, "data-rank": affordance.rank, "data-graview-destructive": affordance.destructive || undefined, "aria-pressed": pending === affordance.id, title: affordance.why, style: {
951
+ }, children: [_jsxs("button", { type: "button", [ROVING_ITEM]: "", "data-affordance": affordance.id, "data-rank": affordance.rank, "data-graview-destructive": affordance.destructive || undefined, "data-menu-lit": lit === `act:${affordance.id}` || undefined, "aria-pressed": pending === affordance.id, title: affordance.why, style: {
763
952
  padding: "5px 10px",
764
953
  fontSize: "0.875rem",
765
954
  borderRadius: 8,
@@ -789,13 +978,14 @@ function Pane({ placement }) {
789
978
  // pressed — and the ranking has already put it last.
790
979
  ...(affordance.destructive ? { color: "var(--graview-warn)" } : {}),
791
980
  ...(pending === affordance.id ? { color: "var(--graview-accent)" } : {}),
981
+ ...(lit === `act:${affordance.id}` ? LIT_STYLE : {}),
792
982
  }, onClick: () => {
793
983
  if (affordance.open.length > 0) {
794
984
  setPending(pending === affordance.id ? null : affordance.id);
795
985
  return;
796
986
  }
797
987
  act(affordance);
798
- }, children: [affordance.label, affordance.open.length > 0 ? (_jsx("span", { style: { color: "var(--graview-ink-faint)" }, children: " \u2026" })) : null, matched?.length === 1 &&
988
+ }, children: [affordance.label, affordance.open.length > 0 ? (_jsx("span", { style: { color: "var(--graview-ink-faint)" }, children: " \u2026" })) : null, lit === `act:${affordance.id}` ? ENTER_MARK : null, matched?.length === 1 &&
799
989
  matched[0]?.id === affordance.id &&
800
990
  !affordance.destructive ? (
801
991
  // The searcher's promise, made visible exactly when
@@ -838,7 +1028,7 @@ function Pane({ placement }) {
838
1028
  title: `Show all ${affordances.length} actions`, style: { padding: "4px 10px", fontSize: "0.875rem", borderRadius: 8 }, children: ["Show ", hidden, " more"] }) })) : null] })), gain ? (_jsx("button", { type: "button", "data-testid": "sign-in", onClick: () => {
839
1029
  setMenuAt(null);
840
1030
  gain.run();
841
- }, style: { padding: "5px 10px", fontSize: "0.875rem", borderRadius: 8, width: "100%", textAlign: "left" }, children: gain.label })) : null, withheld.length > 0 ? (_jsxs("ul", { "data-testid": "withheld", style: {
1031
+ }, style: { padding: "5px 10px", fontSize: "0.875rem", borderRadius: 8, width: "100%", textAlign: "left" }, children: gain.label })) : null, withheldShown.length > 0 ? (_jsxs("ul", { "data-testid": "withheld", style: {
842
1032
  margin: 0,
843
1033
  padding: 0,
844
1034
  listStyle: "none",
@@ -846,7 +1036,7 @@ function Pane({ placement }) {
846
1036
  flexDirection: "column",
847
1037
  flexWrap: "nowrap",
848
1038
  gap: 2,
849
- }, children: [withheld.slice(0, atPointer || allWithheld ? withheld.length : 3).map((action) => (_jsxs("li", { style: { display: "grid", gap: 2 }, children: [_jsx("button", { type: "button", disabled: true, "data-affordance": action.id, "data-rank": action.rank, "data-withheld": action.refusal.wouldNeed.join(",") || "nobody", style: {
1039
+ }, children: [withheldShown.slice(0, atPointer || allWithheld ? withheldShown.length : 3).map((action) => (_jsxs("li", { style: { display: "grid", gap: 2 }, children: [_jsx("button", { type: "button", disabled: true, "data-affordance": action.id, "data-rank": action.rank, "data-withheld": action.refusal.wouldNeed.join(",") || "nobody", style: {
850
1040
  padding: "4px 10px",
851
1041
  fontSize: "0.875rem",
852
1042
  borderRadius: 8,
@@ -859,7 +1049,7 @@ function Pane({ placement }) {
859
1049
  lineHeight: 1.4,
860
1050
  color: "var(--graview-ink-muted)",
861
1051
  padding: "0 10px",
862
- }, children: action.refusal.message })] }, action.id))), !atPointer && !allWithheld && withheld.length > 3 ? (_jsx("li", { children: _jsxs("button", { type: "button", "data-testid": "withheld-more", onClick: () => setAllWithheld(true), title: `Show all ${withheld.length} actions this seat may not take`, style: { padding: "4px 10px", fontSize: "0.875rem", borderRadius: 8 }, children: ["Show ", withheld.length - 3, " more withheld"] }) })) : null] })) : null, atPointer ? beside.end.map((section) => _jsx(SectionDrawn, { section: section, close: () => setMenuAt(null) }, section.id)) : null, open ? (_jsx(AnswerArgs, { affordance: open,
1052
+ }, children: action.refusal.message })] }, action.id))), !atPointer && !allWithheld && withheld.length > 3 ? (_jsx("li", { children: _jsxs("button", { type: "button", "data-testid": "withheld-more", onClick: () => setAllWithheld(true), title: `Show all ${withheld.length} actions this seat may not take`, style: { padding: "4px 10px", fontSize: "0.875rem", borderRadius: 8 }, children: ["Show ", withheld.length - 3, " more withheld"] }) })) : null] })) : null, atPointer ? endSections.map((section) => _jsx(SectionDrawn, { section: section, lit: lit, close: () => setMenuAt(null) }, section.id)) : null, toldShown.length > 0 ? (_jsx("div", { "data-menu-section": "told", role: "group", "aria-label": "Suggested", style: { display: "grid", gap: 2, borderTop: "1px solid var(--graview-edge)", paddingTop: 5 }, children: toldShown.map((one) => (_jsxs("button", { type: "button", "data-menu-item": one.key, "data-told-suggestion": one.telling.id, "data-menu-lit": lit === one.key || undefined, onClick: () => takeTold(one), style: { ...ROW_STYLE, ...(lit === one.key ? LIT_STYLE : {}) }, children: [one.label, lit === one.key ? ENTER_MARK : null] }, one.key))) })) : null, askRow ? (_jsx("div", { "data-menu-section": "ask", style: { display: "grid", gap: 2, borderTop: "1px solid var(--graview-edge)", paddingTop: 5 }, children: _jsxs("button", { type: "button", "data-menu-item": "ask-typed", "data-menu-lit": lit === "ask" || undefined, onClick: ask, style: { ...ROW_STYLE, ...(lit === "ask" ? LIT_STYLE : {}) }, children: ["Tell Graview ", _jsxs("span", { style: { fontWeight: 600 }, children: ["\u201C", words, "\u201D"] }), lit === "ask" ? ENTER_MARK : null] }) })) : null, atPointer && words !== "" && !askRow && lit === null && shown.length === 0 && withheldShown.length === 0 ? (_jsxs("p", { "data-testid": "menu-no-match", style: { margin: 0, fontSize: "0.8125rem", lineHeight: 1.45, color: "var(--graview-ink-muted)" }, children: ["Nothing here matches \u201C", words, "\u201D."] })) : null, open ? (_jsx(AnswerArgs, { affordance: open,
863
1053
  // On a refusal the prompt stays put with the reason beside it, so
864
1054
  // a rejected answer can be corrected rather than retyped blind.
865
1055
  onApply: (args) => {
@@ -869,6 +1059,16 @@ function Pane({ placement }) {
869
1059
  return refusedArgs.current;
870
1060
  }, onCancel: () => setPending(null) })) : null] }));
871
1061
  }
1062
+ /** Whether this is somewhere a person types: a field, a box of text. */
1063
+ function typingIn(element) {
1064
+ if (element.isContentEditable || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement)
1065
+ return true;
1066
+ return element instanceof HTMLInputElement && !["button", "submit", "reset", "checkbox", "radio", "image", "file", "color", "range"].includes(element.type);
1067
+ }
1068
+ /** A menu's row, and the one Enter runs from the field, lit, with the key that runs it said. */
1069
+ const ROW_STYLE = { padding: "5px 10px", fontSize: "0.875rem", borderRadius: 8, width: "100%", textAlign: "left", borderWidth: 1, borderStyle: "solid", borderColor: "transparent", background: "none", boxShadow: "none" };
1070
+ const LIT_STYLE = { background: "var(--graview-panel-muted)" };
1071
+ const ENTER_MARK = (_jsx("span", { "aria-hidden": "true", title: "Enter runs it", style: { float: "right", color: "var(--graview-ink-faint)", fontSize: "0.75rem" }, children: "\u21B5" }));
872
1072
  /** One shared empty, for a visitor told the way in instead. */
873
1073
  const NOTHING_WITHHELD = [];
874
1074
  /**
@@ -876,10 +1076,10 @@ const NOTHING_WITHHELD = [];
876
1076
  * each pressed to close the menu and run, or what it draws itself. Rows of
877
1077
  * the acts' own look, so the menu reads as one list.
878
1078
  */
879
- function SectionDrawn({ section, close }) {
880
- return (_jsxs("div", { "data-menu-section": section.id, ...(section.heading ? { role: "group", "aria-label": section.heading } : {}), style: { display: "grid", gap: 2, borderTop: "1px solid var(--graview-edge)", paddingTop: 5 }, children: [section.heading ? (_jsx("p", { "aria-hidden": "true", style: { margin: 0, padding: "2px 2px 1px", fontSize: "0.75rem", lineHeight: 1.4, letterSpacing: "0.12em", textTransform: "uppercase", color: "var(--graview-ink-faint)" }, children: section.heading })) : null, section.items && section.items.length > 0 ? (_jsx("ul", { style: { margin: 0, padding: 0, listStyle: "none", display: "flex", flexDirection: "column", gap: 2 }, children: section.items.map((item) => (_jsx("li", { children: _jsxs("button", { type: "button", "data-menu-item": item.id, onClick: () => {
1079
+ function SectionDrawn({ section, lit = null, close }) {
1080
+ return (_jsxs("div", { "data-menu-section": section.id, ...(section.heading ? { role: "group", "aria-label": section.heading } : {}), style: { display: "grid", gap: 2, borderTop: "1px solid var(--graview-edge)", paddingTop: 5 }, children: [section.heading ? (_jsx("p", { "aria-hidden": "true", style: { margin: 0, padding: "2px 2px 1px", fontSize: "0.75rem", lineHeight: 1.4, letterSpacing: "0.12em", textTransform: "uppercase", color: "var(--graview-ink-faint)" }, children: section.heading })) : null, section.items && section.items.length > 0 ? (_jsx("ul", { style: { margin: 0, padding: 0, listStyle: "none", display: "flex", flexDirection: "column", gap: 2 }, children: section.items.map((item) => (_jsx("li", { children: _jsxs("button", { type: "button", "data-menu-item": item.id, "data-menu-lit": lit === `item:${item.id}` || undefined, onClick: () => {
881
1081
  close();
882
1082
  item.run();
883
- }, style: { padding: "5px 10px", fontSize: "0.875rem", borderRadius: 8, width: "100%", textAlign: "left", borderWidth: 1, borderStyle: "solid", borderColor: "transparent", background: "none", boxShadow: "none" }, children: [item.label, item.hint ? _jsxs("span", { style: { color: "var(--graview-ink-faint)" }, children: [" \u00B7 ", item.hint] }) : null] }) }, item.id))) })) : null, section.render?.(close)] }));
1083
+ }, style: { ...ROW_STYLE, ...(lit === `item:${item.id}` ? LIT_STYLE : {}) }, children: [item.label, item.hint ? _jsxs("span", { style: { color: "var(--graview-ink-faint)" }, children: [" \u00B7 ", item.hint] }) : null, lit === `item:${item.id}` ? ENTER_MARK : null] }) }, item.id))) })) : null, section.render?.(close)] }));
884
1084
  }
885
1085
  //# sourceMappingURL=inspector.js.map