@graview/primitives 0.1.30 → 0.1.32

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 @@
1
+ {"version":3,"file":"when-input-door.d.ts","sourceRoot":"","sources":["../src/when-input-door.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWtD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAM1D;AAED,uKAAuK;AACvK,eAAO,MAAM,iBAAiB,QAAO,OAAO,CAAC,IAAI,CAGhD,CAAC;AACF,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { retryingImport } from "@graview/core/retry";
3
+ import { lazyModule } from "@graview/react/provider";
4
+ import { Suspense } from "react";
5
+ /*
6
+ * THE DOOR TO A DATE'S EDITOR (`when-input.tsx`): the box that reads
7
+ * "tomorrow 3pm" and the reader of what is typed, fetched when a date is
8
+ * first edited or asked for — and asked for early, while the page is idle,
9
+ * by a date that could be (`prefetchWhenInput`) — never in the first paint.
10
+ */
11
+ const WHEN = /* @__PURE__ */ lazyModule(retryingImport(() => import("./when-input.js")));
12
+ const Part = WHEN.part((m, props) => _jsx(m.WhenInput, { ...props }), { quiet: true });
13
+ /** A day or a moment, typed as people say it or picked from a month (Roadmap f-date-inputs). */
14
+ export function WhenInput(props) {
15
+ return (_jsx(Suspense, { fallback: _jsx("span", { "data-graview-when-arriving": "", style: { display: "inline-block", minHeight: 24 } }), children: _jsx(Part, { ...props }) }));
16
+ }
17
+ /** Fetch the editor now, if it is not here yet: for a date that can be changed where it is shown. Settles once it is here (or could not be fetched); never rejects. */
18
+ export const prefetchWhenInput = () => WHEN.load().then(() => undefined, () => undefined);
19
+ //# sourceMappingURL=when-input-door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-input-door.js","sourceRoot":"","sources":["../src/when-input-door.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AACzF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAmC,EAAE,KAAqB,EAAE,EAAE,CAAC,KAAC,CAAC,CAAC,SAAS,OAAK,KAAK,GAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpI,gGAAgG;AAChG,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,OAAO,CACL,KAAC,QAAQ,IAAC,QAAQ,EAAE,6CAAiC,EAAE,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,GAAI,YAC3G,KAAC,IAAI,OAAK,KAAK,GAAI,GACV,CACZ,CAAC;AACJ,CAAC;AAED,uKAAuK;AACvK,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CACpE,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type WallTime } from "@graview/core/words";
2
+ import { type CSSProperties, type ReactNode, type Ref } from "react";
3
+ import "./frame.js";
4
+ export interface WhenInputProps {
5
+ /** The value as the field keeps it: "2026-10-17", "2026-10-17T19:00:00Z", "2026-10-17T15:00". */
6
+ readonly value: string | undefined;
7
+ /** Whether the field holds a time of day as well as a day. */
8
+ readonly time: boolean;
9
+ /** Whether a time is kept as an instant (UTC, with its `Z`) rather than as the wall time written. */
10
+ readonly instant?: boolean;
11
+ /** What the field is called, as a screen reader says the box. */
12
+ readonly label: string;
13
+ readonly name?: string;
14
+ readonly required?: boolean;
15
+ readonly autoFocus?: boolean;
16
+ /** Take the keyboard as it is drawn, its words chosen whole, so what is typed ("Fri 10:30") replaces the day said: for a value opened to change in place. */
17
+ readonly autoSelect?: boolean;
18
+ /** The locale digits are read in (10/17 or 17/10) and the day is said in. */
19
+ readonly locale?: string;
20
+ /** What the field now holds, each time what is typed changes: undefined while it is empty or reads as no day. */
21
+ readonly onChange: (stored: string | undefined) => void;
22
+ /** The keyboard left the editor — the box, its button and its month — for somewhere else. */
23
+ readonly onLeave?: (stored: string | undefined) => void;
24
+ /** Escape in the box. */
25
+ readonly onCancel?: () => void;
26
+ readonly inputRef?: Ref<HTMLInputElement>;
27
+ /** The box's own look, where the surface it sits in sets one. */
28
+ readonly boxStyle?: CSSProperties;
29
+ }
30
+ /** A wall time in words, on no clock but its own: "Sat, Oct 17, 2026, 3:00 PM"; `long`, "Saturday, October 17, 2026 at 3:00 PM". */
31
+ export declare function wallAsRead(wall: WallTime, time: boolean, locale: string | undefined, long?: boolean): string;
32
+ /** The editor itself: controlled by the value the field keeps. */
33
+ export declare function WhenInput({ value, time, instant, label, name, required, autoFocus, autoSelect, locale, onChange, onLeave, onCancel, inputRef, boxStyle }: WhenInputProps): ReactNode;
34
+ //# sourceMappingURL=when-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-input.d.ts","sourceRoot":"","sources":["../src/when-input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClH,OAAO,EAAgD,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAEnH,OAAO,YAAY,CAAC;AAmBpB,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,6JAA6J;IAC7J,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,iHAAiH;IACjH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;CACnC;AAID,oIAAoI;AACpI,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,UAAQ,GAAG,MAAM,CAiB1G;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAe,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,SAAS,CA8J5L"}
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { readWhenTyped, storedOfWall, wallNow, wallOfStored, zoneSaid } from "@graview/core/words";
3
+ import { Suspense, useEffect, useId, useRef, useState } from "react";
4
+ import { WhenPicker } from "./when-picker-door.js";
5
+ import "./frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
6
+ const HINT = "try “tomorrow 3pm”, “Fri 10:30” or “17 Oct”";
7
+ /** A wall time in words, on no clock but its own: "Sat, Oct 17, 2026, 3:00 PM"; `long`, "Saturday, October 17, 2026 at 3:00 PM". */
8
+ export function wallAsRead(wall, time, locale, long = false) {
9
+ const stamp = Date.UTC(+wall.day.slice(0, 4), +wall.day.slice(5, 7) - 1, +wall.day.slice(8, 10), 0, time ? (wall.minutes ?? 0) : 0);
10
+ const options = {
11
+ weekday: long ? "long" : "short",
12
+ year: "numeric",
13
+ month: long ? "long" : "short",
14
+ day: "numeric",
15
+ ...(time ? { hour: "numeric", minute: "2-digit" } : {}),
16
+ timeZone: "UTC",
17
+ };
18
+ let format;
19
+ try {
20
+ format = new Intl.DateTimeFormat(locale ?? "en-US", options);
21
+ }
22
+ catch {
23
+ format = new Intl.DateTimeFormat("en-US", options);
24
+ }
25
+ return format.format(stamp).replace(/ /g, " ");
26
+ }
27
+ /** The editor itself: controlled by the value the field keeps. */
28
+ export function WhenInput({ value, time, instant = false, label, name, required, autoFocus, autoSelect, locale, onChange, onLeave, onCancel, inputRef, boxStyle }) {
29
+ const id = useId();
30
+ const box = useRef(null);
31
+ const opener = useRef(null);
32
+ const said = (stored) => {
33
+ const wall = wallOfStored(stored);
34
+ return wall ? wallAsRead(wall, time, locale) : (stored ?? "");
35
+ };
36
+ const [text, setText] = useState(() => said(value));
37
+ const [open, setOpen] = useState(false);
38
+ /*
39
+ * What this editor last handed on, and the value it last saw: a value that
40
+ * arrives otherwise (an end moved with its start, an undo) is said afresh;
41
+ * the one it handed on itself leaves the words as they were typed.
42
+ */
43
+ const [handed, setHanded] = useState(value);
44
+ const [seen, setSeen] = useState(value);
45
+ if (value !== seen) {
46
+ setSeen(value);
47
+ if (value !== handed) {
48
+ setHanded(value);
49
+ setText(said(value));
50
+ }
51
+ }
52
+ useEffect(() => {
53
+ if (!autoSelect)
54
+ return;
55
+ box.current?.focus();
56
+ box.current?.select();
57
+ }, [autoSelect]);
58
+ const zone = time && instant ? zoneSaid(locale) : undefined;
59
+ const untouched = text === said(value);
60
+ const base = wallOfStored(value);
61
+ const reading = untouched ? base : readWhenTyped(text, { today: wallNow().day, time, ...(base ? { base } : {}), ...(locale ? { locale } : {}) });
62
+ const stored = untouched ? value : reading ? storedOfWall(reading, { time, instant }) : undefined;
63
+ const empty = text.trim() === "";
64
+ const unread = !empty && reading === undefined;
65
+ // A box that reads as no day says so to the form it is in, which will not send it.
66
+ useEffect(() => {
67
+ box.current?.setCustomValidity(unread ? `Not a date this reads — ${HINT}` : "");
68
+ }, [unread]);
69
+ const hand = (next) => {
70
+ setHanded(next);
71
+ onChange(next);
72
+ };
73
+ const type = (next) => {
74
+ setText(next);
75
+ const wall = next.trim() === "" ? undefined : readWhenTyped(next, { today: wallNow().day, time, ...(base ? { base } : {}), ...(locale ? { locale } : {}) });
76
+ hand(wall ? storedOfWall(wall, { time, instant }) : undefined);
77
+ };
78
+ const pick = (day) => {
79
+ const wall = time ? { day, minutes: reading?.minutes ?? base?.minutes ?? 9 * 60 } : { day };
80
+ const next = storedOfWall(wall, { time, instant });
81
+ setText(said(next));
82
+ hand(next);
83
+ setOpen(false);
84
+ // Back to the box, all of it chosen, so a time typed next ("3pm") replaces the words and keeps the day.
85
+ requestAnimationFrame(() => {
86
+ box.current?.focus();
87
+ box.current?.select();
88
+ });
89
+ };
90
+ const words = empty ? `Type a date, or pick one — ${HINT}` : unread ? `Not a date this reads — ${HINT}` : reading ? `${wallAsRead(reading, time, locale, true)}${zone ? ` ${zone.short}` : ""}` : "";
91
+ const setRef = (element) => {
92
+ box.current = element;
93
+ if (typeof inputRef === "function")
94
+ inputRef(element);
95
+ else if (inputRef)
96
+ inputRef.current = element;
97
+ };
98
+ return (_jsxs("span", { "data-graview-when": time ? (instant ? "instant" : "moment") : "day", style: { display: "inline-flex", flex: "1 1 14rem", flexWrap: "wrap", alignItems: "center", gap: "4px 6px", maxWidth: "100%", minWidth: 0 }, onBlur: (event) => {
99
+ const next = event.relatedTarget;
100
+ if (next && event.currentTarget.contains(next))
101
+ return;
102
+ // A blur with nowhere it went is the window losing focus; the editor waits for it to come back.
103
+ if (!next && typeof document !== "undefined" && !document.hasFocus())
104
+ return;
105
+ setOpen(false);
106
+ onLeave?.(stored);
107
+ }, children: [_jsx("input", { ref: setRef, type: "text", name: name, required: required, autoFocus: autoFocus, "aria-label": label, "aria-describedby": `${id}-said`, "aria-invalid": unread || undefined, autoComplete: "off", spellCheck: false, enterKeyHint: "done", placeholder: time ? "tomorrow 3pm" : "17 Oct", value: text, "data-graview-part": "control", onChange: (event) => type(event.target.value), onKeyDown: (event) => {
108
+ if (event.key === "Escape") {
109
+ event.preventDefault();
110
+ onCancel?.();
111
+ }
112
+ else if (event.key === "ArrowDown" && event.altKey) {
113
+ // Alt with the down arrow opens the month, as a native date box does.
114
+ event.preventDefault();
115
+ setOpen(true);
116
+ }
117
+ }, style: { flex: "1 1 12ch", minWidth: "10ch", maxWidth: "100%", boxSizing: "border-box", font: "inherit", ...boxStyle } }), _jsx("button", { ref: opener, type: "button", "aria-label": `Pick a date for ${label}`, "aria-expanded": open, "aria-controls": `${id}-month`, "data-graview-part": "when-pick", onClick: () => setOpen((was) => !was), onPointerEnter: () => WhenPicker.prefetch(), style: { display: "inline-flex", alignItems: "center", justifyContent: "center", minWidth: 32, minHeight: 32, padding: 0, borderRadius: 6 }, children: _jsxs("svg", { "aria-hidden": "true", width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.4", children: [_jsx("rect", { x: "2", y: "3", width: "12", height: "11", rx: "1.5" }), _jsx("path", { d: "M2 6.5h12M5.5 1.5v3M10.5 1.5v3" })] }) }), _jsxs("span", { id: `${id}-said`, "aria-live": "polite", "data-graview-part": "when-said", ...(zone ? { "data-graview-zone": zone.zone, title: `Times are in ${zone.zone.replace(/_/g, " ")} (${zone.short})` } : {}), style: { flexBasis: "100%", fontSize: "0.75rem", color: unread ? "var(--graview-bad)" : "var(--graview-ink-faint)" }, children: [words, zone && !unread && !empty ? _jsx("span", { "data-graview-part": "when-zone", children: ` · ${(zone.zone.split("/").at(-1) ?? zone.zone).replace(/_/g, " ")} time` }) : null] }), open ? (_jsx(Suspense, { fallback: null, children: _jsx(WhenPicker.Part, { id: `${id}-month`, label: label, selected: reading?.day ?? base?.day, today: wallNow().day, locale: locale, onPick: pick, onClose: () => {
118
+ setOpen(false);
119
+ opener.current?.focus();
120
+ } }) })) : null] }));
121
+ }
122
+ //# sourceMappingURL=when-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-input.js","sourceRoot":"","sources":["../src/when-input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const WhenPicker: {
2
+ Part: import("react").ComponentType<import("./when-picker.js").WhenMonthProps>;
3
+ prefetch: () => void;
4
+ };
5
+ export type { WhenMonthProps } from "./when-picker.js";
6
+ //# sourceMappingURL=when-picker-door.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-picker-door.d.ts","sourceRoot":"","sources":["../src/when-picker-door.tsx"],"names":[],"mappings":"AAWA,eAAO,MAAM,UAAU;;oBAEP,IAAI;CACnB,CAAC;AACF,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { retryingImport } from "@graview/core/retry";
3
+ import { lazyModule } from "@graview/react/provider";
4
+ /*
5
+ * THE DOOR TO A MONTH TO PICK A DAY FROM (`when-picker.tsx`): opened from a
6
+ * date's editor by its button, or Alt with the down arrow — fetched the first
7
+ * time one is opened (or a pointer rests on the button), never in the first
8
+ * paint, and never at all on a page where nobody picks a day.
9
+ */
10
+ const MONTH = /* @__PURE__ */ lazyModule(retryingImport(() => import("./when-picker.js")));
11
+ export const WhenPicker = {
12
+ Part: MONTH.part((m, props) => _jsx(m.WhenMonth, { ...props }), { quiet: true }),
13
+ prefetch: () => MONTH.prefetch(),
14
+ };
15
+ //# sourceMappingURL=when-picker-door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-picker-door.js","sourceRoot":"","sources":["../src/when-picker-door.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAoC,EAAE,KAAgD,EAAE,EAAE,CAAC,KAAC,CAAC,CAAC,SAAS,OAAK,KAAK,GAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzJ,QAAQ,EAAE,GAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;CACvC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from "react";
2
+ import "./frame.js";
3
+ export interface WhenMonthProps {
4
+ readonly id: string;
5
+ /** What the date is called: "Starts". */
6
+ readonly label: string;
7
+ /** The day the field holds, `YYYY-MM-DD`, if any. */
8
+ readonly selected?: string | undefined;
9
+ /** The reader's today, `YYYY-MM-DD`. */
10
+ readonly today: string;
11
+ readonly locale?: string | undefined;
12
+ readonly onPick: (day: string) => void;
13
+ readonly onClose: () => void;
14
+ }
15
+ export declare function WhenMonth({ id, label, selected, today, locale, onPick, onClose }: WhenMonthProps): ReactNode;
16
+ //# sourceMappingURL=when-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-picker.d.ts","sourceRoot":"","sources":["../src/when-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,YAAY,CAAC;AAepB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAkCD,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,CA8H5G"}
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import "./frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
4
+ const DAY = 86_400_000;
5
+ const utcOf = (day) => Date.UTC(+day.slice(0, 4), +day.slice(5, 7) - 1, +day.slice(8, 10));
6
+ const dayOf = (stamp) => new Date(stamp).toISOString().slice(0, 10);
7
+ const addDays = (day, days) => dayOf(utcOf(day) + days * DAY);
8
+ const addMonths = (day, months) => {
9
+ const at = new Date(utcOf(day));
10
+ const wanted = at.getUTCMonth() + months;
11
+ const first = Date.UTC(at.getUTCFullYear(), wanted, 1);
12
+ const last = new Date(Date.UTC(at.getUTCFullYear(), wanted + 1, 0)).getUTCDate();
13
+ return dayOf(first + (Math.min(at.getUTCDate(), last) - 1) * DAY);
14
+ };
15
+ function say(locale, options, stamp) {
16
+ try {
17
+ return new Intl.DateTimeFormat(locale ?? "en-US", { ...options, timeZone: "UTC" }).format(stamp);
18
+ }
19
+ catch {
20
+ return new Intl.DateTimeFormat("en-US", { ...options, timeZone: "UTC" }).format(stamp);
21
+ }
22
+ }
23
+ /** The first day of the week where the reader is: Monday nearly everywhere, Sunday in the US and a few others. */
24
+ function weekStart(locale) {
25
+ try {
26
+ const info = new Intl.Locale(locale ?? "en-US");
27
+ const first = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;
28
+ if (first !== undefined)
29
+ return first % 7;
30
+ }
31
+ catch {
32
+ return 0;
33
+ }
34
+ return /^en-US|^en$|-(US|CA|JP|BR|IL|MX|PH)$/.test(locale ?? "en-US") ? 0 : 1;
35
+ }
36
+ export function WhenMonth({ id, label, selected, today, locale, onPick, onClose }) {
37
+ const [focused, setFocused] = useState(selected ?? today);
38
+ const grid = useRef(null);
39
+ const first = weekStart(locale);
40
+ const monthStart = `${focused.slice(0, 7)}-01`;
41
+ const lead = (new Date(utcOf(monthStart)).getUTCDay() - first + 7) % 7;
42
+ const gridStart = addDays(monthStart, -lead);
43
+ const weeks = Array.from({ length: 6 }, (_, week) => Array.from({ length: 7 }, (_, day) => addDays(gridStart, week * 7 + day)));
44
+ const title = say(locale, { month: "long", year: "numeric" }, utcOf(monthStart));
45
+ // The day that holds the keyboard has it: on opening, and after every move made in the grid (a month's button keeps it).
46
+ // A key pressed in the grid moves the keyboard even when the day it was on is gone with its month.
47
+ const keyed = useRef(true);
48
+ useEffect(() => {
49
+ if (keyed.current)
50
+ grid.current?.querySelector(`[data-day="${focused}"]`)?.focus();
51
+ keyed.current = false;
52
+ }, [focused]);
53
+ const key = (event) => {
54
+ const step = {
55
+ ArrowLeft: () => addDays(focused, -1),
56
+ ArrowRight: () => addDays(focused, 1),
57
+ ArrowUp: () => addDays(focused, -7),
58
+ ArrowDown: () => addDays(focused, 7),
59
+ PageUp: () => addMonths(focused, event.shiftKey ? -12 : -1),
60
+ PageDown: () => addMonths(focused, event.shiftKey ? 12 : 1),
61
+ Home: () => addDays(focused, -((new Date(utcOf(focused)).getUTCDay() - first + 7) % 7)),
62
+ End: () => addDays(focused, 6 - ((new Date(utcOf(focused)).getUTCDay() - first + 7) % 7)),
63
+ };
64
+ if (step[event.key]) {
65
+ event.preventDefault();
66
+ keyed.current = true;
67
+ setFocused(step[event.key]());
68
+ }
69
+ else if (event.key === "Escape") {
70
+ event.preventDefault();
71
+ event.stopPropagation();
72
+ onClose();
73
+ }
74
+ };
75
+ const headers = Array.from({ length: 7 }, (_, index) => utcOf("1970-01-04") + ((first + index) % 7) * DAY);
76
+ const button = { minWidth: 32, minHeight: 32, padding: "0 8px", borderRadius: 6 };
77
+ return (_jsxs("div", { id: id, role: "group", "aria-label": `Pick a date for ${label}`, "data-graview-part": "when-month", onKeyDown: (event) => {
78
+ if (event.key === "Escape") {
79
+ event.preventDefault();
80
+ event.stopPropagation();
81
+ onClose();
82
+ }
83
+ }, style: {
84
+ flexBasis: "100%",
85
+ width: "min(100%, 20rem)",
86
+ boxSizing: "border-box",
87
+ padding: 8,
88
+ border: "1px solid var(--graview-edge)",
89
+ borderRadius: 8,
90
+ background: "var(--graview-panel)",
91
+ color: "var(--graview-ink)",
92
+ }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 6, marginBottom: 6 }, children: [_jsx("button", { type: "button", "aria-label": "Previous month", onClick: () => setFocused(addMonths(focused, -1)), style: button, children: "\u2039" }), _jsx("span", { id: `${id}-title`, "aria-live": "polite", style: { fontWeight: 600, fontSize: "0.875rem" }, children: title }), _jsx("button", { type: "button", "aria-label": "Next month", onClick: () => setFocused(addMonths(focused, 1)), style: button, children: "\u203A" })] }), _jsxs("table", { ref: grid, role: "grid", "aria-labelledby": `${id}-title`, onKeyDown: key, style: { width: "100%", borderCollapse: "collapse", tableLayout: "fixed", fontSize: "0.8125rem" }, children: [_jsx("thead", { children: _jsx("tr", { children: headers.map((stamp) => (_jsx("th", { scope: "col", abbr: say(locale, { weekday: "long" }, stamp), style: { fontWeight: 500, color: "var(--graview-ink-faint)", padding: "2px 0" }, children: say(locale, { weekday: "narrow" }, stamp) }, stamp))) }) }), _jsx("tbody", { children: weeks.map((week) => (_jsx("tr", { children: week.map((day) => {
93
+ const inMonth = day.slice(0, 7) === monthStart.slice(0, 7);
94
+ const isSelected = day === selected;
95
+ const isToday = day === today;
96
+ return (_jsx("td", { role: "gridcell", "aria-selected": isSelected || undefined, style: { padding: 1, textAlign: "center" }, children: _jsx("button", { type: "button", "data-day": day, tabIndex: day === focused ? 0 : -1, "aria-label": `${say(locale, { weekday: "long", year: "numeric", month: "long", day: "numeric" }, utcOf(day))}${isToday ? ", today" : ""}${isSelected ? ", selected" : ""}`, ...(isToday ? { "aria-current": "date" } : {}), onClick: () => onPick(day), onFocus: () => day !== focused && setFocused(day), style: {
97
+ width: "100%",
98
+ minHeight: 36,
99
+ padding: 0,
100
+ borderRadius: 6,
101
+ border: isToday ? "1px solid var(--graview-accent)" : "1px solid transparent",
102
+ background: isSelected ? "var(--graview-accent)" : "transparent",
103
+ color: isSelected ? "var(--graview-accent-ink)" : inMonth ? "var(--graview-ink)" : "var(--graview-ink-faint)",
104
+ fontWeight: isSelected ? 600 : 400,
105
+ }, children: Number(day.slice(8, 10)) }) }, day));
106
+ }) }, week[0]))) })] })] }));
107
+ }
108
+ //# sourceMappingURL=when-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-picker.js","sourceRoot":"","sources":["../src/when-picker.tsx"],"names":[],"mappings":"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"}
@@ -16,6 +16,10 @@ export interface Change {
16
16
  /** What a record this change removed was called, read from the removal: it is no longer in the graph to ask. */
17
17
  readonly removed?: Readonly<Record<string, string>>;
18
18
  readonly batch: string;
19
+ /** When it was made. */
20
+ readonly at?: string;
21
+ /** The AI interaction it came from (lineage `interaction`), whose entry draws it. */
22
+ readonly interaction?: string;
19
23
  /** The moment just after it: `pastOf(store, seq)` shows the app as it was once it was made (Roadmap f-playback). */
20
24
  readonly seq: number;
21
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/workbench/activity.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoE,KAAK,MAAM,EAAc,MAAM,eAAe,CAAC;AAM1H,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK1D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gHAAgH;IAChH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oHAAoH;IACpH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAkBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,SAAI,GAAG,SAAS,MAAM,EAAE,CAiC7D;AA0ED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,sCAoF7D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,sCAuB7F;AAED;;;;;;;GAOG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,gCAmCzB;AA6BD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,SAAiB,GAClB,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;CAC3B,sCAqRA"}
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/workbench/activity.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoE,KAAK,MAAM,EAAc,MAAM,eAAe,CAAC;AAM1H,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAczF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gHAAgH;IAChH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,oHAAoH;IACpH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAoBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,SAAI,GAAG,SAAS,MAAM,EAAE,CAkC7D;AA0ED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,sCAoF7D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,sCAuB7F;AAED;;;;;;;GAOG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,gCAmCzB;AA6BD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,SAAiB,GAClB,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;CAC3B,sCAmTA"}
@@ -1,13 +1,20 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { humanizeField, isWithheld, labelOf, nameOfAuthor } from "@graview/core";
3
3
  import { viaSaid } from "@graview/core/words";
4
4
  import { lineageWords } from "@graview/core/provenance";
5
5
  import { digestWords, foldDigests } from "@graview/core/tidying";
6
- import { POPOVER_STYLE, useGoTo, useGraview, useLiveStore, usePlayback, usePopover } from "@graview/react/provider";
6
+ import { lazyModule, POPOVER_STYLE, useGoTo, useGraview, useLiveStore, usePlayback, usePopover } from "@graview/react/provider";
7
7
  import { prefetchTimeline } from "../past-bar.js";
8
- import { useMemo, useState } from "react";
8
+ import { Suspense, useMemo, useState } from "react";
9
9
  import { Chip, VISUALLY_HIDDEN } from "../primitives/index.js";
10
10
  import { nameOf } from "./answer-args.js";
11
+ import { NotifiedDoor, useNotifiedCount } from "../notify-door.js";
12
+ import { useInteractions } from "./ai-feed.js";
13
+ import { retryingImport } from "@graview/core/retry";
14
+ /* The AI's rows and its filter, fetched with the first entry there is to draw (Roadmap f-activity-ai-entries). */
15
+ const aiRows = /* @__PURE__ */ lazyModule(retryingImport(() => import("./ai-entries.js")));
16
+ const InteractionRow = /* @__PURE__ */ aiRows.part((module, props) => _jsx(module.InteractionRow, { ...props }), { quiet: true, as: "li" });
17
+ const ActivityFilter = /* @__PURE__ */ aiRows.part((module, props) => _jsx(module.ActivityFilter, { ...props }), { quiet: true, as: "div" });
11
18
  /** One batch as a row of Activity. */
12
19
  const changeOf = (store, batch) => ({
13
20
  intent: batch.intent,
@@ -20,6 +27,8 @@ const changeOf = (store, batch) => ({
20
27
  touched: [...new Set(batch.ops.filter((op) => !isWithheld(op)).flatMap((op) => op.writes))],
21
28
  ...removedNames(store, batch.ops.filter((op) => !isWithheld(op))),
22
29
  batch: batch.id,
30
+ at: batch.at,
31
+ ...(batch.lineage?.interaction ? { interaction: batch.lineage.interaction } : {}),
23
32
  seq: batch.ops.at(-1).seq + 1,
24
33
  ...(batch.ops.every(isWithheld) ? { withheld: true } : {}),
25
34
  });
@@ -61,6 +70,7 @@ export function useRecentChanges(limit = 4) {
61
70
  by: row.digest.author,
62
71
  touched: [...new Set(changes.flatMap((change) => change.touched))],
63
72
  batch: "",
73
+ ...(changes[0]?.at ? { at: changes[0].at } : {}),
64
74
  seq: changes[0]?.seq ?? 0,
65
75
  digest: changes,
66
76
  };
@@ -242,11 +252,30 @@ function Named({ id, label, go }) {
242
252
  return (_jsx("button", { type: "button", "data-testid": "activity-record", "data-record": id, title: `Go to ${label}`, onClick: () => go(id), style: { all: "unset", display: "inline-flex", cursor: "pointer", borderRadius: 7 }, className: "graview-activity-record", children: _jsx(Chip, { label: label }) }));
243
253
  }
244
254
  export function ActivityRail({ calls, seat, remembers = false, }) {
245
- const changes = useRecentChanges();
255
+ const recent = useRecentChanges();
246
256
  const { store: shown, principal, seats, people } = useGraview();
257
+ /*
258
+ * AI INTERACTIONS ARE ENTRIES OF THE SAME FEED (Roadmap f-activity-ai-
259
+ * entries), newest first among the changes, and a change one of them
260
+ * made is drawn in its entry, not again beside it. All, the changes, or
261
+ * the AI's; everyone's, or only the reader's own.
262
+ */
263
+ const interactions = useInteractions();
264
+ const [shows, setShows] = useState("all");
265
+ const [mine, setMine] = useState(false);
266
+ const isMine = (by) => by !== undefined && (by.id === principal.id || by.onBehalfOf?.id === principal.id) && principal.id !== undefined;
267
+ const drawnIn = new Set(interactions.map((entry) => entry.id));
268
+ const changes = recent.filter((change) => !(change.interaction !== undefined && drawnIn.has(change.interaction)) && (!mine || isMine(change.by)));
269
+ const entries = interactions.filter((entry) => !mine || isMine(entry.by)).slice(0, 4);
270
+ const feed = [
271
+ ...(shows === "ai" ? [] : changes.map((change) => ({ at: change.at ?? "", change }))),
272
+ ...(shows === "changes" ? [] : entries.map((entry) => ({ at: entry.at, entry }))),
273
+ ].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : 0));
247
274
  /* Named from now's records, whichever moment the face draws (Roadmap f-playback). */
248
275
  const store = useLiveStore(shown, principal);
249
276
  const running = calls.some((call) => call.phase === "running");
277
+ // Somebody told of changes has Activity to open, though nothing has changed yet.
278
+ const notified = useNotifiedCount();
250
279
  /*
251
280
  * A POPOVER FROM THE BAR, not a rail pinned over the scene.
252
281
  *
@@ -264,7 +293,7 @@ export function ActivityRail({ calls, seat, remembers = false, }) {
264
293
  /* Only a record still in the graph goes anywhere; the popover closes behind the reader as they go, and going there is going to it now, not as it was. */
265
294
  const goes = (id) => (store.graph.has(id) ? (to) => { popover.setOpen(false); if (playback?.past)
266
295
  playback.show(null); goTo.record(to); } : null);
267
- if (seat === undefined && calls.length === 0 && changes.length === 0 && !remembers)
296
+ if (seat === undefined && calls.length === 0 && recent.length === 0 && interactions.length === 0 && !remembers && notified === 0)
268
297
  return null;
269
298
  return (_jsxs("div", { style: { position: "relative" }, children: [_jsxs("button", { type: "button", "data-testid": "activity-button", ...popover.trigger, onClick: popover.toggle, title: running ? "An agent is working" : "What has happened", style: {
270
299
  display: "inline-flex",
@@ -280,7 +309,7 @@ export function ActivityRail({ calls, seat, remembers = false, }) {
280
309
  fontSize: "0.875rem",
281
310
  whiteSpace: "nowrap",
282
311
  color: running ? "var(--graview-accent)" : "var(--graview-ink-muted)",
283
- }, children: [running ? _jsx("span", { "aria-hidden": "true", style: { width: 6, height: 6, borderRadius: 999, background: "var(--graview-accent)" } }) : null, changes.length > 0 ? changes.length : "", _jsxs("svg", { className: "graview-activity-mark", width: "15", height: "15", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", style: { display: "var(--graview-activity-mark, none)" }, children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75", fill: "none", stroke: "currentColor", strokeWidth: "1.4" }), _jsx("path", { d: "M8 4.75 V8 L10.25 9.5", fill: "none", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "graview-activity-word", children: " Activity" })] }), !open && seat !== undefined ? (_jsx("div", { hidden: true, "data-testid": "agent-seat-seated", children: seat })) : null, open ? (
312
+ }, children: [running ? _jsx("span", { "aria-hidden": "true", style: { width: 6, height: 6, borderRadius: 999, background: "var(--graview-accent)" } }) : null, recent.length > 0 ? recent.length : "", _jsxs("svg", { className: "graview-activity-mark", width: "15", height: "15", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", style: { display: "var(--graview-activity-mark, none)" }, children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75", fill: "none", stroke: "currentColor", strokeWidth: "1.4" }), _jsx("path", { d: "M8 4.75 V8 L10.25 9.5", fill: "none", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "graview-activity-word", children: " Activity" })] }), !open && seat !== undefined ? (_jsx("div", { hidden: true, "data-testid": "agent-seat-seated", children: seat })) : null, open ? (
284
313
  // A labeled region, not an aside: it opens from the bar, inside the banner (FR-40).
285
314
  _jsxs("section", { ...popover.pane, "aria-label": "Activity", "data-testid": "activity", "data-graview-offstage": "", style: {
286
315
  ...POPOVER_STYLE,
@@ -298,8 +327,8 @@ export function ActivityRail({ calls, seat, remembers = false, }) {
298
327
  }, children: [_jsx("h2", { style: { ...VISUALLY_HIDDEN, margin: 0 }, children: "Activity" }), seat !== undefined ? (_jsxs("div", { "data-testid": "agent-seat-row", style: {
299
328
  display: "grid",
300
329
  gap: 5,
301
- paddingBottom: calls.length > 0 || changes.length > 0 ? 9 : 0,
302
- ...(calls.length > 0 || changes.length > 0
330
+ paddingBottom: calls.length > 0 || feed.length > 0 ? 9 : 0,
331
+ ...(calls.length > 0 || feed.length > 0
303
332
  ? { borderBottom: "1px solid var(--graview-edge)" }
304
333
  : {}),
305
334
  }, children: [_jsx("span", { style: {
@@ -321,18 +350,18 @@ export function ActivityRail({ calls, seat, remembers = false, }) {
321
350
  humanizeField(call.name)] })] }), !call.mutating && call.reads && call.reads.length > 0 ? (_jsxs("div", { "data-testid": "activity-reads", style: { display: "flex", flexWrap: "wrap", gap: 4, paddingLeft: 12 }, children: [[...new Set(call.reads)].slice(0, 3).map((id) => (_jsx(Named, { id: id, label: nameOf(store, id), go: goes(id) }, id))), new Set(call.reads).size > 3 ? _jsxs("span", { style: { color: "var(--graview-ink-muted)" }, children: ["+", new Set(call.reads).size - 3] }) : null] })) : Object.values(call.args).some((value) => typeof value === "string") ? (_jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 4, paddingLeft: 12 }, children: Object.entries(call.args)
322
351
  .filter((entry) => typeof entry[1] === "string")
323
352
  .slice(0, 3)
324
- .map(([name, value]) => (_jsx(Named, { id: value, label: nameOf(store, value), go: goes(value) }, name))) })) : null, call.error ? (_jsx("div", { style: { paddingLeft: 12, color: "var(--graview-warn)" }, children: call.error })) : null] }, `${call.at}:${index}`))) })) : null, changes.length > 0 ? (_jsx("ol", { "data-testid": "diff-log", style: {
353
+ .map(([name, value]) => (_jsx(Named, { id: value, label: nameOf(store, value), go: goes(value) }, name))) })) : null, call.error ? (_jsx("div", { style: { paddingLeft: 12, color: "var(--graview-warn)" }, children: call.error })) : null] }, `${call.at}:${index}`))) })) : null, interactions.length > 0 ? (_jsx(Suspense, { fallback: null, children: _jsx(ActivityFilter, { shows: shows, onShows: setShows, mine: mine, onMine: setMine }) })) : null, feed.length > 0 ? (_jsx("ol", { "data-testid": "diff-log", style: {
325
354
  margin: 0,
326
355
  padding: 0,
327
356
  listStyle: "none",
328
357
  display: "grid",
329
358
  gap: 6,
330
359
  fontSize: "0.8125rem",
331
- }, children: changes.map((change, index) => change.digest ? (_jsx(DigestRow, { change: change, goes: goes }, `digest:${change.digest[0]?.batch ?? index}`)) : change.withheld ? (
360
+ }, children: feed.map(({ change, entry }, index) => entry !== undefined ? (_jsx(Suspense, { fallback: null, children: _jsx(InteractionRow, { entry: entry, undo: (batch) => _jsx(UndoTurn, { batch: batch }) }) }, `ai:${entry.id}`)) : change.digest ? (_jsx(DigestRow, { change: change, goes: goes }, `digest:${change.digest[0]?.batch ?? index}`)) : change.withheld ? (
332
361
  /* SOMETHING YOU CANNOT SEE HAPPENED: said, and nothing more — not who, not what, no undo (FR-16). */
333
- _jsx("li", { "data-testid": "withheld-change", style: { display: "grid", gap: 3, lineHeight: 1.45 }, children: _jsx("span", { "data-touched": "", style: { color: "var(--graview-ink-muted)", fontStyle: "italic" }, children: change.intent }) }, `change:${index}`)) : (_jsxs("li", { style: { display: "grid", gap: 3, lineHeight: 1.45 }, children: [_jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 6 }, children: [_jsxs("span", { style: { minWidth: 0 }, children: [_jsxs("strong", { style: { fontWeight: 600 }, children: [change.author === "human" && change.by?.onBehalfOf === undefined && (change.authorId === undefined || principal.id === undefined || change.authorId === principal.id)
362
+ _jsx("li", { "data-testid": "withheld-change", style: { display: "grid", gap: 3, lineHeight: 1.45 }, children: _jsx("span", { "data-touched": "", style: { color: "var(--graview-ink-muted)", fontStyle: "italic" }, children: change.intent }) }, `change:${index}`)) : (_jsxs("li", { "data-batch": change.batch, style: { display: "grid", gap: 3, lineHeight: 1.45 }, children: [_jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 6 }, children: [_jsxs("span", { style: { minWidth: 0 }, children: [_jsxs("strong", { style: { fontWeight: 600 }, children: [change.author === "human" && change.by?.onBehalfOf === undefined && (change.authorId === undefined || principal.id === undefined || change.authorId === principal.id)
334
363
  ? "you"
335
- : nameOfAuthor(change.by ?? { kind: change.author, id: change.authorId }, { graph: store.graph, schema: store.schema, seats, people }), viaSaid(change.via) ? _jsxs("span", { style: { fontWeight: 400, color: "var(--graview-ink-muted)" }, children: [", ", viaSaid(change.via)] }) : null] }), " ", _jsx("span", { style: { color: "var(--graview-ink-muted)" }, children: change.intent }), change.basis ? _jsxs("span", { "data-graview-lineage": "", style: { color: "var(--graview-ink-faint)" }, children: [" \u00B7 ", change.basis] }) : null] }), change.batch ? _jsx(ShowAsItWas, { seq: change.seq, intent: change.intent }) : null, change.batch ? _jsx(UndoTurn, { batch: change.batch }) : null] }), _jsx("div", { "data-touched": change.touched.join(" "), style: { display: "flex", flexWrap: "wrap", gap: 4 }, children: change.touched.slice(0, 4).map((id) => (_jsx(Named, { id: id, label: store.graph.has(id) ? nameOf(store, id) : (change.removed?.[id] ?? nameOf(store, id)), go: goes(id) }, id))) })] }, `change:${index}`))) })) : null, remembers ? (_jsxs("div", { "data-testid": "remembered", style: {
364
+ : nameOfAuthor(change.by ?? { kind: change.author, id: change.authorId }, { graph: store.graph, schema: store.schema, seats, people }), viaSaid(change.via) ? _jsxs("span", { style: { fontWeight: 400, color: "var(--graview-ink-muted)" }, children: [", ", viaSaid(change.via)] }) : null] }), " ", _jsx("span", { style: { color: "var(--graview-ink-muted)" }, children: change.intent }), change.basis ? _jsxs("span", { "data-graview-lineage": "", style: { color: "var(--graview-ink-faint)" }, children: [" \u00B7 ", change.basis] }) : null] }), change.batch ? _jsx(ShowAsItWas, { seq: change.seq, intent: change.intent }) : null, change.batch ? _jsx(UndoTurn, { batch: change.batch }) : null] }), _jsx("div", { "data-touched": change.touched.join(" "), style: { display: "flex", flexWrap: "wrap", gap: 4 }, children: change.touched.slice(0, 4).map((id) => (_jsx(Named, { id: id, label: store.graph.has(id) ? nameOf(store, id) : (change.removed?.[id] ?? nameOf(store, id)), go: goes(id) }, id))) })] }, `change:${index}`))) })) : null, _jsx(NotifiedDoor, { style: { paddingTop: 8, borderTop: "1px solid var(--graview-edge)" } }), remembers ? (_jsxs("div", { "data-testid": "remembered", style: {
336
365
  display: "flex",
337
366
  alignItems: "baseline",
338
367
  justifyContent: "space-between",