@ghia/native 0.0.0 → 0.11.0

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 (211) hide show
  1. package/LICENSE +201 -0
  2. package/browser.mjs +7 -0
  3. package/dist/aria.d.ts +72 -0
  4. package/dist/aria.d.ts.map +1 -0
  5. package/dist/aria.js +2 -0
  6. package/dist/aria.js.map +1 -0
  7. package/dist/automation/client.d.ts +243 -0
  8. package/dist/automation/client.d.ts.map +1 -0
  9. package/dist/automation/client.js +801 -0
  10. package/dist/automation/client.js.map +1 -0
  11. package/dist/automation/index.d.ts +5 -0
  12. package/dist/automation/index.d.ts.map +1 -0
  13. package/dist/automation/index.js +4 -0
  14. package/dist/automation/index.js.map +1 -0
  15. package/dist/automation/protocol.d.ts +309 -0
  16. package/dist/automation/protocol.d.ts.map +1 -0
  17. package/dist/automation/protocol.js +320 -0
  18. package/dist/automation/protocol.js.map +1 -0
  19. package/dist/blob-images.d.ts +32 -0
  20. package/dist/blob-images.d.ts.map +1 -0
  21. package/dist/blob-images.js +55 -0
  22. package/dist/blob-images.js.map +1 -0
  23. package/dist/bounds.d.ts +61 -0
  24. package/dist/bounds.d.ts.map +1 -0
  25. package/dist/bounds.js +85 -0
  26. package/dist/bounds.js.map +1 -0
  27. package/dist/clipboard-global.d.ts +11 -0
  28. package/dist/clipboard-global.d.ts.map +1 -0
  29. package/dist/clipboard-global.js +2 -0
  30. package/dist/clipboard-global.js.map +1 -0
  31. package/dist/clipboard.d.ts +19 -0
  32. package/dist/clipboard.d.ts.map +1 -0
  33. package/dist/clipboard.js +41 -0
  34. package/dist/clipboard.js.map +1 -0
  35. package/dist/cpu-throttle.d.ts +6 -0
  36. package/dist/cpu-throttle.d.ts.map +1 -0
  37. package/dist/cpu-throttle.js +42 -0
  38. package/dist/cpu-throttle.js.map +1 -0
  39. package/dist/events/data-transfer.d.ts +23 -0
  40. package/dist/events/data-transfer.d.ts.map +1 -0
  41. package/dist/events/data-transfer.js +97 -0
  42. package/dist/events/data-transfer.js.map +1 -0
  43. package/dist/events/dispatch.d.ts +144 -0
  44. package/dist/events/dispatch.d.ts.map +1 -0
  45. package/dist/events/dispatch.js +241 -0
  46. package/dist/events/dispatch.js.map +1 -0
  47. package/dist/events/drag.d.ts +21 -0
  48. package/dist/events/drag.d.ts.map +1 -0
  49. package/dist/events/drag.js +111 -0
  50. package/dist/events/drag.js.map +1 -0
  51. package/dist/events/event-props.d.ts +19 -0
  52. package/dist/events/event-props.d.ts.map +1 -0
  53. package/dist/events/event-props.js +104 -0
  54. package/dist/events/event-props.js.map +1 -0
  55. package/dist/events/keyboard-defaults.d.ts +18 -0
  56. package/dist/events/keyboard-defaults.d.ts.map +1 -0
  57. package/dist/events/keyboard-defaults.js +121 -0
  58. package/dist/events/keyboard-defaults.js.map +1 -0
  59. package/dist/events/listeners.d.ts +18 -0
  60. package/dist/events/listeners.d.ts.map +1 -0
  61. package/dist/events/listeners.js +49 -0
  62. package/dist/events/listeners.js.map +1 -0
  63. package/dist/events/route.d.ts +17 -0
  64. package/dist/events/route.d.ts.map +1 -0
  65. package/dist/events/route.js +36 -0
  66. package/dist/events/route.js.map +1 -0
  67. package/dist/events/types.d.ts +269 -0
  68. package/dist/events/types.d.ts.map +1 -0
  69. package/dist/events/types.js +2 -0
  70. package/dist/events/types.js.map +1 -0
  71. package/dist/events/window-target.d.ts +120 -0
  72. package/dist/events/window-target.d.ts.map +1 -0
  73. package/dist/events/window-target.js +311 -0
  74. package/dist/events/window-target.js.map +1 -0
  75. package/dist/eyedropper.d.ts +33 -0
  76. package/dist/eyedropper.d.ts.map +1 -0
  77. package/dist/eyedropper.js +66 -0
  78. package/dist/eyedropper.js.map +1 -0
  79. package/dist/focus.d.ts +18 -0
  80. package/dist/focus.d.ts.map +1 -0
  81. package/dist/focus.js +26 -0
  82. package/dist/focus.js.map +1 -0
  83. package/dist/fonts.d.ts +12 -0
  84. package/dist/fonts.d.ts.map +1 -0
  85. package/dist/fonts.js +17 -0
  86. package/dist/fonts.js.map +1 -0
  87. package/dist/forms.d.ts +10 -0
  88. package/dist/forms.d.ts.map +1 -0
  89. package/dist/forms.js +9 -0
  90. package/dist/forms.js.map +1 -0
  91. package/dist/host-runtime.d.ts +108 -0
  92. package/dist/host-runtime.d.ts.map +1 -0
  93. package/dist/host-runtime.js +213 -0
  94. package/dist/host-runtime.js.map +1 -0
  95. package/dist/host.d.ts +2403 -0
  96. package/dist/host.d.ts.map +1 -0
  97. package/dist/host.js +30 -0
  98. package/dist/host.js.map +1 -0
  99. package/dist/idle-gc.d.ts +36 -0
  100. package/dist/idle-gc.d.ts.map +1 -0
  101. package/dist/idle-gc.js +70 -0
  102. package/dist/idle-gc.js.map +1 -0
  103. package/dist/keyframes.d.ts +108 -0
  104. package/dist/keyframes.d.ts.map +1 -0
  105. package/dist/keyframes.js +107 -0
  106. package/dist/keyframes.js.map +1 -0
  107. package/dist/layout-animation.d.ts +38 -0
  108. package/dist/layout-animation.d.ts.map +1 -0
  109. package/dist/layout-animation.js +41 -0
  110. package/dist/layout-animation.js.map +1 -0
  111. package/dist/match-media.d.ts +62 -0
  112. package/dist/match-media.d.ts.map +1 -0
  113. package/dist/match-media.js +272 -0
  114. package/dist/match-media.js.map +1 -0
  115. package/dist/media-query.d.ts +21 -0
  116. package/dist/media-query.d.ts.map +1 -0
  117. package/dist/media-query.js +599 -0
  118. package/dist/media-query.js.map +1 -0
  119. package/dist/motion-bindings.d.ts +36 -0
  120. package/dist/motion-bindings.d.ts.map +1 -0
  121. package/dist/motion-bindings.js +107 -0
  122. package/dist/motion-bindings.js.map +1 -0
  123. package/dist/motion-config.d.ts +20 -0
  124. package/dist/motion-config.d.ts.map +1 -0
  125. package/dist/motion-config.js +51 -0
  126. package/dist/motion-config.js.map +1 -0
  127. package/dist/motion-span.d.ts +57 -0
  128. package/dist/motion-span.d.ts.map +1 -0
  129. package/dist/motion-span.js +150 -0
  130. package/dist/motion-span.js.map +1 -0
  131. package/dist/motion-value.d.ts +269 -0
  132. package/dist/motion-value.d.ts.map +1 -0
  133. package/dist/motion-value.js +941 -0
  134. package/dist/motion-value.js.map +1 -0
  135. package/dist/motion-variants.d.ts +190 -0
  136. package/dist/motion-variants.d.ts.map +1 -0
  137. package/dist/motion-variants.js +249 -0
  138. package/dist/motion-variants.js.map +1 -0
  139. package/dist/mutations.d.ts +65 -0
  140. package/dist/mutations.d.ts.map +1 -0
  141. package/dist/mutations.js +320 -0
  142. package/dist/mutations.js.map +1 -0
  143. package/dist/nativeview.d.ts +10 -0
  144. package/dist/nativeview.d.ts.map +1 -0
  145. package/dist/nativeview.js +92 -0
  146. package/dist/nativeview.js.map +1 -0
  147. package/dist/observers.d.ts +92 -0
  148. package/dist/observers.d.ts.map +1 -0
  149. package/dist/observers.js +579 -0
  150. package/dist/observers.js.map +1 -0
  151. package/dist/presence.d.ts +63 -0
  152. package/dist/presence.d.ts.map +1 -0
  153. package/dist/presence.js +54 -0
  154. package/dist/presence.js.map +1 -0
  155. package/dist/renderer-state.d.ts +155 -0
  156. package/dist/renderer-state.d.ts.map +1 -0
  157. package/dist/renderer-state.js +302 -0
  158. package/dist/renderer-state.js.map +1 -0
  159. package/dist/reorder.d.ts +63 -0
  160. package/dist/reorder.d.ts.map +1 -0
  161. package/dist/reorder.js +303 -0
  162. package/dist/reorder.js.map +1 -0
  163. package/dist/runtime.d.ts +23 -0
  164. package/dist/runtime.d.ts.map +1 -0
  165. package/dist/runtime.js +157 -0
  166. package/dist/runtime.js.map +1 -0
  167. package/dist/screen.d.ts +8 -0
  168. package/dist/screen.d.ts.map +1 -0
  169. package/dist/screen.js +16 -0
  170. package/dist/screen.js.map +1 -0
  171. package/dist/scroll.d.ts +79 -0
  172. package/dist/scroll.d.ts.map +1 -0
  173. package/dist/scroll.js +170 -0
  174. package/dist/scroll.js.map +1 -0
  175. package/dist/style-images.d.ts +20 -0
  176. package/dist/style-images.d.ts.map +1 -0
  177. package/dist/style-images.js +57 -0
  178. package/dist/style-images.js.map +1 -0
  179. package/dist/svg.d.ts +16 -0
  180. package/dist/svg.d.ts.map +1 -0
  181. package/dist/svg.js +119 -0
  182. package/dist/svg.js.map +1 -0
  183. package/dist/testing.d.ts +811 -0
  184. package/dist/testing.d.ts.map +1 -0
  185. package/dist/testing.js +1187 -0
  186. package/dist/testing.js.map +1 -0
  187. package/dist/text-match.d.ts +8 -0
  188. package/dist/text-match.d.ts.map +1 -0
  189. package/dist/text-match.js +10 -0
  190. package/dist/text-match.js.map +1 -0
  191. package/dist/text-selection.d.ts +34 -0
  192. package/dist/text-selection.d.ts.map +1 -0
  193. package/dist/text-selection.js +23 -0
  194. package/dist/text-selection.js.map +1 -0
  195. package/dist/universal-style.d.ts +22 -0
  196. package/dist/universal-style.d.ts.map +1 -0
  197. package/dist/universal-style.js +58 -0
  198. package/dist/universal-style.js.map +1 -0
  199. package/dist/web-animations.d.ts +300 -0
  200. package/dist/web-animations.d.ts.map +1 -0
  201. package/dist/web-animations.js +1032 -0
  202. package/dist/web-animations.js.map +1 -0
  203. package/dist/webview.d.ts +39 -0
  204. package/dist/webview.d.ts.map +1 -0
  205. package/dist/webview.js +26 -0
  206. package/dist/webview.js.map +1 -0
  207. package/gpuix-native.darwin-arm64.node +4 -0
  208. package/index.cjs +789 -0
  209. package/index.d.ts +2603 -0
  210. package/index.js +729 -0
  211. package/package.json +96 -4
