@graview/guest 0.1.9 → 0.1.10

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 (173) hide show
  1. package/README.md +301 -2
  2. package/client.js +2 -0
  3. package/dist/channel.d.ts +11 -3
  4. package/dist/channel.d.ts.map +1 -1
  5. package/dist/channel.js +5 -1
  6. package/dist/channel.js.map +1 -1
  7. package/dist/cli.d.ts +16 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +75 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client-script.d.ts +3 -0
  12. package/dist/client-script.d.ts.map +1 -0
  13. package/dist/client-script.js +21 -0
  14. package/dist/client-script.js.map +1 -0
  15. package/dist/client.d.ts +2 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.generated.d.ts +4 -0
  18. package/dist/client.generated.d.ts.map +1 -0
  19. package/dist/client.generated.js +9 -0
  20. package/dist/client.generated.js.map +1 -0
  21. package/dist/client.js +12 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/headless/describe.d.ts +19 -0
  24. package/dist/headless/describe.d.ts.map +1 -0
  25. package/dist/headless/describe.js +255 -0
  26. package/dist/headless/describe.js.map +1 -0
  27. package/dist/headless/draw.d.ts +17 -0
  28. package/dist/headless/draw.d.ts.map +1 -0
  29. package/dist/headless/draw.js +25 -0
  30. package/dist/headless/draw.js.map +1 -0
  31. package/dist/headless/index.d.ts +99 -0
  32. package/dist/headless/index.d.ts.map +1 -0
  33. package/dist/headless/index.js +143 -0
  34. package/dist/headless/index.js.map +1 -0
  35. package/dist/headless/judge.d.ts +16 -0
  36. package/dist/headless/judge.d.ts.map +1 -0
  37. package/dist/headless/judge.js +52 -0
  38. package/dist/headless/judge.js.map +1 -0
  39. package/dist/headless/node.d.ts +8 -0
  40. package/dist/headless/node.d.ts.map +1 -0
  41. package/dist/headless/node.js +80 -0
  42. package/dist/headless/node.js.map +1 -0
  43. package/dist/headless/protocol.d.ts +71 -0
  44. package/dist/headless/protocol.d.ts.map +1 -0
  45. package/dist/headless/protocol.js +14 -0
  46. package/dist/headless/protocol.js.map +1 -0
  47. package/dist/headless/runtime.d.ts +2 -0
  48. package/dist/headless/runtime.d.ts.map +1 -0
  49. package/dist/headless/runtime.generated.d.ts +2 -0
  50. package/dist/headless/runtime.generated.d.ts.map +1 -0
  51. package/dist/headless/runtime.generated.js +8 -0
  52. package/dist/headless/runtime.generated.js.map +1 -0
  53. package/dist/headless/runtime.js +171 -0
  54. package/dist/headless/runtime.js.map +1 -0
  55. package/dist/headless/tree.d.ts +54 -0
  56. package/dist/headless/tree.d.ts.map +1 -0
  57. package/dist/headless/tree.js +128 -0
  58. package/dist/headless/tree.js.map +1 -0
  59. package/dist/host/css.d.ts +118 -0
  60. package/dist/host/css.d.ts.map +1 -0
  61. package/dist/host/css.js +963 -0
  62. package/dist/host/css.js.map +1 -0
  63. package/dist/host/draw-budget.d.ts +10 -0
  64. package/dist/host/draw-budget.d.ts.map +1 -0
  65. package/dist/host/draw-budget.js +29 -0
  66. package/dist/host/draw-budget.js.map +1 -0
  67. package/dist/host/frame.d.ts +19 -1
  68. package/dist/host/frame.d.ts.map +1 -1
  69. package/dist/host/frame.js +21 -2
  70. package/dist/host/frame.js.map +1 -1
  71. package/dist/host/index.d.ts +4 -3
  72. package/dist/host/index.d.ts.map +1 -1
  73. package/dist/host/index.js +7 -1
  74. package/dist/host/index.js.map +1 -1
  75. package/dist/host/kit.d.ts +6 -2
  76. package/dist/host/kit.d.ts.map +1 -1
  77. package/dist/host/kit.js +12 -5
  78. package/dist/host/kit.js.map +1 -1
  79. package/dist/host/links.d.ts +24 -0
  80. package/dist/host/links.d.ts.map +1 -0
  81. package/dist/host/links.js +35 -0
  82. package/dist/host/links.js.map +1 -0
  83. package/dist/host/manifest.d.ts +50 -0
  84. package/dist/host/manifest.d.ts.map +1 -0
  85. package/dist/host/manifest.js +103 -0
  86. package/dist/host/manifest.js.map +1 -0
  87. package/dist/host/open-draw.d.ts +44 -0
  88. package/dist/host/open-draw.d.ts.map +1 -0
  89. package/dist/host/open-draw.js +108 -0
  90. package/dist/host/open-draw.js.map +1 -0
  91. package/dist/host/open-judge.d.ts +53 -0
  92. package/dist/host/open-judge.d.ts.map +1 -0
  93. package/dist/host/open-judge.js +95 -0
  94. package/dist/host/open-judge.js.map +1 -0
  95. package/dist/host/open-render.d.ts +32 -0
  96. package/dist/host/open-render.d.ts.map +1 -0
  97. package/dist/host/open-render.js +262 -0
  98. package/dist/host/open-render.js.map +1 -0
  99. package/dist/host/press.d.ts +15 -0
  100. package/dist/host/press.d.ts.map +1 -0
  101. package/dist/host/press.js +156 -0
  102. package/dist/host/press.js.map +1 -0
  103. package/dist/host/react.d.ts +15 -2
  104. package/dist/host/react.d.ts.map +1 -1
  105. package/dist/host/react.js +13 -5
  106. package/dist/host/react.js.map +1 -1
  107. package/dist/host/session.d.ts +94 -1
  108. package/dist/host/session.d.ts.map +1 -1
  109. package/dist/host/session.js +103 -14
  110. package/dist/host/session.js.map +1 -1
  111. package/dist/host/theme.d.ts +14 -0
  112. package/dist/host/theme.d.ts.map +1 -0
  113. package/dist/host/theme.js +51 -0
  114. package/dist/host/theme.js.map +1 -0
  115. package/dist/host/view-runtime.generated.d.ts +2 -0
  116. package/dist/host/view-runtime.generated.d.ts.map +1 -0
  117. package/dist/host/view-runtime.generated.js +7 -0
  118. package/dist/host/view-runtime.generated.js.map +1 -0
  119. package/dist/host/view-source.d.ts +5 -0
  120. package/dist/host/view-source.d.ts.map +1 -0
  121. package/dist/host/view-source.js +39 -0
  122. package/dist/host/view-source.js.map +1 -0
  123. package/dist/host/view.d.ts +134 -0
  124. package/dist/host/view.d.ts.map +1 -0
  125. package/dist/host/view.js +381 -0
  126. package/dist/host/view.js.map +1 -0
  127. package/dist/host/views.d.ts +10 -0
  128. package/dist/host/views.d.ts.map +1 -0
  129. package/dist/host/views.js +15 -0
  130. package/dist/host/views.js.map +1 -0
  131. package/dist/host/worker-react.d.ts +51 -0
  132. package/dist/host/worker-react.d.ts.map +1 -0
  133. package/dist/host/worker-react.js +123 -0
  134. package/dist/host/worker-react.js.map +1 -0
  135. package/dist/host/worker-start.d.ts +49 -0
  136. package/dist/host/worker-start.d.ts.map +1 -0
  137. package/dist/host/worker-start.js +122 -0
  138. package/dist/host/worker-start.js.map +1 -0
  139. package/dist/host/worker.d.ts +17 -12
  140. package/dist/host/worker.d.ts.map +1 -1
  141. package/dist/host/worker.js +58 -117
  142. package/dist/host/worker.js.map +1 -1
  143. package/dist/host/writes.d.ts +49 -0
  144. package/dist/host/writes.d.ts.map +1 -0
  145. package/dist/host/writes.js +76 -0
  146. package/dist/host/writes.js.map +1 -0
  147. package/dist/index.d.ts +1 -1
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/open-kit.d.ts +148 -0
  150. package/dist/open-kit.d.ts.map +1 -0
  151. package/dist/open-kit.js +321 -0
  152. package/dist/open-kit.js.map +1 -0
  153. package/dist/protocol.d.ts +109 -3
  154. package/dist/protocol.d.ts.map +1 -1
  155. package/dist/protocol.js +13 -0
  156. package/dist/protocol.js.map +1 -1
  157. package/dist/worker/harden.d.ts +13 -2
  158. package/dist/worker/harden.d.ts.map +1 -1
  159. package/dist/worker/harden.js +10 -4
  160. package/dist/worker/harden.js.map +1 -1
  161. package/dist/worker/natives.d.ts +1 -0
  162. package/dist/worker/natives.d.ts.map +1 -1
  163. package/dist/worker/natives.js +4 -0
  164. package/dist/worker/natives.js.map +1 -1
  165. package/dist/worker/view-global.d.ts +70 -0
  166. package/dist/worker/view-global.d.ts.map +1 -0
  167. package/dist/worker/view-global.js +264 -0
  168. package/dist/worker/view-global.js.map +1 -0
  169. package/dist/worker/view.d.ts +14 -0
  170. package/dist/worker/view.d.ts.map +1 -0
  171. package/dist/worker/view.js +64 -0
  172. package/dist/worker/view.js.map +1 -0
  173. package/package.json +30 -4
