@graview/primitives 0.1.29 → 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 (281) 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 +46 -9
  4. package/dist/app-bar.js.map +1 -1
  5. package/dist/app-link.d.ts.map +1 -1
  6. package/dist/app-link.js +5 -2
  7. package/dist/app-link.js.map +1 -1
  8. package/dist/app-title.d.ts +1 -1
  9. package/dist/app-title.d.ts.map +1 -1
  10. package/dist/app-title.js +7 -3
  11. package/dist/app-title.js.map +1 -1
  12. package/dist/arrange-bar.d.ts +10 -0
  13. package/dist/arrange-bar.d.ts.map +1 -1
  14. package/dist/arrange-bar.js +25 -4
  15. package/dist/arrange-bar.js.map +1 -1
  16. package/dist/arrange-lists.d.ts +4 -0
  17. package/dist/arrange-lists.d.ts.map +1 -1
  18. package/dist/arrange-lists.js +30 -2
  19. package/dist/arrange-lists.js.map +1 -1
  20. package/dist/bar-panes.d.ts +1 -1
  21. package/dist/bar-panes.d.ts.map +1 -1
  22. package/dist/bar-panes.js +1 -1
  23. package/dist/bar-panes.js.map +1 -1
  24. package/dist/bar-suggested.d.ts +2 -0
  25. package/dist/bar-suggested.d.ts.map +1 -0
  26. package/dist/bar-suggested.js +22 -0
  27. package/dist/bar-suggested.js.map +1 -0
  28. package/dist/chat.d.ts +8 -6
  29. package/dist/chat.d.ts.map +1 -1
  30. package/dist/chat.js +6 -3
  31. package/dist/chat.js.map +1 -1
  32. package/dist/connections.d.ts +1 -1
  33. package/dist/connections.d.ts.map +1 -1
  34. package/dist/connections.js +39 -4
  35. package/dist/connections.js.map +1 -1
  36. package/dist/declared-lens-doors.d.ts.map +1 -1
  37. package/dist/declared-lens-doors.js +4 -1
  38. package/dist/declared-lens-doors.js.map +1 -1
  39. package/dist/default-views.d.ts.map +1 -1
  40. package/dist/default-views.js +60 -17
  41. package/dist/default-views.js.map +1 -1
  42. package/dist/draft-frame.d.ts.map +1 -1
  43. package/dist/draft-frame.js +29 -2
  44. package/dist/draft-frame.js.map +1 -1
  45. package/dist/editable.d.ts +8 -1
  46. package/dist/editable.d.ts.map +1 -1
  47. package/dist/editable.js +58 -15
  48. package/dist/editable.js.map +1 -1
  49. package/dist/files.d.ts.map +1 -1
  50. package/dist/files.js +29 -5
  51. package/dist/files.js.map +1 -1
  52. package/dist/find.d.ts.map +1 -1
  53. package/dist/find.js +110 -11
  54. package/dist/find.js.map +1 -1
  55. package/dist/first-look-door.d.ts +71 -0
  56. package/dist/first-look-door.d.ts.map +1 -0
  57. package/dist/first-look-door.js +95 -0
  58. package/dist/first-look-door.js.map +1 -0
  59. package/dist/first-look.d.ts +12 -0
  60. package/dist/first-look.d.ts.map +1 -0
  61. package/dist/first-look.js +265 -0
  62. package/dist/first-look.js.map +1 -0
  63. package/dist/frame.d.ts +3 -0
  64. package/dist/frame.d.ts.map +1 -1
  65. package/dist/frame.js +4 -0
  66. package/dist/frame.js.map +1 -1
  67. package/dist/here.d.ts +24 -1
  68. package/dist/here.d.ts.map +1 -1
  69. package/dist/here.js +36 -1
  70. package/dist/here.js.map +1 -1
  71. package/dist/index.d.ts +19 -2
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +19 -2
  74. package/dist/index.js.map +1 -1
  75. package/dist/inline-ai-door.d.ts +15 -0
  76. package/dist/inline-ai-door.d.ts.map +1 -0
  77. package/dist/inline-ai-door.js +54 -0
  78. package/dist/inline-ai-door.js.map +1 -0
  79. package/dist/inline-ai-env.d.ts +29 -0
  80. package/dist/inline-ai-env.d.ts.map +1 -0
  81. package/dist/inline-ai-env.js +22 -0
  82. package/dist/inline-ai-env.js.map +1 -0
  83. package/dist/inline-ai-menu.d.ts +58 -0
  84. package/dist/inline-ai-menu.d.ts.map +1 -0
  85. package/dist/inline-ai-menu.js +297 -0
  86. package/dist/inline-ai-menu.js.map +1 -0
  87. package/dist/kind-stop.d.ts +3 -1
  88. package/dist/kind-stop.d.ts.map +1 -1
  89. package/dist/kind-stop.js +3 -2
  90. package/dist/kind-stop.js.map +1 -1
  91. package/dist/lens/arranging.d.ts.map +1 -1
  92. package/dist/lens/arranging.js +9 -1
  93. package/dist/lens/arranging.js.map +1 -1
  94. package/dist/lens/calendar-dates.d.ts.map +1 -1
  95. package/dist/lens/calendar-dates.js +12 -0
  96. package/dist/lens/calendar-dates.js.map +1 -1
  97. package/dist/lens/calendar-drawing.d.ts.map +1 -1
  98. package/dist/lens/calendar-drawing.js +6 -2
  99. package/dist/lens/calendar-drawing.js.map +1 -1
  100. package/dist/lens/calendar-options.d.ts +10 -1
  101. package/dist/lens/calendar-options.d.ts.map +1 -1
  102. package/dist/lens/calendar-options.js.map +1 -1
  103. package/dist/lens/calendar-spans.d.ts +5 -0
  104. package/dist/lens/calendar-spans.d.ts.map +1 -1
  105. package/dist/lens/calendar-spans.js +13 -2
  106. package/dist/lens/calendar-spans.js.map +1 -1
  107. package/dist/lens/calendar-view.d.ts.map +1 -1
  108. package/dist/lens/calendar-view.js +16 -2
  109. package/dist/lens/calendar-view.js.map +1 -1
  110. package/dist/lens/columns.d.ts +3 -1
  111. package/dist/lens/columns.d.ts.map +1 -1
  112. package/dist/lens/columns.js +6 -5
  113. package/dist/lens/columns.js.map +1 -1
  114. package/dist/lens/coverage.d.ts +8 -2
  115. package/dist/lens/coverage.d.ts.map +1 -1
  116. package/dist/lens/coverage.js +36 -10
  117. package/dist/lens/coverage.js.map +1 -1
  118. package/dist/lens-keeping.js +2 -3
  119. package/dist/lens-keeping.js.map +1 -1
  120. package/dist/linked-record-door.d.ts +4 -0
  121. package/dist/linked-record-door.d.ts.map +1 -0
  122. package/dist/linked-record-door.js +12 -0
  123. package/dist/linked-record-door.js.map +1 -0
  124. package/dist/linked-record.d.ts +34 -0
  125. package/dist/linked-record.d.ts.map +1 -0
  126. package/dist/linked-record.js +142 -0
  127. package/dist/linked-record.js.map +1 -0
  128. package/dist/map-panel.js +52 -3
  129. package/dist/map-panel.js.map +1 -1
  130. package/dist/notice-place.d.ts +2 -2
  131. package/dist/notice-place.js +2 -2
  132. package/dist/notify-door.d.ts +57 -0
  133. package/dist/notify-door.d.ts.map +1 -0
  134. package/dist/notify-door.js +136 -0
  135. package/dist/notify-door.js.map +1 -0
  136. package/dist/notify-sheet.d.ts +27 -0
  137. package/dist/notify-sheet.d.ts.map +1 -0
  138. package/dist/notify-sheet.js +102 -0
  139. package/dist/notify-sheet.js.map +1 -0
  140. package/dist/pages.d.ts +23 -4
  141. package/dist/pages.d.ts.map +1 -1
  142. package/dist/pages.js +24 -4
  143. package/dist/pages.js.map +1 -1
  144. package/dist/past-bar.d.ts +13 -0
  145. package/dist/past-bar.d.ts.map +1 -0
  146. package/dist/past-bar.js +26 -0
  147. package/dist/past-bar.js.map +1 -0
  148. package/dist/places.d.ts.map +1 -1
  149. package/dist/places.js +3 -2
  150. package/dist/places.js.map +1 -1
  151. package/dist/primitives/index.d.ts +8 -0
  152. package/dist/primitives/index.d.ts.map +1 -1
  153. package/dist/primitives/index.js +67 -29
  154. package/dist/primitives/index.js.map +1 -1
  155. package/dist/primitives/measure.d.ts +10 -0
  156. package/dist/primitives/measure.d.ts.map +1 -1
  157. package/dist/primitives/measure.js +27 -7
  158. package/dist/primitives/measure.js.map +1 -1
  159. package/dist/quick-ask-desk.d.ts +38 -0
  160. package/dist/quick-ask-desk.d.ts.map +1 -0
  161. package/dist/quick-ask-desk.js +36 -0
  162. package/dist/quick-ask-desk.js.map +1 -0
  163. package/dist/quick-ask-door.d.ts +33 -0
  164. package/dist/quick-ask-door.d.ts.map +1 -0
  165. package/dist/quick-ask-door.js +70 -0
  166. package/dist/quick-ask-door.js.map +1 -0
  167. package/dist/quick-ask-setting.d.ts +9 -0
  168. package/dist/quick-ask-setting.d.ts.map +1 -0
  169. package/dist/quick-ask-setting.js +11 -0
  170. package/dist/quick-ask-setting.js.map +1 -0
  171. package/dist/quick-ask.d.ts +23 -0
  172. package/dist/quick-ask.d.ts.map +1 -0
  173. package/dist/quick-ask.js +327 -0
  174. package/dist/quick-ask.js.map +1 -0
  175. package/dist/record-interactions-door.d.ts +8 -0
  176. package/dist/record-interactions-door.d.ts.map +1 -0
  177. package/dist/record-interactions-door.js +42 -0
  178. package/dist/record-interactions-door.js.map +1 -0
  179. package/dist/record-interactions.d.ts +13 -0
  180. package/dist/record-interactions.d.ts.map +1 -0
  181. package/dist/record-interactions.js +9 -0
  182. package/dist/record-interactions.js.map +1 -0
  183. package/dist/scene-bar.d.ts.map +1 -1
  184. package/dist/scene-bar.js +5 -2
  185. package/dist/scene-bar.js.map +1 -1
  186. package/dist/scene-css.d.ts.map +1 -1
  187. package/dist/scene-css.js +79 -8
  188. package/dist/scene-css.js.map +1 -1
  189. package/dist/scene-way-back-door.d.ts.map +1 -1
  190. package/dist/scene-way-back-door.js +9 -0
  191. package/dist/scene-way-back-door.js.map +1 -1
  192. package/dist/scene.d.ts +11 -2
  193. package/dist/scene.d.ts.map +1 -1
  194. package/dist/scene.js +10 -1
  195. package/dist/scene.js.map +1 -1
  196. package/dist/shell.d.ts +23 -24
  197. package/dist/shell.d.ts.map +1 -1
  198. package/dist/shell.js +9 -3
  199. package/dist/shell.js.map +1 -1
  200. package/dist/spec-css.d.ts.map +1 -1
  201. package/dist/spec-css.js +22 -2
  202. package/dist/spec-css.js.map +1 -1
  203. package/dist/spec-views.d.ts +6 -1
  204. package/dist/spec-views.d.ts.map +1 -1
  205. package/dist/spec-views.js +82 -16
  206. package/dist/spec-views.js.map +1 -1
  207. package/dist/stretched-link.d.ts +18 -0
  208. package/dist/stretched-link.d.ts.map +1 -0
  209. package/dist/stretched-link.js +47 -0
  210. package/dist/stretched-link.js.map +1 -0
  211. package/dist/suggested.d.ts +13 -0
  212. package/dist/suggested.d.ts.map +1 -0
  213. package/dist/suggested.js +82 -0
  214. package/dist/suggested.js.map +1 -0
  215. package/dist/theme.d.ts.map +1 -1
  216. package/dist/theme.js +25 -28
  217. package/dist/theme.js.map +1 -1
  218. package/dist/timeline.d.ts +6 -0
  219. package/dist/timeline.d.ts.map +1 -0
  220. package/dist/timeline.js +150 -0
  221. package/dist/timeline.js.map +1 -0
  222. package/dist/way-back.d.ts.map +1 -1
  223. package/dist/way-back.js +3 -0
  224. package/dist/way-back.js.map +1 -1
  225. package/dist/when-input-door.d.ts +8 -0
  226. package/dist/when-input-door.d.ts.map +1 -0
  227. package/dist/when-input-door.js +19 -0
  228. package/dist/when-input-door.js.map +1 -0
  229. package/dist/when-input.d.ts +34 -0
  230. package/dist/when-input.d.ts.map +1 -0
  231. package/dist/when-input.js +122 -0
  232. package/dist/when-input.js.map +1 -0
  233. package/dist/when-picker-door.d.ts +6 -0
  234. package/dist/when-picker-door.d.ts.map +1 -0
  235. package/dist/when-picker-door.js +15 -0
  236. package/dist/when-picker-door.js.map +1 -0
  237. package/dist/when-picker.d.ts +16 -0
  238. package/dist/when-picker.d.ts.map +1 -0
  239. package/dist/when-picker.js +108 -0
  240. package/dist/when-picker.js.map +1 -0
  241. package/dist/workbench/activity.d.ts +24 -0
  242. package/dist/workbench/activity.d.ts.map +1 -1
  243. package/dist/workbench/activity.js +159 -33
  244. package/dist/workbench/activity.js.map +1 -1
  245. package/dist/workbench/agent-seat.d.ts.map +1 -1
  246. package/dist/workbench/agent-seat.js +5 -2
  247. package/dist/workbench/agent-seat.js.map +1 -1
  248. package/dist/workbench/ai-entries.d.ts +22 -0
  249. package/dist/workbench/ai-entries.d.ts.map +1 -0
  250. package/dist/workbench/ai-entries.js +75 -0
  251. package/dist/workbench/ai-entries.js.map +1 -0
  252. package/dist/workbench/ai-feed.d.ts +12 -0
  253. package/dist/workbench/ai-feed.d.ts.map +1 -0
  254. package/dist/workbench/ai-feed.js +14 -0
  255. package/dist/workbench/ai-feed.js.map +1 -0
  256. package/dist/workbench/answer-args.d.ts.map +1 -1
  257. package/dist/workbench/answer-args.js +87 -10
  258. package/dist/workbench/answer-args.js.map +1 -1
  259. package/dist/workbench/back-out.d.ts.map +1 -1
  260. package/dist/workbench/back-out.js +7 -2
  261. package/dist/workbench/back-out.js.map +1 -1
  262. package/dist/workbench/inspector-door.d.ts +3 -1
  263. package/dist/workbench/inspector-door.d.ts.map +1 -1
  264. package/dist/workbench/inspector-door.js +7 -6
  265. package/dist/workbench/inspector-door.js.map +1 -1
  266. package/dist/workbench/inspector.d.ts +2 -1
  267. package/dist/workbench/inspector.d.ts.map +1 -1
  268. package/dist/workbench/inspector.js +94 -17
  269. package/dist/workbench/inspector.js.map +1 -1
  270. package/dist/workbench/trail.d.ts.map +1 -1
  271. package/dist/workbench/trail.js +10 -2
  272. package/dist/workbench/trail.js.map +1 -1
  273. package/package.json +6 -6
  274. package/dist/seat-field.d.ts +0 -58
  275. package/dist/seat-field.d.ts.map +0 -1
  276. package/dist/seat-field.js +0 -183
  277. package/dist/seat-field.js.map +0 -1
  278. package/dist/seat-panel.d.ts +0 -38
  279. package/dist/seat-panel.d.ts.map +0 -1
  280. package/dist/seat-panel.js +0 -212
  281. package/dist/seat-panel.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { layer, momentAsRead } from "@graview/core";