@@ -0,0 +1,311 @@
1
+ import { createDomEvent, EVENT_PHASE_AT_TARGET, EVENT_PHASE_BUBBLING, EVENT_PHASE_CAPTURING, EVENT_PHASE_NONE, dispatchDomEvent, reportHandlerErrors, } from "./dispatch.js";
2
+ /**
3
+ * The `window` and `document` of a GPUIX app: an `EventTarget` shaped like the
4
+ * DOM's, for events that reach the top of the tree.
5
+ *
6
+ * Event types are the DOM's lowercase names (`keydown`, `keyup`, `focusin`,
7
+ * `focusout`, `focus`, `blur`). `focus` and `blur` do not bubble, so only a
8
+ * capture listener hears them, as in the DOM.
9
+ */
10
+ export class GpuixEventTarget {
11
+ onTypesChange;
12
+ registrations = new Map();
13
+ /** @param onTypesChange Called when a type gains its first listener or loses its last. */
14
+ constructor(onTypesChange) {
15
+ this.onTypesChange = onTypesChange;
16
+ }
17
+ addEventListener(type, listener, options) {
18
+ const capture = typeof options === "boolean" ? options : options?.capture === true;
19
+ const once = typeof options === "object" && options.once === true;
20
+ const key = type.toLowerCase();
21
+ const registrations = this.registrations.get(key) ?? [];
22
+ if (registrations.some((entry) => entry.listener === listener && entry.capture === capture)) {
23
+ return;
24
+ }
25
+ registrations.push({ listener, capture, once });
26
+ this.registrations.set(key, registrations);
27
+ if (registrations.length === 1)
28
+ this.onTypesChange?.();
29
+ }
30
+ removeEventListener(type, listener, options) {
31
+ const capture = typeof options === "boolean" ? options : options?.capture === true;
32
+ const key = type.toLowerCase();
33
+ const registrations = this.registrations.get(key);
34
+ if (!registrations)
35
+ return;
36
+ const index = registrations.findIndex((entry) => entry.listener === listener && entry.capture === capture);
37
+ if (index < 0)
38
+ return;
39
+ registrations.splice(index, 1);
40
+ if (registrations.length === 0) {
41
+ this.registrations.delete(key);
42
+ this.onTypesChange?.();
43
+ }
44
+ }
45
+ /** Whether any listener is registered for `type` in either phase. */
46
+ hasListeners(type) {
47
+ return this.registrations.has(type.toLowerCase());
48
+ }
49
+ /** @internal The types with a listener in either phase. */
50
+ listenedTypes() {
51
+ return [...this.registrations.keys()];
52
+ }
53
+ /**
54
+ * @internal Calls the listeners of one phase. A listener that throws does not
55
+ * end the phase: its error goes to `fail`.
56
+ */
57
+ run(event, state, capture, phase, fail) {
58
+ const registrations = this.registrations.get(event.type.toLowerCase());
59
+ if (!registrations)
60
+ return;
61
+ event.currentTarget = this;
62
+ event.eventPhase = phase;
63
+ // A listener may add or remove listeners; this call sees the ones that
64
+ // were there when the phase started.
65
+ for (const entry of [...registrations]) {
66
+ if (state.immediatePropagationStopped)
67
+ return;
68
+ if (entry.capture !== capture)
69
+ continue;
70
+ if (entry.once)
71
+ this.removeEventListener(event.type, entry.listener, entry.capture);
72
+ try {
73
+ entry.listener(event);
74
+ }
75
+ catch (error) {
76
+ fail(error);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ const typeSubscribers = new Set();
82
+ const notifyTypeSubscribers = () => {
83
+ for (const subscriber of [...typeSubscribers])
84
+ subscriber();
85
+ };
86
+ /**
87
+ * Kept on `globalThis`, like the renderer states: under `bun --hot` this module
88
+ * is evaluated again while a renderer's state, which asks it for elements on
89
+ * every event, stays from the first evaluation.
90
+ */
91
+ const ELEMENT_SOURCES_KEY = Symbol.for("@ghia/native/element-sources");
92
+ const elementSources = (() => {
93
+ const existing = Reflect.get(globalThis, ELEMENT_SOURCES_KEY);
94
+ if (existing)
95
+ return existing;
96
+ const created = new Map();
97
+ Reflect.set(globalThis, ELEMENT_SOURCES_KEY, created);
98
+ return created;
99
+ })();
100
+ let focusClock = 0;
101
+ /**
102
+ * The `document` of a GPUIX app: the `window` target plus `activeElement` and
103
+ * `pointerLockElement`.
104
+ *
105
+ * `Element` is what the adapter hands out for an element: React's host
106
+ * instance, Solid's element.
107
+ */
108
+ export class GpuixDocument extends GpuixEventTarget {
109
+ /**
110
+ * The focused element, the same object a `ref` gives, or `null` when nothing
111
+ * is focused. With several windows (one root each), the window that holds
112
+ * focus decides: of the roots that have a focused element, the one that heard
113
+ * a focus event last.
114
+ */
115
+ get activeElement() {
116
+ let chosen;
117
+ for (const entry of elementSources.values()) {
118
+ if (entry.windowGone)
119
+ continue;
120
+ const id = entry.source.focusedId();
121
+ if (id === null)
122
+ continue;
123
+ if (!chosen || entry.focusedAt > chosen.entry.focusedAt)
124
+ chosen = { entry, id };
125
+ }
126
+ if (!chosen)
127
+ return null;
128
+ const element = chosen.entry.source.elementById(chosen.id);
129
+ if (element === undefined) {
130
+ throw new Error(`Element ${chosen.id} holds focus but its root has no element for it`);
131
+ }
132
+ return element;
133
+ }
134
+ /**
135
+ * The element that holds the pointer lock, the same object a `ref` gives, or
136
+ * `null` while none does. Where the platform can lock (macOS) it is held as
137
+ * soon as `requestPointerLock()` returns, before `pointerlockchange` arrives.
138
+ */
139
+ get pointerLockElement() {
140
+ for (const entry of elementSources.values()) {
141
+ if (entry.windowGone)
142
+ continue;
143
+ const id = entry.source.pointerLockId();
144
+ if (id === null)
145
+ continue;
146
+ const element = entry.source.elementById(id);
147
+ if (element === undefined) {
148
+ throw new Error(`Element ${id} holds the pointer lock but its root has no element for it`);
149
+ }
150
+ return element;
151
+ }
152
+ return null;
153
+ }
154
+ /**
155
+ * The CSS transitions, then the CSS animations, of every window, as `Animation` objects: for
156
+ * each renderer in the order its root was installed, those of its elements in document order
157
+ * (every transition, then every animation). The same objects `element.getAnimations()` gives.
158
+ */
159
+ getAnimations() {
160
+ const list = Reflect.get(globalThis, DOCUMENT_ANIMATIONS_KEY);
161
+ if (!list)
162
+ throw new Error("Web Animations are not loaded: import @ghia/native/host before document.getAnimations()");
163
+ return [...elementSources].flatMap(([renderer, entry]) => (entry.windowGone ? [] : list(renderer)));
164
+ }
165
+ }
166
+ /**
167
+ * Kept on `globalThis` like the element sources: the module that makes `Animation` objects
168
+ * (`web-animations`) imports this one, so it hands `document` the way to list a renderer's.
169
+ */
170
+ const DOCUMENT_ANIMATIONS_KEY = Symbol.for("@ghia/native/document-animations");
171
+ /** @internal Called by `web-animations` once, with how to list the animations of one renderer's window. */
172
+ export function setDocumentAnimations(list) {
173
+ Reflect.set(globalThis, DOCUMENT_ANIMATIONS_KEY, list);
174
+ }
175
+ export const window = new GpuixEventTarget(notifyTypeSubscribers);
176
+ export const document = new GpuixDocument(notifyTypeSubscribers);
177
+ /**
178
+ * Lets the runtime see the elements of the root that drives `renderer`, through
179
+ * `elementById`: the object the adapter gives for an element id, as a `ref`
180
+ * does. `document.activeElement` and the `target`, `currentTarget` and
181
+ * `relatedTarget` of every event read it. The returned function takes the root
182
+ * out again. A renderer that cannot report focus still names its elements; it
183
+ * just never has an `activeElement`.
184
+ */
185
+ export function installElementSource(renderer, elementById) {
186
+ const getFocusedElementId = renderer.getFocusedElementId;
187
+ const getPointerLockElement = renderer.pointerLockElement;
188
+ const entry = {
189
+ source: {
190
+ focusedId: () => (getFocusedElementId ? getFocusedElementId.call(renderer) : null),
191
+ pointerLockId: () => (getPointerLockElement ? getPointerLockElement.call(renderer) : null),
192
+ elementById,
193
+ },
194
+ windowGone: false,
195
+ focusedAt: 0,
196
+ };
197
+ elementSources.set(renderer, entry);
198
+ return () => {
199
+ if (elementSources.get(renderer) === entry)
200
+ elementSources.delete(renderer);
201
+ };
202
+ }
203
+ /** Drops the root of `renderer` whose window is gone, so nothing asks it for elements. */
204
+ export function forgetElementSource(renderer) {
205
+ elementSources.delete(renderer);
206
+ }
207
+ /**
208
+ * Stops asking `renderer` what is focused or animating, for a renderer whose
209
+ * window another took over or that was closed: its root still names its
210
+ * elements, but the window it would ask about is not its own any more.
211
+ */
212
+ export function forgetWindowSource(renderer) {
213
+ const entry = elementSources.get(renderer);
214
+ if (entry)
215
+ entry.windowGone = true;
216
+ }
217
+ /**
218
+ * @internal The element `renderer`'s root has for `id`, or `undefined` once it
219
+ * dropped it. Throws when no adapter installed a source for `renderer`: the
220
+ * ids of its events cannot be turned into elements.
221
+ */
222
+ export function elementOf(renderer, id) {
223
+ const entry = elementSources.get(renderer);
224
+ if (!entry) {
225
+ throw new Error("No element source is installed for this renderer: an adapter's root installs one with installElementSource before events arrive.");
226
+ }
227
+ return entry.source.elementById(id);
228
+ }
229
+ /** @internal Records that `owner`'s window just moved focus, for the tie-break of `activeElement`. */
230
+ export function noteFocusEvent(owner) {
231
+ const entry = elementSources.get(owner);
232
+ if (entry)
233
+ entry.focusedAt = ++focusClock;
234
+ }
235
+ /**
236
+ * Keeps `renderer` told which event types `window` or `document` listens for,
237
+ * so native produces them even when no element on the event's path does (the
238
+ * pointer over bare background). Sends the current set now and again whenever
239
+ * it changes. The returned function clears it on the renderer and stops.
240
+ */
241
+ export function syncWindowEventListeners(renderer) {
242
+ const send = () => {
243
+ renderer.setWindowEventListeners?.([
244
+ ...new Set([...window.listenedTypes(), ...document.listenedTypes()]),
245
+ ]);
246
+ };
247
+ send();
248
+ typeSubscribers.add(send);
249
+ return () => {
250
+ typeSubscribers.delete(send);
251
+ renderer.setWindowEventListeners?.([]);
252
+ };
253
+ }
254
+ const DOCUMENT_EVENT_TYPES = new Set(["pointerlockchange", "pointerlockerror"]);
255
+ /** Whether the DOM aims the event at `document` itself, with no element on the path. */
256
+ export function isDocumentEvent(eventType) {
257
+ return DOCUMENT_EVENT_TYPES.has(eventType);
258
+ }
259
+ /**
260
+ * Runs an event through the whole propagation: window capture, document
261
+ * capture, the element path, document bubble, window bubble. An event with no
262
+ * element path is aimed at the window and only those two targets hear it.
263
+ *
264
+ * `scoped` is a window-level target that belongs to one renderer, such as the
265
+ * `onKeyDown` option of its root. It hears the bubble phase after `window`.
266
+ */
267
+ export function dispatchPropagating(root, payload, scoped) {
268
+ // When `document` is the target, both its capture and bubble listeners run at the target.
269
+ const documentPhase = (event, phase) => event.target === document ? EVENT_PHASE_AT_TARGET : phase;
270
+ const bubble = (event, state, fail) => {
271
+ document.run(event, state, false, documentPhase(event, EVENT_PHASE_BUBBLING), fail);
272
+ if (!state.propagationStopped)
273
+ window.run(event, state, false, EVENT_PHASE_BUBBLING, fail);
274
+ if (!state.propagationStopped)
275
+ scoped?.run(event, state, false, EVENT_PHASE_BUBBLING, fail);
276
+ };
277
+ const capture = (event, state, fail) => {
278
+ window.run(event, state, true, EVENT_PHASE_CAPTURING, fail);
279
+ if (!state.propagationStopped) {
280
+ document.run(event, state, true, documentPhase(event, EVENT_PHASE_CAPTURING), fail);
281
+ }
282
+ };
283
+ if (payload.path && payload.path.length > 0) {
284
+ let seen;
285
+ const result = dispatchDomEvent(root, payload, {
286
+ beforeCapture(event, state, fail) {
287
+ seen = event;
288
+ capture(event, state, fail);
289
+ },
290
+ afterBubble: bubble,
291
+ });
292
+ if (!seen)
293
+ throw new Error(`Event "${payload.eventType}" was dispatched without an event object.`);
294
+ return { ...result, event: seen };
295
+ }
296
+ const { event, state } = createDomEvent(root, payload, [], isDocumentEvent(payload.eventType) ? document : null);
297
+ const errors = [];
298
+ const fail = (error) => errors.push(error);
299
+ capture(event, state, fail);
300
+ if (event.bubbles && !state.propagationStopped)
301
+ bubble(event, state, fail);
302
+ event.currentTarget = null;
303
+ event.eventPhase = EVENT_PHASE_NONE;
304
+ reportHandlerErrors(root, errors);
305
+ return {
306
+ defaultPrevented: event.defaultPrevented,
307
+ propagationStopped: state.propagationStopped,
308
+ event,
309
+ };
310
+ }
311
+ //# sourceMappingURL=window-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window-target.js","sourceRoot":"","sources":["../../js/events/window-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { NativeRenderer } from "./host.js";
2
+ export interface ColorSelectionOptions {
3
+ signal?: AbortSignal;
4
+ }
5
+ export interface ColorSelectionResult {
6
+ /** `#rrggbb`, lowercase. */
7
+ sRGBHex: string;
8
+ }
9
+ export type EyeDropperHost = Pick<NativeRenderer, "supportsEyeDropper" | "openEyeDropper">;
10
+ export interface EyeDropper {
11
+ /**
12
+ * Show the screen colour picker. Rejects with an `AbortError` when the user
13
+ * cancels, and with the signal's reason when `signal` aborts.
14
+ *
15
+ * macOS cannot dismiss the picker from code, so an aborted picker stays on
16
+ * screen until the user clicks or presses Escape. `open()` rejects with an
17
+ * `InvalidStateError` until then.
18
+ */
19
+ open(options?: ColorSelectionOptions): Promise<ColorSelectionResult>;
20
+ }
21
+ export interface EyeDropperConstructor {
22
+ new (): EyeDropper;
23
+ }
24
+ export declare function createEyeDropper(host: () => EyeDropperHost | undefined): EyeDropperConstructor;
25
+ /** Opens the picker of the renderer created last. */
26
+ export declare const EyeDropper: EyeDropperConstructor;
27
+ /**
28
+ * Point `EyeDropper` at `host`, and define `globalThis.EyeDropper` when the
29
+ * platform can sample colours and the runtime has none. Elsewhere it stays
30
+ * undefined, so `typeof EyeDropper` feature detection works as in a browser.
31
+ */
32
+ export declare function bindEyeDropper(host: EyeDropperHost): void;
33
+ //# sourceMappingURL=eyedropper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eyedropper.d.ts","sourceRoot":"","sources":["../js/eyedropper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,cAAc,EACd,oBAAoB,GAAG,gBAAgB,CACxC,CAAA;AAED,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;CACrE;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,UAAU,CAAA;CACnB;AAUD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,cAAc,GAAG,SAAS,GACrC,qBAAqB,CA+CvB;AAID,qDAAqD;AACrD,eAAO,MAAM,UAAU,EAAE,qBAExB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAUzD"}
@@ -0,0 +1,66 @@
1
+ // DOMException is missing from some embedded runtimes such as Hermes.
2
+ function namedError(name, message) {
3
+ if (typeof DOMException === "function")
4
+ return new DOMException(message, name);
5
+ const error = new Error(message);
6
+ error.name = name;
7
+ return error;
8
+ }
9
+ export function createEyeDropper(host) {
10
+ // One native session at a time; it outlives an aborted open().
11
+ let sessionOpen = false;
12
+ return class {
13
+ open(options = {}) {
14
+ const signal = options.signal;
15
+ if (signal?.aborted)
16
+ return Promise.reject(signal.reason);
17
+ const current = host();
18
+ if (!current?.openEyeDropper) {
19
+ return Promise.reject(new Error("EyeDropper is not available on this platform"));
20
+ }
21
+ if (sessionOpen) {
22
+ return Promise.reject(namedError("InvalidStateError", "An EyeDropper is already open"));
23
+ }
24
+ sessionOpen = true;
25
+ return new Promise((resolve, reject) => {
26
+ let settled = false;
27
+ const onAbort = () => {
28
+ settled = true;
29
+ reject(signal?.reason);
30
+ };
31
+ signal?.addEventListener("abort", onAbort, { once: true });
32
+ const finish = (settle) => {
33
+ sessionOpen = false;
34
+ signal?.removeEventListener("abort", onAbort);
35
+ if (settled)
36
+ return;
37
+ settled = true;
38
+ settle();
39
+ };
40
+ current.openEyeDropper().then((hex) => finish(() => hex === null
41
+ ? reject(namedError("AbortError", "The user canceled the selection"))
42
+ : resolve({ sRGBHex: hex })), (error) => finish(() => reject(error)));
43
+ });
44
+ }
45
+ };
46
+ }
47
+ let activeHost;
48
+ /** Opens the picker of the renderer created last. */
49
+ export const EyeDropper = createEyeDropper(() => activeHost);
50
+ /**
51
+ * Point `EyeDropper` at `host`, and define `globalThis.EyeDropper` when the
52
+ * platform can sample colours and the runtime has none. Elsewhere it stays
53
+ * undefined, so `typeof EyeDropper` feature detection works as in a browser.
54
+ */
55
+ export function bindEyeDropper(host) {
56
+ activeHost = host;
57
+ const scope = globalThis;
58
+ if (scope.EyeDropper === undefined && host.supportsEyeDropper?.() === true) {
59
+ Object.defineProperty(globalThis, "EyeDropper", {
60
+ value: EyeDropper,
61
+ configurable: true,
62
+ writable: true,
63
+ });
64
+ }
65
+ }
66
+ //# sourceMappingURL=eyedropper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eyedropper.js","sourceRoot":"","sources":["../js/eyedropper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { NativeRenderer } from "./host.js";
2
+ export interface FocusOptions {
3
+ /** Skip scrolling the element into view. Defaults to false, like the DOM. */
4
+ preventScroll?: boolean;
5
+ }
6
+ /** The focus methods of a DOM element, shared by every adapter's element refs. */
7
+ export interface FocusableElement {
8
+ focus(options?: FocusOptions): void;
9
+ blur(): void;
10
+ /** Only `:focus`, `:focus-visible`, `:focus-within`, `:hover` and `:active`; any other selector throws. */
11
+ matches(selector: string): boolean;
12
+ }
13
+ export declare function focusHostElement(renderer: NativeRenderer, id: number, options?: FocusOptions): void;
14
+ /** Tab and Shift+Tab. The renderer scrolls the new focus into view itself. */
15
+ export declare function moveFocusByTab(renderer: NativeRenderer, backwards: boolean): void;
16
+ export declare function blurHostElement(renderer: NativeRenderer, id: number): void;
17
+ export declare function hostElementMatches(renderer: NativeRenderer, id: number, selector: string): boolean;
18
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../js/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IACnC,IAAI,IAAI,IAAI,CAAA;IACZ,2GAA2G;IAC3G,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CACnC;AAOD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAGN;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAGjF;AAOD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElG"}
package/dist/focus.js ADDED
@@ -0,0 +1,26 @@
1
+ function required(method, name) {
2
+ if (!method)
3
+ throw new Error(`This GPUIX renderer does not support ${name}`);
4
+ return method;
5
+ }
6
+ export function focusHostElement(renderer, id, options) {
7
+ required(renderer.focusElement, "focus()").call(renderer, id);
8
+ if (!options?.preventScroll)
9
+ scrollFocusIntoView(renderer, id);
10
+ }
11
+ /** Tab and Shift+Tab. The renderer scrolls the new focus into view itself. */
12
+ export function moveFocusByTab(renderer, backwards) {
13
+ const move = backwards ? renderer.focusPrevious : renderer.focusNext;
14
+ move?.call(renderer);
15
+ }
16
+ /** Browsers scroll a newly focused element to its nearest edge, and only if it is not in view. */
17
+ function scrollFocusIntoView(renderer, id) {
18
+ renderer.scrollIntoView?.(id, "nearest", "nearest");
19
+ }
20
+ export function blurHostElement(renderer, id) {
21
+ required(renderer.blurElement, "blur()").call(renderer, id);
22
+ }
23
+ export function hostElementMatches(renderer, id, selector) {
24
+ return required(renderer.matchesFocus, "matches()").call(renderer, id, selector);
25
+ }
26
+ //# sourceMappingURL=focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.js","sourceRoot":"","sources":["../js/focus.ts"],"names":[],"mappings":"AAeA,SAAS,QAAQ,CAAS,MAA0B,EAAE,IAAY;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAA;IAC5E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAwB,EACxB,EAAU,EACV,OAAsB;IAEtB,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC7D,IAAI,CAAC,OAAO,EAAE,aAAa;QAAE,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,QAAwB,EAAE,SAAkB;IACzE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAA;IACpE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;AACtB,CAAC;AAED,kGAAkG;AAClG,SAAS,mBAAmB,CAAC,QAAwB,EAAE,EAAU;IAC/D,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAwB,EAAE,EAAU;IAClE,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAwB,EAAE,EAAU,EAAE,QAAgB;IACvF,OAAO,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAClF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface WindowFontsOption {
2
+ /**
3
+ * Font files (`.ttf`, `.otf`) registered with `registerFont` as soon as the
4
+ * renderer exists, so `fontFamily` resolves to them without a system-wide
5
+ * install. Relative paths resolve against the process's current working
6
+ * directory. An unreadable path throws before any window opens.
7
+ */
8
+ fonts?: string[];
9
+ }
10
+ /** Read up front so a bad path fails before a window opens, naming the path. */
11
+ export declare function readFontFiles(paths: readonly string[] | undefined): Buffer[];
12
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../js/fonts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAY5E"}
package/dist/fonts.js ADDED
@@ -0,0 +1,17 @@
1
+ /** Read up front so a bad path fails before a window opens, naming the path. */
2
+ export function readFontFiles(paths) {
3
+ if (!paths)
4
+ return [];
5
+ const fs = process.getBuiltinModule("node:fs");
6
+ return paths.map((path) => {
7
+ try {
8
+ return fs.readFileSync(path);
9
+ }
10
+ catch (error) {
11
+ throw new Error(`Failed to read font file ${path}: ${String(error)}`, {
12
+ cause: error,
13
+ });
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../js/fonts.ts"],"names":[],"mappings":"AAUA,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,KAAoC;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBACpE,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NativeRenderer } from "./host.js";
2
+ /** What an adapter hands `requestFormSubmit` for one `<form>`. */
3
+ export interface FormHost {
4
+ id: number;
5
+ nativeRenderer: NativeRenderer;
6
+ /** Apply queued mutations, so the form and its controls exist natively. */
7
+ flushMutations(): void;
8
+ }
9
+ export declare function requestFormSubmit(host: FormHost): void;
10
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../js/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,2EAA2E;IAC3E,cAAc,IAAI,IAAI,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAOtD"}
package/dist/forms.js ADDED
@@ -0,0 +1,9 @@
1
+ export function requestFormSubmit(host) {
2
+ const renderer = host.nativeRenderer;
3
+ if (!renderer.requestSubmit) {
4
+ throw new Error("This GPUIX renderer does not support requestSubmit()");
5
+ }
6
+ host.flushMutations();
7
+ renderer.requestSubmit(host.id);
8
+ }
9
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../js/forms.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IACD,IAAI,CAAC,cAAc,EAAE,CAAA;IACrB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACjC,CAAC"}