@@ -0,0 +1,262 @@
1
+ import { HTML_NAMESPACE, OPEN_MAX_TEXT, SVG_NAMESPACE } from "../open-kit.js";
2
+ import { isEmptyElement, judgeAttribute, judgeElement } from "./open-judge.js";
3
+ /*
4
+ * A WORKER VIEW'S DRAWING, DRAWN (FR-90): Remote DOM mutation records from
5
+ * the view's worker, judged one element and one attribute at a time against
6
+ * the open kit (open-judge.ts) and drawn into a parent the host owns — a
7
+ * shadow root, in a page. A node refused holds its place as an empty
8
+ * comment, so the view's indices stay true, and nothing under it is drawn.
9
+ *
10
+ * It uses a handful of DOM calls (createElementNS, createTextNode,
11
+ * createComment, setAttribute, removeAttribute, insertBefore, removeChild),
12
+ * so a host without a DOM can hand it a document of its own that has them.
13
+ */
14
+ const INSERT_CHILD = 0;
15
+ const REMOVE_CHILD = 1;
16
+ const UPDATE_TEXT = 2;
17
+ const UPDATE_PROPERTY = 3;
18
+ const PROPERTY = 1;
19
+ const ATTRIBUTE = 2;
20
+ const EVENT_LISTENER = 3;
21
+ const ELEMENT = 1;
22
+ const TEXT = 3;
23
+ const COMMENT = 8;
24
+ const ROOT_ID = "~";
25
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
26
+ const FIELDS = new Set(["input", "select", "textarea", "option"]);
27
+ const FIELD_ATTRIBUTES = new Set(["value", "checked", "selected"]);
28
+ export function createOpenRenderer(into, options) {
29
+ const document = (into.ownerDocument ?? into);
30
+ const maxNodes = options.maxNodes ?? 5_000;
31
+ const refused = [];
32
+ const byId = new Map();
33
+ const ids = new WeakMap();
34
+ const root = { dom: into, name: "div", namespace: "html", children: [], id: ROOT_ID };
35
+ byId.set(ROOT_ID, root);
36
+ let size = 0;
37
+ let over = false;
38
+ const refuse = (refusal) => {
39
+ refused.push(refusal);
40
+ if (refused.length > 200)
41
+ refused.shift();
42
+ };
43
+ const placeholder = () => ({ dom: document.createComment(""), children: [], refused: true });
44
+ /** The field a node is, or is inside (an option's select, a textarea's text). */
45
+ const fieldOf = (drawn, parent) => {
46
+ if (drawn.namespace === "html" && drawn.name && FIELDS.has(drawn.name))
47
+ return drawn.dom;
48
+ if (parent?.namespace === "html" && parent.name === "textarea")
49
+ return parent.dom;
50
+ return undefined;
51
+ };
52
+ const setAttribute = (drawn, name, value) => {
53
+ const element = drawn.dom;
54
+ if (value !== null && value !== undefined && typeof value !== "string")
55
+ return refuse({ reason: "value", element: drawn.name, name });
56
+ const judged = judgeAttribute(drawn.namespace, drawn.name, name, value ?? null, options);
57
+ if ("refused" in judged) {
58
+ /* Refused: what it would have said is not drawn, and anything it said before goes too. */
59
+ const known = judgeAttribute(drawn.namespace, drawn.name, name, null, options);
60
+ if (!("refused" in known))
61
+ element.removeAttribute(known.name);
62
+ return refuse(judged.refused);
63
+ }
64
+ for (const one of judged.dropped ?? [])
65
+ refuse(one);
66
+ const isField = drawn.namespace === "html" && FIELD_ATTRIBUTES.has(judged.name) && FIELDS.has(drawn.name);
67
+ const field = element;
68
+ /* What the field showed before the view spoke: a view that says what is already there has not changed it. */
69
+ const before = isField ? (judged.name === "value" ? field.value : judged.name === "checked" ? field.checked : field.selected) : undefined;
70
+ if (judged.value === null)
71
+ element.removeAttribute(judged.name);
72
+ else
73
+ element.setAttribute(judged.name, judged.value);
74
+ options.onAttribute?.(element, judged.name);
75
+ if (!isField)
76
+ return;
77
+ /* What a field holds live, as well as what it says. */
78
+ if (judged.name === "value" && "value" in field) {
79
+ field.value = judged.value ?? "";
80
+ if (before !== field.value)
81
+ options.onFieldSet?.(element);
82
+ }
83
+ else if (judged.name === "checked" && "checked" in field) {
84
+ field.checked = judged.value !== null;
85
+ if (before !== field.checked)
86
+ options.onFieldSet?.(element);
87
+ }
88
+ else if (judged.name === "selected" && "selected" in field) {
89
+ field.selected = judged.value !== null;
90
+ if (before !== field.selected)
91
+ options.onFieldSet?.(element.parentElement?.closest("select") ?? element);
92
+ }
93
+ };
94
+ const forget = (drawn) => {
95
+ if (drawn.refused)
96
+ return;
97
+ size -= 1;
98
+ if (drawn.id !== undefined)
99
+ byId.delete(drawn.id);
100
+ for (const child of drawn.children)
101
+ forget(child);
102
+ };
103
+ const build = (raw, parent) => {
104
+ if (!isRecord(raw) || typeof raw["id"] !== "string" || byId.has(raw["id"])) {
105
+ refuse({ reason: "record" });
106
+ return placeholder();
107
+ }
108
+ if (size >= maxNodes) {
109
+ refuse({ reason: "budget" });
110
+ if (!over) {
111
+ over = true;
112
+ options.onOverBudget?.();
113
+ }
114
+ return placeholder();
115
+ }
116
+ const id = raw["id"];
117
+ if (raw["type"] === COMMENT)
118
+ return placeholder();
119
+ if (raw["type"] === TEXT) {
120
+ if (isEmptyElement(parent.namespace, parent.name)) {
121
+ refuse({ reason: "child", element: parent.name });
122
+ return placeholder();
123
+ }
124
+ const text = document.createTextNode(String(raw["data"] ?? "").slice(0, OPEN_MAX_TEXT));
125
+ const drawn = { dom: text, children: [], text: true, id, parent };
126
+ byId.set(id, drawn);
127
+ ids.set(text, id);
128
+ size += 1;
129
+ return drawn;
130
+ }
131
+ if (raw["type"] !== ELEMENT) {
132
+ refuse({ reason: "record" });
133
+ return placeholder();
134
+ }
135
+ const asked = String(raw["element"]);
136
+ if (isEmptyElement(parent.namespace, parent.name)) {
137
+ refuse({ reason: "child", element: asked });
138
+ return placeholder();
139
+ }
140
+ const judged = judgeElement(asked, parent.namespace);
141
+ if ("refused" in judged) {
142
+ refuse(judged.refused);
143
+ return placeholder();
144
+ }
145
+ const element = document.createElementNS(judged.namespace === "svg" ? SVG_NAMESPACE : HTML_NAMESPACE, judged.name);
146
+ /* A `<nav>` drawn as a `<div>` says so, and the view's `nav` selectors are read as `[data-graview-as="nav"]` (host/css.ts). */
147
+ if (judged.as)
148
+ element.setAttribute("data-graview-as", judged.as);
149
+ const drawn = { dom: element, name: judged.name, namespace: judged.namespace, children: [], id, parent };
150
+ byId.set(id, drawn);
151
+ ids.set(element, id);
152
+ size += 1;
153
+ if (isRecord(raw["attributes"]))
154
+ for (const [key, value] of Object.entries(raw["attributes"]))
155
+ setAttribute(drawn, key, value);
156
+ options.decorate?.(element, judged.name, judged.namespace);
157
+ /* A native element has attributes, never Remote DOM properties or listeners: those are a kit component's. */
158
+ if (isRecord(raw["properties"]))
159
+ for (const key of Object.keys(raw["properties"]))
160
+ refuse({ reason: "attribute", element: judged.name, name: key });
161
+ if (isRecord(raw["eventListeners"]))
162
+ for (const key of Object.keys(raw["eventListeners"]))
163
+ if (raw["eventListeners"][key] != null)
164
+ refuse({ reason: "attribute", element: judged.name, name: `on${key}` });
165
+ if (Array.isArray(raw["children"])) {
166
+ for (const child of raw["children"]) {
167
+ const built = build(child, drawn);
168
+ drawn.children.push(built);
169
+ element.appendChild(built.dom);
170
+ }
171
+ }
172
+ return drawn;
173
+ };
174
+ const one = (record) => {
175
+ if (!Array.isArray(record))
176
+ return refuse({ reason: "record" });
177
+ const [type, id] = record;
178
+ const target = typeof id === "string" ? byId.get(id) : undefined;
179
+ if (!target)
180
+ return refuse({ reason: "record" });
181
+ switch (type) {
182
+ case INSERT_CHILD: {
183
+ if (target.text)
184
+ return refuse({ reason: "record" });
185
+ const index = Number(record[3]);
186
+ const at = Number.isInteger(index) && index >= 0 && index <= target.children.length ? index : target.children.length;
187
+ const built = build(record[2], target);
188
+ target.dom.insertBefore(built.dom, target.children[at]?.dom ?? null);
189
+ target.children.splice(at, 0, built);
190
+ if (target.namespace === "html" && target.name === "textarea")
191
+ options.onFieldSet?.(target.dom);
192
+ return;
193
+ }
194
+ case REMOVE_CHILD: {
195
+ const index = Number(record[2]);
196
+ const gone = target.children[index];
197
+ if (!gone)
198
+ return refuse({ reason: "record" });
199
+ target.children.splice(index, 1);
200
+ gone.dom.parentNode?.removeChild(gone.dom);
201
+ forget(gone);
202
+ return;
203
+ }
204
+ case UPDATE_TEXT: {
205
+ if (!target.text)
206
+ return refuse({ reason: "record" });
207
+ target.dom.data = String(record[2] ?? "").slice(0, OPEN_MAX_TEXT);
208
+ const field = fieldOf(target, target.parent);
209
+ if (field)
210
+ options.onFieldSet?.(field);
211
+ return;
212
+ }
213
+ case UPDATE_PROPERTY: {
214
+ if (target === root || target.text)
215
+ return refuse({ reason: "record" });
216
+ const name = String(record[2]);
217
+ const kind = record[4] ?? PROPERTY;
218
+ if (kind === ATTRIBUTE)
219
+ return setAttribute(target, name, record[3]);
220
+ if (kind === PROPERTY || kind === EVENT_LISTENER)
221
+ return refuse({ reason: "attribute", element: target.name, name: kind === EVENT_LISTENER ? `on${name}` : name });
222
+ return refuse({ reason: "record" });
223
+ }
224
+ default:
225
+ return refuse({ reason: "record" });
226
+ }
227
+ };
228
+ return {
229
+ apply(records, spent) {
230
+ if (!Array.isArray(records)) {
231
+ refuse({ reason: "record" });
232
+ return true;
233
+ }
234
+ for (let index = 0; index < records.length; index += 1) {
235
+ /* Asked every 32 records: often enough that no batch holds the page past its budget by much. */
236
+ if (spent && index % 32 === 0 && spent())
237
+ return false;
238
+ one(records[index]);
239
+ }
240
+ return true;
241
+ },
242
+ get refused() {
243
+ return refused;
244
+ },
245
+ get size() {
246
+ return size;
247
+ },
248
+ idOf: (node) => ids.get(node),
249
+ elementOf(id) {
250
+ const drawn = byId.get(id);
251
+ return drawn && !drawn.text && drawn !== root ? drawn.dom : undefined;
252
+ },
253
+ dispose() {
254
+ for (const child of root.children)
255
+ forget(child);
256
+ root.children.length = 0;
257
+ while (into.firstChild)
258
+ into.removeChild(into.firstChild);
259
+ },
260
+ };
261
+ }
262
+ //# sourceMappingURL=open-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-render.js","sourceRoot":"","sources":["../../src/host/open-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AnySchema, Store } from "@graview/core";
2
+ import type { WorkerViewManifest } from "./manifest.js";
3
+ import { type Judged, type Press } from "./writes.js";
4
+ export interface PressReader {
5
+ /** An event on what the view drew: a trusted one on a field is the viewer's typing. */
6
+ heard(event: Event, element: Element): void;
7
+ /** The view set what a field shows: what the viewer typed there is gone. */
8
+ filled(field: Element): void;
9
+ /** A trusted click on (or in) an element bound to an act: the press, with its record and the fields in its scope. */
10
+ press(event: Event, element: Element, root: Element): Press | undefined;
11
+ }
12
+ export declare function createPressReader(trusted?: (event: Event) => boolean): PressReader;
13
+ /** An act the viewer's press asked for: its arguments from the bound record, the manifest and what the viewer typed. */
14
+ export declare function judgePress<S extends AnySchema>(store: Store<S>, manifest: WorkerViewManifest, shown: ReadonlySet<string>, press: Press): Judged;
15
+ //# sourceMappingURL=press.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press.d.ts","sourceRoot":"","sources":["../../src/host/press.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAoC,KAAK,MAAM,EAAE,KAAK,KAAK,EAAqB,MAAM,aAAa,CAAC;AA8C3G,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,qHAAqH;IACrH,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;CACzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAoC,GAAG,WAAW,CAoD9G;AAED,wHAAwH;AACxH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAkC/I"}
@@ -0,0 +1,156 @@
1
+ import { declaredValues, entryFor, refuse } from "./writes.js";
2
+ /*
3
+ * A PRESS, AS THE HOST SEES IT (FR-92): the half of the write rules that
4
+ * reads the page. A trusted click on an element bound to an act
5
+ * (`data-act`) is read here — its record, and the fields in its scope,
6
+ * each the viewer's or not — and judged by `judgePress`, in the click's own
7
+ * handler. writes.ts says why.
8
+ *
9
+ * WHOSE A FIELD'S VALUE IS. The host keeps, for every field the view drew,
10
+ * what the viewer last left in it:
11
+ *
12
+ * · Only an `input` event the browser marks trusted is typing. A
13
+ * `change` is not, for a text field: the browser raises one, trusted,
14
+ * when a field the view filled loses focus, and it would have passed
15
+ * the view's words off as the viewer's. For a choice — a checkbox, a
16
+ * radio, a select — the viewer's own pick is the whole value, and its
17
+ * trusted `input` or `change` makes it theirs.
18
+ * · A text field the view wrote words into is the view's until the viewer
19
+ * empties it. Typing one letter after the view's words leaves them
20
+ * there, so a field the view filled does not become the viewer's by
21
+ * being typed in; emptied, everything in it from then on is theirs. A
22
+ * view that only empties a field (after an act, say) takes nothing away.
23
+ * · A view that says back exactly what a field already shows has not
24
+ * changed it.
25
+ * · A pick is the viewer's choice, never the viewer's words: a radio's
26
+ * value and a select's options are the view's, so a picked one goes
27
+ * only as a value the app itself declares for the argument (an enum's,
28
+ * a literal's) or a record the view was shown. Otherwise a radio
29
+ * labelled "Yes" whose value is a hidden record's text would carry it.
30
+ */
31
+ const FIELD = new Set(["input", "select", "textarea"]);
32
+ const isField = (element) => element.namespaceURI === "http://www.w3.org/1999/xhtml" && FIELD.has(element.localName);
33
+ /** A field whose whole value is one pick of the viewer's: a checkbox, a radio, a select. */
34
+ const isChoice = (field) => field.localName === "select" || field.type === "checkbox" || field.type === "radio";
35
+ /** A field that shows nothing the view could have put there: empty, unchecked. */
36
+ const isEmpty = (field) => (field.type === "checkbox" || field.type === "radio" ? !field.checked : field.localName !== "select" && field.value === "");
37
+ /** What a field shows now, as one string to compare. */
38
+ function shows(field) {
39
+ if (field.type === "checkbox" || field.type === "radio")
40
+ return `checked:${field.checked}`;
41
+ if (field.localName === "select" && field.multiple)
42
+ return `selected:${[...field.selectedOptions].map((option) => option.value).join("\u0000")}`;
43
+ return `value:${field.value}`;
44
+ }
45
+ export function createPressReader(trusted = (event) => event.isTrusted) {
46
+ const typed = new WeakMap();
47
+ /* Fields the view wrote into, until the viewer empties them. */
48
+ const written = new WeakSet();
49
+ return {
50
+ heard(event, element) {
51
+ if (!isField(element) || !trusted(event))
52
+ return;
53
+ if (event.type === "input" || (event.type === "change" && isChoice(element))) {
54
+ if (isChoice(element) || isEmpty(element))
55
+ written.delete(element);
56
+ typed.set(element, shows(element));
57
+ /* A radio the viewer chose unchooses its group: those are the viewer's too. */
58
+ if (element.type === "radio" && element.name) {
59
+ const root = element.getRootNode();
60
+ for (const other of root.querySelectorAll?.('input[type="radio"]') ?? [])
61
+ if (other.name === element.name)
62
+ typed.set(other, shows(other));
63
+ }
64
+ }
65
+ },
66
+ filled(field) {
67
+ typed.delete(field);
68
+ if (isField(field) && !isEmpty(field))
69
+ written.add(field);
70
+ else
71
+ written.delete(field);
72
+ },
73
+ press(event, element, root) {
74
+ if (event.type !== "click" || !trusted(event))
75
+ return undefined;
76
+ const bound = element.closest("[data-act]");
77
+ if (!bound || !root.contains(bound))
78
+ return undefined;
79
+ const record = bound.closest("[data-record]");
80
+ const scope = bound.closest("fieldset, [role='group']") ?? root;
81
+ const fields = [];
82
+ for (const one of scope.querySelectorAll("input[name], select[name], textarea[name]")) {
83
+ const field = one;
84
+ const mine = !written.has(field) && typed.get(field) === shows(field);
85
+ if (field.type === "radio") {
86
+ if (!field.checked)
87
+ continue;
88
+ fields.push({ name: field.name, value: field.value, typed: mine, empty: false, chosen: true });
89
+ continue;
90
+ }
91
+ if (field.localName === "select") {
92
+ fields.push({ name: field.name, value: field.value, typed: mine, empty: field.value === "" && !mine, chosen: true });
93
+ continue;
94
+ }
95
+ if (field.type === "checkbox") {
96
+ fields.push({ name: field.name, value: field.checked, typed: mine, empty: !field.checked && !written.has(field) && !mine });
97
+ continue;
98
+ }
99
+ const numeric = field.type === "number" || field.type === "range";
100
+ const value = numeric && field.value !== "" && Number.isFinite(field.valueAsNumber) ? field.valueAsNumber : field.value;
101
+ fields.push({ name: field.name, value, typed: mine, empty: field.value === "" && !mine });
102
+ }
103
+ return { as: bound.getAttribute("data-act") ?? "", ...(record && root.contains(record) ? { record: record.getAttribute("data-record") } : {}), fields };
104
+ },
105
+ };
106
+ }
107
+ /** An act the viewer's press asked for: its arguments from the bound record, the manifest and what the viewer typed. */
108
+ export function judgePress(store, manifest, shown, press) {
109
+ const entry = entryFor(manifest, press.as);
110
+ if (!entry)
111
+ return refuse("undeclared", `This view may not ask for “${press.as}”: its manifest does not name it.`);
112
+ const mutation = store.allMutations().find((one) => one.name === entry.act);
113
+ if (!mutation)
114
+ return refuse("unknown-act", "There is no act by that name here.");
115
+ const args = {};
116
+ if (press.record !== undefined) {
117
+ const arg = entry.record ?? mutation.subject?.arg;
118
+ if (!arg)
119
+ return refuse("unbound", `“${press.as}” is not done to a record.`);
120
+ if (!shown.has(press.record))
121
+ return refuse("unbound", "That press is bound to a record this view was not shown.");
122
+ args[arg] = press.record;
123
+ }
124
+ for (const [name, value] of Object.entries(entry.constants ?? {})) {
125
+ if (name in args)
126
+ return refuse("malformed", `“${name}” is both the bound record and a constant.`);
127
+ args[name] = value;
128
+ }
129
+ /* The act's arguments, by name: its input object's own keys. */
130
+ const shape = mutation.input?.shape ?? {};
131
+ const declared = new Set(Object.keys(shape));
132
+ const seen = new Set();
133
+ for (const field of press.fields) {
134
+ if (!declared.has(field.name) || field.name in args)
135
+ continue;
136
+ if (seen.has(field.name))
137
+ return refuse("malformed", `Two fields here are called “${field.name}”.`);
138
+ seen.add(field.name);
139
+ if (field.typed && field.chosen) {
140
+ /* The viewer picked it; the view wrote it. It goes only as one of the app's own values, or a record the view was shown. */
141
+ const value = declaredValues(shape[field.name])?.find((one) => String(one) === String(field.value));
142
+ if (value !== undefined)
143
+ args[field.name] = value;
144
+ else if (typeof field.value === "string" && shown.has(field.value))
145
+ args[field.name] = field.value;
146
+ else
147
+ return refuse("untyped", `“${field.name}” was a choice among the view's own words, not one this app declares, so it was not sent.`);
148
+ }
149
+ else if (field.typed)
150
+ args[field.name] = field.value;
151
+ else if (!field.empty)
152
+ return refuse("untyped", `“${field.name}” was filled in by the view, not typed by you, so it was not sent.`);
153
+ }
154
+ return { ok: true, name: entry.act, args };
155
+ }
156
+ //# sourceMappingURL=press.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press.js","sourceRoot":"","sources":["../../src/host/press.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { AnySchema } from "@graview/core";
2
2
  import { type ViewComponent } from "@graview/react/provider";