3
+ import { makerWords, restoreBatches, ticksOf } from "@graview/core/history";
4
+ import { useGraviewIfAny, useLiveStore, usePlayback } from "@graview/react/provider";
5
+ import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
6
+ import "./frame.js"; // A door: tied to what the page drew first (TIED DOORS, packages/primitives/src/frame.ts).
7
+ /*
8
+ * THE TIMELINE (Roadmap f-playback): the app's history as a line a person
9
+ * scrubs, one tick per change — marked by who made it, the bigger ticks
10
+ * where the declaration changed, with the sentence it said — and a player
11
+ * that walks it at a speed. While a moment is shown, the face draws the
12
+ * store of that moment (`pastOf`), offering no act; "Back to now" leaves.
13
+ */
14
+ const ANYONE = { kind: "human" };
15
+ const SPEEDS = [1, 2, 4, 8];
16
+ /** How long a change stands at 1×, in milliseconds. */
17
+ const STEP_MS = 900;
18
+ const MAKER_WORDS = { you: "You", person: "A person", agent: "An agent", app: "The app" };
19
+ const MAKER_INK = {
20
+ you: "var(--graview-accent)",
21
+ person: "var(--graview-ink-muted)",
22
+ agent: "var(--graview-activity, var(--graview-good))",
23
+ app: "var(--graview-edge-bright)",
24
+ };
25
+ /** The stops a scrubber walks: the start, then the moment after each change. */
26
+ function stopsOf(ticks, horizon) {
27
+ return [...new Set([horizon, ...ticks.map((tick) => tick.seq)])].sort((a, b) => a - b);
28
+ }
29
+ /** The stop at or before `seq`. */
30
+ function indexOf(stops, seq) {
31
+ let at = 0;
32
+ for (let i = 0; i < stops.length; i++)
33
+ if (stops[i] <= seq)
34
+ at = i;
35
+ return at;
36
+ }
37
+ /** The gestures a "Restore to here" would take back, when this seat may take every one back as one change. */
38
+ function restorable(live, seq, principal) {
39
+ const batches = restoreBatches(live, seq);
40
+ if (batches.length === 0)
41
+ return null;
42
+ const check = live.canUndo(batches);
43
+ if (!check.ok)
44
+ return null;
45
+ // What you may undo is what you may have done: offered only when every change since is one this seat may make.
46
+ const may = new Set(live.permittedMutations(principal).map((mutation) => mutation.name));
47
+ return check.ops.every((op) => op.mutation !== null && may.has(op.mutation.name)) ? batches : null;
48
+ }
49
+ export function Timeline({ face }) {
50
+ const playback = usePlayback();
51
+ const graview = useGraviewIfAny();
52
+ const principal = graview?.principal ?? ANYONE;
53
+ const live = useLiveStore(playback.live, principal);
54
+ const length = live.log.length;
55
+ const ticks = useMemo(() => ticksOf(live, { me: principal, ...(playback.host?.declarations ? { declarations: playback.host.declarations } : {}) }),
56
+ // The log only grows at its end: its length says when to read it again.
57
+ [live, principal, playback.host, length]);
58
+ const stops = useMemo(() => stopsOf(ticks, live.log.horizon), [ticks, live]);
59
+ const seq = playback.past?.seq ?? length;
60
+ const index = indexOf(stops, seq);
61
+ const last = stops.length - 1;
62
+ const tick = [...ticks].reverse().find((one) => one.seq <= seq && one.seq > (stops[index - 1] ?? -1)) ?? [...ticks].reverse().find((one) => one.seq <= seq);
63
+ const [playing, setPlaying] = useState(false);
64
+ const [speed, setSpeed] = useState(1);
65
+ const [refused, setRefused] = useState(null);
66
+ // The player: one change at a time, at its speed, stopping at now.
67
+ useEffect(() => {
68
+ if (!playing)
69
+ return;
70
+ if (index >= last) {
71
+ setPlaying(false);
72
+ return;
73
+ }
74
+ const timer = setTimeout(() => playback.show(stops[index + 1]), STEP_MS / speed);
75
+ return () => clearTimeout(timer);
76
+ }, [playing, index, last, speed, stops, playback]);
77
+ const restore = useMemo(() => (playback.past ? restorable(live, seq, principal) : null), [playback.past, live, seq, principal, length]);
78
+ const who = (one) => makerWords(one, { graph: live.graph, schema: live.schema, ...(graview?.seats ? { seats: graview.seats } : {}), ...(graview?.people ? { people: graview.people } : {}) });
79
+ const asOf = playback.past ? (playback.past.at ? momentAsRead(playback.past.at, graview?.locale) : "the start") : null;
80
+ const caption = tick ? `${who(tick) === "you" ? "You" : who(tick)}: ${tick.said}` : "Nothing had happened yet";
81
+ /*
82
+ * ON THE SCENE IT STANDS OVER THE PICTURE'S FOOT, AND SAYS HOW TALL, as a
83
+ * sheet does (`--graview-sheet`): the city is fitted above it and the
84
+ * zoom stands over it. Laid over the city, it stood on a district's
85
+ * problem count, which a press could not reach (W-224).
86
+ */
87
+ const section = useRef(null);
88
+ useLayoutEffect(() => {
89
+ const element = section.current;
90
+ const picture = element?.parentElement;
91
+ if (face !== "scene" || !element || !picture)
92
+ return;
93
+ const measure = () => picture.style.setProperty("--graview-sheet", `${Math.ceil(element.getBoundingClientRect().height) + 24}px`);
94
+ measure();
95
+ const watch = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
96
+ watch?.observe(element);
97
+ return () => {
98
+ watch?.disconnect();
99
+ picture.style.removeProperty("--graview-sheet");
100
+ };
101
+ }, [face]);
102
+ const box = face === "scene"
103
+ ? { position: "absolute", left: "50%", bottom: 12, transform: "translateX(-50%)", width: "min(720px, calc(100% - 32px))", zIndex: layer("rail") }
104
+ : { position: "sticky", top: 0, zIndex: layer("rail"), margin: "0 auto 12px", maxWidth: 960, width: "100%" };
105
+ return (_jsxs("section", { ref: section, "aria-label": "Timeline", "data-testid": "timeline", "data-graview-past": playback.past ? String(playback.past.seq) : "now", "data-graview-offstage": "", style: {
106
+ ...box,
107
+ boxSizing: "border-box",
108
+ display: "grid",
109
+ gap: 8,
110
+ padding: "10px 12px",
111
+ borderRadius: 10,
112
+ border: "1px solid var(--graview-edge)",
113
+ background: "var(--graview-float)",
114
+ boxShadow: "var(--graview-lift-high)",
115
+ color: "var(--graview-ink)",
116
+ fontSize: "0.8125rem",
117
+ }, children: [_jsxs("div", { style: { display: "flex", flexWrap: "wrap", alignItems: "baseline", gap: "4px 12px" }, children: [_jsx("strong", { "data-testid": "as-of", role: "status", style: { fontWeight: 600 }, children: asOf ? `As of ${asOf}` : "Now" }), _jsx("span", { "data-testid": "timeline-caption", style: { color: "var(--graview-ink-muted)", minWidth: 0, overflowWrap: "anywhere" }, children: caption }), asOf ? (_jsx("span", { style: { color: "var(--graview-ink-faint)" }, "data-testid": "past-read-only", children: "Nothing changes while you look back." })) : null] }), _jsx("div", { style: { position: "relative", height: 22 }, "aria-hidden": "true", children: stops.slice(1).map((stop, at) => {
118
+ const one = [...ticks].reverse().find((candidate) => candidate.seq === stop);
119
+ const left = last === 0 ? 0 : ((at + 1) / last) * 100;
120
+ return (_jsx("span", { "data-graview-tick": stop, "data-maker": one.maker, ...(one.declaration ? { "data-declaration": "" } : {}), title: `${MAKER_WORDS[one.maker]}: ${one.said}`, style: {
121
+ position: "absolute",
122
+ left: `calc(${left}% - 1px)`,
123
+ bottom: 0,
124
+ width: one.declaration ? 4 : 2,
125
+ height: one.declaration ? 22 : 12,
126
+ borderRadius: 2,
127
+ background: one.declaration ? "var(--graview-ink)" : MAKER_INK[one.maker],
128
+ opacity: stop <= seq ? 1 : 0.45,
129
+ } }, `${stop}:${one.batch ?? "declaration"}`));
130
+ }) }), _jsx("input", { type: "range", "data-testid": "scrubber", "aria-label": "Moment", min: 0, max: last, step: 1, value: index, "aria-valuetext": asOf ? `As of ${asOf}. ${caption}` : `Now. ${caption}`, onChange: (event) => {
131
+ setPlaying(false);
132
+ playback.show(stops[Number(event.currentTarget.value)] ?? length);
133
+ }, style: { width: "100%", margin: 0, accentColor: "var(--graview-accent)" } }), _jsxs("div", { style: { display: "flex", flexWrap: "wrap", alignItems: "center", gap: 8 }, children: [_jsx("button", { type: "button", "data-testid": "play", "aria-pressed": playing, onClick: () => {
134
+ if (!playing && index >= last)
135
+ playback.show(stops[0]);
136
+ setPlaying(!playing);
137
+ }, style: { minHeight: 28, minWidth: 64 }, children: playing ? "Pause" : "Play" }), _jsxs("label", { style: { display: "inline-flex", alignItems: "center", gap: 6, color: "var(--graview-ink-muted)" }, children: ["Speed", _jsx("select", { "data-testid": "speed", value: speed, onChange: (event) => setSpeed(Number(event.currentTarget.value)), style: { minHeight: 28 }, children: SPEEDS.map((one) => (_jsxs("option", { value: one, children: [one, "\u00D7"] }, one))) })] }), _jsx("span", { "aria-hidden": "true", style: { display: "inline-flex", gap: 10, color: "var(--graview-ink-faint)", flexWrap: "wrap" }, children: Object.keys(MAKER_WORDS)
138
+ .filter((maker) => ticks.some((one) => one.maker === maker))
139
+ .map((maker) => (_jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [_jsx("span", { style: { width: 8, height: 8, borderRadius: 2, background: MAKER_INK[maker] } }), MAKER_WORDS[maker]] }, maker))) }), _jsxs("span", { style: { marginLeft: "auto", display: "inline-flex", gap: 8 }, children: [restore ? (_jsx("button", { type: "button", "data-testid": "restore-here", title: "Take back every change since, as one change you can undo", onClick: () => {
140
+ setRefused(null);
141
+ try {
142
+ live.undo([...restore], { author: principal, intent: asOf ? `Restore to ${asOf}` : "Restore" });
143
+ playback.show(null);
144
+ }
145
+ catch (error) {
146
+ setRefused(error instanceof Error ? error.message : String(error));
147
+ }
148
+ }, style: { minHeight: 28 }, children: "Restore to here" })) : null, _jsx("button", { type: "button", "data-testid": "back-to-now", onClick: () => playback.show(null), style: { minHeight: 28 }, children: "Back to now" })] })] }), refused ? (_jsx("span", { role: "alert", "data-testid": "restore-refused", style: { color: "var(--graview-warn)" }, children: refused })) : null] }));
149
+ }
150
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAA8C,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAiC,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AAElG,OAAO,YAAY,CAAC,CAAC,2FAA2F;AAEhH;;;;;;GAMG;AAEH,MAAM,MAAM,GAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;AACrC,uDAAuD;AACvD,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,WAAW,GAA0B,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACjH,MAAM,SAAS,GAA0B;IACvC,GAAG,EAAE,uBAAuB;IAC5B,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,8CAA8C;IACrD,GAAG,EAAE,4BAA4B;CAClC,CAAC;AAEF,gFAAgF;AAChF,SAAS,OAAO,CAAC,KAA8B,EAAE,OAAe;IAC9D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,mCAAmC;AACnC,SAAS,OAAO,CAAC,KAAwB,EAAE,GAAW;IACpD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,KAAK,CAAC,CAAC,CAAE,IAAI,GAAG;YAAE,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8GAA8G;AAC9G,SAAS,UAAU,CAAsB,IAAc,EAAE,GAAW,EAAE,SAAoB;IACxF,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3B,+GAA+G;IAC/G,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAmC;IAChE,MAAM,QAAQ,GAAG,WAAW,EAAc,CAAC;IAC3C,MAAM,OAAO,GAAG,eAAe,EAAa,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5H,wEAAwE;IACxE,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CACzC,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAC5J,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;QAClF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxI,MAAM,GAAG,GAAG,CAAC,GAAiB,EAAE,EAAE,CAChC,UAAU,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpL,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC;IAE/G;;;;;OAKG;IACH,MAAM,OAAO,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACjD,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,EAAE,aAAa,CAAC;QACvC,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,OAAO;QACrD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClI,OAAO,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,OAAO,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QACzF,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACV,KAAK,EAAE,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,GAAG,GACP,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,+BAA+B,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QACjJ,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEjH,OAAO,CACL,mBACE,GAAG,EAAE,OAAO,gBACD,UAAU,iBACT,UAAU,uBACH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,2BAC9C,EAAE,EACxB,KAAK,EAAE;YACL,GAAG,GAAG;YACN,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,WAAW;YACpB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,+BAA+B;YACvC,UAAU,EAAE,sBAAsB;YAClC,SAAS,EAAE,0BAA0B;YACrC,KAAK,EAAE,oBAAoB;YAC3B,QAAQ,EAAE,WAAW;SACtB,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,aACxF,gCAAoB,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YACjE,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GACxB,EACT,8BAAkB,kBAAkB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,YACrH,OAAO,GACH,EACN,IAAI,CAAC,CAAC,CAAC,CACN,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,iBAAc,gBAAgB,qDAEzE,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EAEN,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAc,MAAM,YAEjE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;oBAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,IAAI,CAAE,CAAC;oBAC9E,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;oBACtD,OAAO,CACL,oCAEqB,IAAI,gBACX,GAAG,CAAC,KAAK,KACjB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACvD,KAAK,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,EAC/C,KAAK,EAAE;4BACL,QAAQ,EAAE,UAAU;4BACpB,IAAI,EAAE,QAAQ,IAAI,UAAU;4BAC5B,MAAM,EAAE,CAAC;4BACT,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC9B,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;4BACjC,YAAY,EAAE,CAAC;4BACf,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;4BACzE,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;yBAChC,IAdI,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,aAAa,EAAE,CAe5C,CACH,CAAC;gBACJ,CAAC,CAAC,GACE,EACN,gBACE,IAAI,EAAC,OAAO,iBACA,UAAU,gBACX,QAAQ,EACnB,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,oBACI,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,EACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;gBACpE,CAAC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,GACzE,EAEF,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC7E,iBACE,IAAI,EAAC,QAAQ,iBACD,MAAM,kBACJ,OAAO,EACrB,OAAO,EAAE,GAAG,EAAE;4BACZ,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI;gCAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;4BACxD,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;wBACvB,CAAC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAErC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GACpB,EACT,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,sBAEvG,gCAAoB,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAA4B,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAC5J,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACnB,kBAAkB,KAAK,EAAE,GAAG,aACzB,GAAG,eADO,GAAG,CAEP,CACV,CAAC,GACK,IACH,EACR,8BAAkB,MAAM,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,EAAE,YACpH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAa;6BACnC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;6BAC3D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACd,gBAAkB,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC/E,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,GAAI,EACtF,WAAW,CAAC,KAAK,CAAC,KAFV,KAAK,CAGT,CACR,CAAC,GACC,EACP,gBAAM,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,aAChE,OAAO,CAAC,CAAC,CAAC,CACT,iBACE,IAAI,EAAC,QAAQ,iBACD,cAAc,EAC1B,KAAK,EAAC,0DAA0D,EAChE,OAAO,EAAE,GAAG,EAAE;oCACZ,UAAU,CAAC,IAAI,CAAC,CAAC;oCACjB,IAAI,CAAC;wCACH,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;wCAChG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oCACtB,CAAC;oCAAC,OAAO,KAAK,EAAE,CAAC;wCACf,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oCACrE,CAAC;gCACH,CAAC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gCAGjB,CACV,CAAC,CAAC,CAAC,IAAI,EACR,iBAAQ,IAAI,EAAC,QAAQ,iBAAa,aAAa,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,4BAEnG,IACJ,IACH,EACL,OAAO,CAAC,CAAC,CAAC,CACT,eAAM,IAAI,EAAC,OAAO,iBAAa,iBAAiB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YACrF,OAAO,GACH,CACR,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"way-back.d.ts","sourceRoot":"","sources":["../src/way-back.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+DAA+D;AAC/D,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAgBhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAG1I;AAED,oFAAoF;AACpF,eAAO,MAAM,aAAa,GAAI,QAAQ,UAAU,WAAmC,CAAC;AAEpF,sHAAsH;AACtH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAIhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAU3D"}
1
+ {"version":3,"file":"way-back.d.ts","sourceRoot":"","sources":["../src/way-back.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+DAA+D;AAC/D,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAkBhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAG1I;AAED,oFAAoF;AACpF,eAAO,MAAM,aAAa,GAAI,QAAQ,UAAU,WAAmC,CAAC;AAEpF,sHAAsH;AACtH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAIhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAU3D"}
package/dist/way-back.js CHANGED
@@ -13,6 +13,9 @@ export const WAY_BACK_MS = 10_000;
13
13
  * offer to take back another's work.
14
14
  */
15
15
  export function lastChangeOf(store, principal) {
16
+ // The app as it was is read, never changed (Roadmap f-playback): nothing there to take back.
17
+ if (store.past)
18
+ return undefined;
16
19
  const batches = store.batches();
17
20
  for (let at = batches.length - 1; at >= 0; at--) {
18
21
  const batch = batches[at];
@@ -1 +1 @@
1
- {"version":3,"file":"way-back.js","sourceRoot":"","sources":["../src/way-back.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"way-back.js","sourceRoot":"","sources":["../src/way-back.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ReactNode } from "react";
2
+ import type { WhenInputProps } from "./when-input.js";
3
+ /** A day or a moment, typed as people say it or picked from a month (Roadmap f-date-inputs). */
4
+ export declare function WhenInput(props: WhenInputProps): ReactNode;
5
+ /** 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. */
6
+ export declare const prefetchWhenInput: () => Promise<void>;
7
+ export type { WhenInputProps } from "./when-input.js";
8
+ //# sourceMappingURL=when-input-door.d.ts.map
@@ -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