3
- import type { GuestLimits } from "./session.js";
3
+ import type { GuestLimits, GuestReads } from "./session.js";
4
4
  import type { KitLinks } from "./kit.js";
5
5
  import type { GuestWorkerSource } from "./worker.js";
6
6
  export interface GuestViewOptions {
@@ -14,6 +14,18 @@ export interface GuestViewOptions {
14
14
  readonly worker?: GuestWorkerSource;
15
15
  /** The view's name: what the rail says an act came through. */
16
16
  readonly name: string;
17
+ /**
18
+ * What it is called (FR-87): the frame's accessible name, and — handed to
19
+ * `register(kind, cell, view, { title })` as well — the place it is on both
20
+ * faces. The view's name by default.
21
+ */
22
+ readonly title?: string;
23
+ /**
24
+ * The other kinds and the edges a frame guest is shown, beyond what it is
25
+ * drawn over (FR-85), as the viewer sees them. A guest drawn as the home
26
+ * (`views.home(guestView(…))`) is drawn over nothing, and sees what it reads.
27
+ */
28
+ readonly reads?: GuestReads;
17
29
  /** Where the frame first stands before the guest asks for a height. 160px by default. */
18
30
  readonly height?: number;
19
31
  readonly limits?: GuestLimits;
@@ -29,7 +41,8 @@ export interface GuestViewOptions {
29
41
  * It draws an iframe sandboxed to scripts alone — or, given `worker`
30
42
  * rather than `url`, a classic worker drawing the component kit — pushes
31
43
  * the view's props as the seat at the keyboard sees them, applies what the
32
- * guest asks for as that seat, and goes to a record by selecting it.
44
+ * guest asks for as that seat, and goes to a record or a place where the
45
+ * face goes (`useGoTo`): its page on the routed face, chosen in the scene.
33
46
  */
34
47
  export declare function guestView(options: GuestViewOptions): ViewComponent<AnySchema>;
35
48
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/host/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAc,KAAK,aAAa,EAAkB,MAAM,yBAAyB,CAAC;AAGzF,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2GAA2G;IAC3G,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,CAwD7E"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/host/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAuB,KAAK,aAAa,EAAkB,MAAM,yBAAyB,CAAC;AAGlG,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAkB,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2GAA2G;IAC3G,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,CA+D7E"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useGraview } from "@graview/react/provider";
2
+ import { useGoTo, useGraview } from "@graview/react/provider";
3
3
  import { useEffect, useRef } from "react";
4
4
  import { mountGuestView } from "./frame.js";
5
5
  const inputOf = (props) => ({
@@ -22,13 +22,17 @@ const inputOf = (props) => ({
22
22
  * It draws an iframe sandboxed to scripts alone — or, given `worker`
23
23
  * rather than `url`, a classic worker drawing the component kit — pushes
24
24
  * the view's props as the seat at the keyboard sees them, applies what the
25
- * guest asks for as that seat, and goes to a record by selecting it.
25
+ * guest asks for as that seat, and goes to a record or a place where the
26
+ * face goes (`useGoTo`): its page on the routed face, chosen in the scene.
26
27
  */
27
28
  export function guestView(options) {
28
29
  if ((options.url === undefined) === (options.worker === undefined))
29
30
  throw new Error(`guestView "${options.name}" takes a url or a worker, one of the two`);
30
31
  function GuestView(props) {
31
- const { store, principal, setSelection } = useGraview();
32
+ const { store, principal, setSelection, views } = useGraview();
33
+ const goTo = useGoTo();
34
+ const going = useRef(goTo);
35
+ going.current = goTo;
32
36
  const holder = useRef(null);
33
37
  const frame = useRef(null);
34
38
  const latest = useRef(props);
@@ -65,10 +69,14 @@ export function guestView(options) {
65
69
  const mounted = mountGuestView(element, {
66
70
  url: options.url,
67
71
  view: options.name,
72
+ ...(options.title ? { title: options.title } : {}),
68
73
  store,
69
74
  principal,
70
75
  input: () => inputOf(latest.current),
71
- onNavigate: (id) => setSelection([id]),
76
+ ...(options.reads ? { reads: options.reads } : {}),
77
+ places: () => views.places(),
78
+ onNavigate: (id) => going.current.record(id),
79
+ onNavigatePlace: (as) => going.current.place(as),
72
80
  ...(options.limits ? { limits: options.limits } : {}),
73
81
  });
74
82
  mounted.iframe.style.height = `${options.height ?? 160}px`;
@@ -77,7 +85,7 @@ export function guestView(options) {
77
85
  mounted.dispose();
78
86
  frame.current = null;
79
87
  };
80
- }, [store, principal, setSelection]);
88
+ }, [store, principal, setSelection, views]);
81
89
  useEffect(() => frame.current?.update(), [props]);
82
90
  return _jsx("div", { ref: holder, "data-guest": options.name });
83
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/host/react.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/host/react.tsx"],"names":[],"mappings":"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"}