@ghia/native 0.0.0-stage → 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.
- package/LICENSE +201 -0
- package/browser.mjs +7 -0
- package/dist/aria.d.ts +72 -0
- package/dist/aria.d.ts.map +1 -0
- package/dist/aria.js +2 -0
- package/dist/aria.js.map +1 -0
- package/dist/automation/client.d.ts +243 -0
- package/dist/automation/client.d.ts.map +1 -0
- package/dist/automation/client.js +801 -0
- package/dist/automation/client.js.map +1 -0
- package/dist/automation/index.d.ts +5 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +4 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/protocol.d.ts +309 -0
- package/dist/automation/protocol.d.ts.map +1 -0
- package/dist/automation/protocol.js +320 -0
- package/dist/automation/protocol.js.map +1 -0
- package/dist/blob-images.d.ts +32 -0
- package/dist/blob-images.d.ts.map +1 -0
- package/dist/blob-images.js +55 -0
- package/dist/blob-images.js.map +1 -0
- package/dist/bounds.d.ts +61 -0
- package/dist/bounds.d.ts.map +1 -0
- package/dist/bounds.js +85 -0
- package/dist/bounds.js.map +1 -0
- package/dist/clipboard-global.d.ts +11 -0
- package/dist/clipboard-global.d.ts.map +1 -0
- package/dist/clipboard-global.js +2 -0
- package/dist/clipboard-global.js.map +1 -0
- package/dist/clipboard.d.ts +19 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +41 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/cpu-throttle.d.ts +6 -0
- package/dist/cpu-throttle.d.ts.map +1 -0
- package/dist/cpu-throttle.js +42 -0
- package/dist/cpu-throttle.js.map +1 -0
- package/dist/events/data-transfer.d.ts +23 -0
- package/dist/events/data-transfer.d.ts.map +1 -0
- package/dist/events/data-transfer.js +97 -0
- package/dist/events/data-transfer.js.map +1 -0
- package/dist/events/dispatch.d.ts +144 -0
- package/dist/events/dispatch.d.ts.map +1 -0
- package/dist/events/dispatch.js +241 -0
- package/dist/events/dispatch.js.map +1 -0
- package/dist/events/drag.d.ts +21 -0
- package/dist/events/drag.d.ts.map +1 -0
- package/dist/events/drag.js +111 -0
- package/dist/events/drag.js.map +1 -0
- package/dist/events/event-props.d.ts +19 -0
- package/dist/events/event-props.d.ts.map +1 -0
- package/dist/events/event-props.js +104 -0
- package/dist/events/event-props.js.map +1 -0
- package/dist/events/keyboard-defaults.d.ts +18 -0
- package/dist/events/keyboard-defaults.d.ts.map +1 -0
- package/dist/events/keyboard-defaults.js +121 -0
- package/dist/events/keyboard-defaults.js.map +1 -0
- package/dist/events/listeners.d.ts +18 -0
- package/dist/events/listeners.d.ts.map +1 -0
- package/dist/events/listeners.js +49 -0
- package/dist/events/listeners.js.map +1 -0
- package/dist/events/route.d.ts +17 -0
- package/dist/events/route.d.ts.map +1 -0
- package/dist/events/route.js +36 -0
- package/dist/events/route.js.map +1 -0
- package/dist/events/types.d.ts +269 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/events/window-target.d.ts +120 -0
- package/dist/events/window-target.d.ts.map +1 -0
- package/dist/events/window-target.js +311 -0
- package/dist/events/window-target.js.map +1 -0
- package/dist/eyedropper.d.ts +33 -0
- package/dist/eyedropper.d.ts.map +1 -0
- package/dist/eyedropper.js +66 -0
- package/dist/eyedropper.js.map +1 -0
- package/dist/focus.d.ts +18 -0
- package/dist/focus.d.ts.map +1 -0
- package/dist/focus.js +26 -0
- package/dist/focus.js.map +1 -0
- package/dist/fonts.d.ts +12 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +17 -0
- package/dist/fonts.js.map +1 -0
- package/dist/forms.d.ts +10 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +9 -0
- package/dist/forms.js.map +1 -0
- package/dist/host-runtime.d.ts +108 -0
- package/dist/host-runtime.d.ts.map +1 -0
- package/dist/host-runtime.js +213 -0
- package/dist/host-runtime.js.map +1 -0
- package/dist/host.d.ts +2403 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +30 -0
- package/dist/host.js.map +1 -0
- package/dist/idle-gc.d.ts +36 -0
- package/dist/idle-gc.d.ts.map +1 -0
- package/dist/idle-gc.js +70 -0
- package/dist/idle-gc.js.map +1 -0
- package/dist/keyframes.d.ts +108 -0
- package/dist/keyframes.d.ts.map +1 -0
- package/dist/keyframes.js +107 -0
- package/dist/keyframes.js.map +1 -0
- package/dist/layout-animation.d.ts +38 -0
- package/dist/layout-animation.d.ts.map +1 -0
- package/dist/layout-animation.js +41 -0
- package/dist/layout-animation.js.map +1 -0
- package/dist/match-media.d.ts +62 -0
- package/dist/match-media.d.ts.map +1 -0
- package/dist/match-media.js +272 -0
- package/dist/match-media.js.map +1 -0
- package/dist/media-query.d.ts +21 -0
- package/dist/media-query.d.ts.map +1 -0
- package/dist/media-query.js +599 -0
- package/dist/media-query.js.map +1 -0
- package/dist/motion-bindings.d.ts +36 -0
- package/dist/motion-bindings.d.ts.map +1 -0
- package/dist/motion-bindings.js +107 -0
- package/dist/motion-bindings.js.map +1 -0
- package/dist/motion-config.d.ts +20 -0
- package/dist/motion-config.d.ts.map +1 -0
- package/dist/motion-config.js +51 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/motion-span.d.ts +57 -0
- package/dist/motion-span.d.ts.map +1 -0
- package/dist/motion-span.js +150 -0
- package/dist/motion-span.js.map +1 -0
- package/dist/motion-value.d.ts +269 -0
- package/dist/motion-value.d.ts.map +1 -0
- package/dist/motion-value.js +941 -0
- package/dist/motion-value.js.map +1 -0
- package/dist/motion-variants.d.ts +190 -0
- package/dist/motion-variants.d.ts.map +1 -0
- package/dist/motion-variants.js +249 -0
- package/dist/motion-variants.js.map +1 -0
- package/dist/mutations.d.ts +65 -0
- package/dist/mutations.d.ts.map +1 -0
- package/dist/mutations.js +320 -0
- package/dist/mutations.js.map +1 -0
- package/dist/nativeview.d.ts +10 -0
- package/dist/nativeview.d.ts.map +1 -0
- package/dist/nativeview.js +92 -0
- package/dist/nativeview.js.map +1 -0
- package/dist/observers.d.ts +92 -0
- package/dist/observers.d.ts.map +1 -0
- package/dist/observers.js +579 -0
- package/dist/observers.js.map +1 -0
- package/dist/presence.d.ts +63 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/renderer-state.d.ts +155 -0
- package/dist/renderer-state.d.ts.map +1 -0
- package/dist/renderer-state.js +302 -0
- package/dist/renderer-state.js.map +1 -0
- package/dist/reorder.d.ts +63 -0
- package/dist/reorder.d.ts.map +1 -0
- package/dist/reorder.js +303 -0
- package/dist/reorder.js.map +1 -0
- package/dist/runtime.d.ts +23 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +157 -0
- package/dist/runtime.js.map +1 -0
- package/dist/screen.d.ts +8 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +16 -0
- package/dist/screen.js.map +1 -0
- package/dist/scroll.d.ts +79 -0
- package/dist/scroll.d.ts.map +1 -0
- package/dist/scroll.js +170 -0
- package/dist/scroll.js.map +1 -0
- package/dist/style-images.d.ts +20 -0
- package/dist/style-images.d.ts.map +1 -0
- package/dist/style-images.js +57 -0
- package/dist/style-images.js.map +1 -0
- package/dist/svg.d.ts +16 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +119 -0
- package/dist/svg.js.map +1 -0
- package/dist/testing.d.ts +811 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +1187 -0
- package/dist/testing.js.map +1 -0
- package/dist/text-match.d.ts +8 -0
- package/dist/text-match.d.ts.map +1 -0
- package/dist/text-match.js +10 -0
- package/dist/text-match.js.map +1 -0
- package/dist/text-selection.d.ts +34 -0
- package/dist/text-selection.d.ts.map +1 -0
- package/dist/text-selection.js +23 -0
- package/dist/text-selection.js.map +1 -0
- package/dist/universal-style.d.ts +22 -0
- package/dist/universal-style.d.ts.map +1 -0
- package/dist/universal-style.js +58 -0
- package/dist/universal-style.js.map +1 -0
- package/dist/web-animations.d.ts +300 -0
- package/dist/web-animations.d.ts.map +1 -0
- package/dist/web-animations.js +1032 -0
- package/dist/web-animations.js.map +1 -0
- package/dist/webview.d.ts +39 -0
- package/dist/webview.d.ts.map +1 -0
- package/dist/webview.js +26 -0
- package/dist/webview.js.map +1 -0
- package/gpuix-native.darwin-arm64.node +4 -0
- package/index.cjs +789 -0
- package/index.d.ts +2603 -0
- package/index.js +729 -0
- package/package.json +94 -3
- package/README.md +0 -3
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { DOM_DISPATCHED_HANDLER_PROPS, KEYBOARD_FOCUS_EVENT_PROPS } from "./events/event-props.js";
|
|
2
|
+
import { registerMutationQueue } from "./bounds.js";
|
|
3
|
+
import { createBlobImageLoader } from "./blob-images.js";
|
|
4
|
+
import { createStyleImageLoader } from "./style-images.js";
|
|
5
|
+
import { SVG_TEXT_PROPS } from "./svg.js";
|
|
6
|
+
import { cancelAnimationsOfElements } from "./web-animations.js";
|
|
7
|
+
let appliedBatches = 0;
|
|
8
|
+
/**
|
|
9
|
+
* How many batches of mutations have reached a renderer, across every queue.
|
|
10
|
+
* It moves whenever the tree changes, which makes it the signal that an app is
|
|
11
|
+
* still working: `collectGarbageWhenIdle` waits for it to hold still.
|
|
12
|
+
*/
|
|
13
|
+
export function appliedBatchCount() {
|
|
14
|
+
return appliedBatches;
|
|
15
|
+
}
|
|
16
|
+
export function createMutationQueue(renderer, onDestroyed = () => { }, scheduleFlush) {
|
|
17
|
+
let queue = [];
|
|
18
|
+
let flushScheduled = false;
|
|
19
|
+
const requestFlush = () => {
|
|
20
|
+
if (!scheduleFlush || flushScheduled)
|
|
21
|
+
return;
|
|
22
|
+
flushScheduled = true;
|
|
23
|
+
scheduleFlush(() => {
|
|
24
|
+
if (!flushScheduled)
|
|
25
|
+
return;
|
|
26
|
+
flushScheduled = false;
|
|
27
|
+
mutations.flushMutations();
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const enqueue = (mutation) => {
|
|
31
|
+
queue.push(mutation);
|
|
32
|
+
requestFlush();
|
|
33
|
+
};
|
|
34
|
+
const blobImages = createBlobImageLoader(renderer, {
|
|
35
|
+
flush: () => mutations.flushMutations(),
|
|
36
|
+
fail: (id, message, ticket) => {
|
|
37
|
+
enqueue(["setCustomProp", id, "srcError", { message, ticket }]);
|
|
38
|
+
if (!scheduleFlush)
|
|
39
|
+
mutations.flushMutations();
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
const styleImages = createStyleImageLoader(renderer);
|
|
43
|
+
const mutations = {
|
|
44
|
+
get pending() {
|
|
45
|
+
return queue.length;
|
|
46
|
+
},
|
|
47
|
+
createElement(id, elementType) {
|
|
48
|
+
blobImages.created(id, elementType);
|
|
49
|
+
enqueue(["createElement", id, elementType]);
|
|
50
|
+
},
|
|
51
|
+
destroyElement(id) {
|
|
52
|
+
blobImages.destroyed(id);
|
|
53
|
+
enqueue(["destroyElement", id]);
|
|
54
|
+
return [];
|
|
55
|
+
},
|
|
56
|
+
appendChild(parentId, childId) {
|
|
57
|
+
enqueue(["appendChild", parentId, childId]);
|
|
58
|
+
},
|
|
59
|
+
insertBefore(parentId, childId, beforeId) {
|
|
60
|
+
enqueue(["insertBefore", parentId, childId, beforeId]);
|
|
61
|
+
},
|
|
62
|
+
setStyle(id, style) {
|
|
63
|
+
styleImages.style(style);
|
|
64
|
+
enqueue(["setStyle", id, style]);
|
|
65
|
+
},
|
|
66
|
+
setText(id, content) {
|
|
67
|
+
enqueue(["setText", id, content]);
|
|
68
|
+
},
|
|
69
|
+
setEventListener(id, eventType, hasHandler) {
|
|
70
|
+
enqueue(["setEventListener", id, eventType, hasHandler]);
|
|
71
|
+
},
|
|
72
|
+
setRoot(id) {
|
|
73
|
+
enqueue(["setRoot", id]);
|
|
74
|
+
},
|
|
75
|
+
setKeyboardFocusDim(enabled) {
|
|
76
|
+
enqueue(["setKeyboardFocusDim", enabled]);
|
|
77
|
+
},
|
|
78
|
+
setUniversalStyle(style) {
|
|
79
|
+
styleImages.style(style);
|
|
80
|
+
enqueue(["setUniversalStyle", style]);
|
|
81
|
+
},
|
|
82
|
+
setCustomProp(id, key, value) {
|
|
83
|
+
blobImages.prop(id, key, value);
|
|
84
|
+
enqueue(["setCustomProp", id, key, value]);
|
|
85
|
+
},
|
|
86
|
+
requestFlush,
|
|
87
|
+
flushMutations() {
|
|
88
|
+
flushScheduled = false;
|
|
89
|
+
if (queue.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
appliedBatches++;
|
|
92
|
+
// Taken before the call: applying a batch can run JS (the focus events of
|
|
93
|
+
// an `autoFocus` element), and what that enqueues belongs to the next batch.
|
|
94
|
+
const batch = queue;
|
|
95
|
+
queue = [];
|
|
96
|
+
let rejection;
|
|
97
|
+
let applied = false;
|
|
98
|
+
try {
|
|
99
|
+
for (;;) {
|
|
100
|
+
try {
|
|
101
|
+
const destroyed = renderer.applyBatch(JSON.stringify(batch));
|
|
102
|
+
cancelAnimationsOfElements(renderer, destroyed);
|
|
103
|
+
onDestroyed(destroyed);
|
|
104
|
+
applied = true;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// A style native rejects is rejected the same way on every retry, so
|
|
109
|
+
// keeping it would fail every later batch too. Native is atomic, so
|
|
110
|
+
// the rest of the batch is intact: resend it without that op. It must
|
|
111
|
+
// be dropped, not blanked: `set_style` replaces the whole style, so an
|
|
112
|
+
// empty one would wipe the element's last valid style. Native numbers
|
|
113
|
+
// ops by position in what it was sent, which is the batch as spliced,
|
|
114
|
+
// so a second rejection names its index in the shortened batch.
|
|
115
|
+
const index = rejectedStyleIndex(error);
|
|
116
|
+
const mutation = index === undefined ? undefined : batch[index];
|
|
117
|
+
if (index === undefined ||
|
|
118
|
+
mutation === undefined ||
|
|
119
|
+
(mutation[0] !== "setStyle" && mutation[0] !== "setUniversalStyle")) {
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
rejection ??= error;
|
|
123
|
+
batch.splice(index, 1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (!applied)
|
|
129
|
+
queue = batch.concat(queue);
|
|
130
|
+
}
|
|
131
|
+
if (rejection !== undefined)
|
|
132
|
+
throw rejection;
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
registerMutationQueue(renderer, mutations);
|
|
136
|
+
return mutations;
|
|
137
|
+
}
|
|
138
|
+
/** The batch index native names when it rejects a `setStyle` or `setUniversalStyle` payload. */
|
|
139
|
+
function rejectedStyleIndex(error) {
|
|
140
|
+
const match = /^Batch op (\d+) set(?:Universal)?Style parse error/.exec(error instanceof Error ? error.message : String(error));
|
|
141
|
+
return match ? Number(match[1]) : undefined;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handler prop to the key its handler is stored under in `EventHandlerMap`.
|
|
145
|
+
* Pointer, mouse, drag, wheel, transition and animation keys are lowercase DOM
|
|
146
|
+
* types, and each has an `on…Capture` twin keyed `captureHandlerKey(type)`. Key
|
|
147
|
+
* and focus keys are lowercase DOM types without a twin. The other keys are
|
|
148
|
+
* native event names. See `nativeEventType` for the type native is asked to emit.
|
|
149
|
+
*/
|
|
150
|
+
export const EVENT_PROPS = [
|
|
151
|
+
["onToggleFile", "toggleFile"],
|
|
152
|
+
["onShowMore", "showMore"],
|
|
153
|
+
["onLineClick", "lineClick"],
|
|
154
|
+
["onLinkClick", "linkClick"],
|
|
155
|
+
["onPlacement", "placement"],
|
|
156
|
+
["onVisibleRange", "visibleRange"],
|
|
157
|
+
["onHighlight", "highlight"],
|
|
158
|
+
["onMotionComplete", "motionComplete"],
|
|
159
|
+
["onLayoutAnimationStart", "layoutAnimationStart"],
|
|
160
|
+
["onLayoutAnimationComplete", "layoutAnimationComplete"],
|
|
161
|
+
["onChange", "change"],
|
|
162
|
+
["onSubmit", "submit"],
|
|
163
|
+
["onInvalid", "invalid"],
|
|
164
|
+
...DOM_DISPATCHED_HANDLER_PROPS,
|
|
165
|
+
["onMouseDownOutside", "mousedownoutside"],
|
|
166
|
+
...KEYBOARD_FOCUS_EVENT_PROPS,
|
|
167
|
+
["onScroll", "scroll"],
|
|
168
|
+
["onLayout", "layout"],
|
|
169
|
+
["onLoad", "load"],
|
|
170
|
+
["onError", "error"],
|
|
171
|
+
["onDidStartLoading", "did-start-loading"],
|
|
172
|
+
["onDidStopLoading", "did-stop-loading"],
|
|
173
|
+
["onDidNavigate", "did-navigate"],
|
|
174
|
+
["onPageTitleUpdated", "page-title-updated"],
|
|
175
|
+
["onDidFailLoad", "did-fail-load"],
|
|
176
|
+
["onAttach", "attach"],
|
|
177
|
+
["onDetach", "detach"],
|
|
178
|
+
];
|
|
179
|
+
export const EVENT_PROP_NAMES = new Set(EVENT_PROPS.map(([name]) => name));
|
|
180
|
+
/**
|
|
181
|
+
* Event type for a handler prop. Adapters walk an element's own props and look
|
|
182
|
+
* each one up here, which beats testing every entry of `EVENT_PROPS` against an
|
|
183
|
+
* element that has two or three props.
|
|
184
|
+
*/
|
|
185
|
+
export const EVENT_TYPE_BY_PROP = new Map(EVENT_PROPS);
|
|
186
|
+
/**
|
|
187
|
+
* `EVENT_TYPE_BY_PROP` for a framework whose prop means a different native
|
|
188
|
+
* event. A `null` removes the prop. React DOM listens to `focusin` and
|
|
189
|
+
* `focusout` for `onFocus` and `onBlur`, so those props bubble there; Solid
|
|
190
|
+
* follows plain DOM, where they do not.
|
|
191
|
+
*/
|
|
192
|
+
export function eventTypesWithOverrides(overrides) {
|
|
193
|
+
const types = new Map(EVENT_PROPS);
|
|
194
|
+
for (const [prop, type] of Object.entries(overrides)) {
|
|
195
|
+
if (type === null)
|
|
196
|
+
types.delete(prop);
|
|
197
|
+
else
|
|
198
|
+
types.set(prop, type);
|
|
199
|
+
}
|
|
200
|
+
return types;
|
|
201
|
+
}
|
|
202
|
+
export const RESERVED_PROPS = new Set([
|
|
203
|
+
"style",
|
|
204
|
+
"className",
|
|
205
|
+
"children",
|
|
206
|
+
"key",
|
|
207
|
+
"ref",
|
|
208
|
+
]);
|
|
209
|
+
export const BUILT_IN_TYPES = new Set(["div", "text", "label", "form", "span"]);
|
|
210
|
+
const UNIVERSAL_PROPS = new Set([
|
|
211
|
+
"autoFocus",
|
|
212
|
+
"tabIndex",
|
|
213
|
+
"draggable",
|
|
214
|
+
"inert",
|
|
215
|
+
"colSpan",
|
|
216
|
+
"rowSpan",
|
|
217
|
+
"span",
|
|
218
|
+
"motion",
|
|
219
|
+
"layout",
|
|
220
|
+
"testId",
|
|
221
|
+
"formControl",
|
|
222
|
+
"highlight",
|
|
223
|
+
"role",
|
|
224
|
+
"id",
|
|
225
|
+
"htmlFor",
|
|
226
|
+
]);
|
|
227
|
+
/** Props a `div`, `text`, `label` or `form` forwards to native; every other prop is dropped. */
|
|
228
|
+
export function isUniversalProp(name) {
|
|
229
|
+
return UNIVERSAL_PROPS.has(name) || name.startsWith("aria-");
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Whether a prop of an element of this type reaches native. A host element
|
|
233
|
+
* forwards only its universal props; an SVG `<text>` is the `text` host
|
|
234
|
+
* element with SVG attributes, so it forwards those too.
|
|
235
|
+
*/
|
|
236
|
+
export function forwardsCustomProp(type, name) {
|
|
237
|
+
return (!BUILT_IN_TYPES.has(type) ||
|
|
238
|
+
isUniversalProp(name) ||
|
|
239
|
+
(type === "text" && SVG_TEXT_PROPS.has(name)));
|
|
240
|
+
}
|
|
241
|
+
export function isReservedProp(name) {
|
|
242
|
+
return RESERVED_PROPS.has(name) || EVENT_PROP_NAMES.has(name);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Structural equality for the JSON values a mutation carries: styles and
|
|
246
|
+
* custom props. A key whose value is `undefined` counts as absent, because
|
|
247
|
+
* `JSON.stringify` drops it, so `{ color: undefined }` and `{}` reach Rust as
|
|
248
|
+
* the same payload and must compare equal here.
|
|
249
|
+
*
|
|
250
|
+
* Only plain objects, arrays and primitives are compared. A function or class
|
|
251
|
+
* instance is equal to itself and nothing else.
|
|
252
|
+
*
|
|
253
|
+
* Key order counts: native reads a style's keys in written order, and of a
|
|
254
|
+
* shorthand and a longhand it covers the one written later wins, so
|
|
255
|
+
* `{ padding: 8, paddingLeft: 4 }` and `{ paddingLeft: 4, padding: 8 }` differ.
|
|
256
|
+
*/
|
|
257
|
+
export function sameMutationValue(left, right) {
|
|
258
|
+
if (left === right)
|
|
259
|
+
return true;
|
|
260
|
+
// NaN serializes to null on both sides, and -0 to 0, so neither is a change.
|
|
261
|
+
if (typeof left === "number" && typeof right === "number")
|
|
262
|
+
return left !== left && right !== right;
|
|
263
|
+
if (typeof left !== "object" || typeof right !== "object" || left === null || right === null) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
if (Array.isArray(left)) {
|
|
267
|
+
if (!Array.isArray(right) || left.length !== right.length)
|
|
268
|
+
return false;
|
|
269
|
+
for (let index = 0; index < left.length; index++) {
|
|
270
|
+
if (!sameMutationValue(left[index], right[index]))
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
if (Array.isArray(right))
|
|
276
|
+
return false;
|
|
277
|
+
const leftProto = Object.getPrototypeOf(left);
|
|
278
|
+
if (leftProto !== Object.prototype && leftProto !== null)
|
|
279
|
+
return false;
|
|
280
|
+
if (Object.getPrototypeOf(right) !== leftProto)
|
|
281
|
+
return false;
|
|
282
|
+
const leftRecord = left;
|
|
283
|
+
const rightRecord = right;
|
|
284
|
+
let defined = 0;
|
|
285
|
+
for (const key in leftRecord) {
|
|
286
|
+
const value = leftRecord[key];
|
|
287
|
+
if (value === undefined)
|
|
288
|
+
continue;
|
|
289
|
+
defined++;
|
|
290
|
+
if (!sameMutationValue(value, rightRecord[key]))
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
let rightDefined = 0;
|
|
294
|
+
for (const key in rightRecord) {
|
|
295
|
+
if (rightRecord[key] !== undefined)
|
|
296
|
+
rightDefined++;
|
|
297
|
+
}
|
|
298
|
+
if (defined !== rightDefined)
|
|
299
|
+
return false;
|
|
300
|
+
if (defined < 2)
|
|
301
|
+
return true;
|
|
302
|
+
// Same keys and values: they still differ when written in another order.
|
|
303
|
+
const rightKeys = Object.keys(rightRecord);
|
|
304
|
+
let position = 0;
|
|
305
|
+
for (const key in leftRecord) {
|
|
306
|
+
if (leftRecord[key] === undefined)
|
|
307
|
+
continue;
|
|
308
|
+
while (rightRecord[rightKeys[position]] === undefined)
|
|
309
|
+
position++;
|
|
310
|
+
if (rightKeys[position++] !== key)
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
export function serializeCustomProp(value) {
|
|
316
|
+
if (value === undefined || typeof value === "function")
|
|
317
|
+
return null;
|
|
318
|
+
return value;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../js/mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EventHandlerMap, MutationRenderer } from "./host.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registers the native listeners for a `<nativeview>`'s `onAttach` and `onDetach`,
|
|
4
|
+
* or removes them when it has neither. Call it on mount and whenever either prop
|
|
5
|
+
* changed; a new function replaces the old one without a second native listener.
|
|
6
|
+
*/
|
|
7
|
+
export declare function syncNativeviewListeners(eventHandlers: EventHandlerMap, renderer: Pick<MutationRenderer, "setEventListener">, elementId: number, onAttach: unknown, onDetach: unknown): void;
|
|
8
|
+
/** `onAttach` and `onDetach`: the adapters register these through `syncNativeviewListeners`, not as DOM handlers. */
|
|
9
|
+
export declare function isNativeviewHandlerProp(name: string): boolean;
|
|
10
|
+
//# sourceMappingURL=nativeview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeview.d.ts","sourceRoot":"","sources":["../js/nativeview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAoB,gBAAgB,EAAE,MAAM,WAAW,CAAA;AA2FpF;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,eAAe,EAC9B,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EACpD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,GAChB,IAAI,CAWN;AAED,qHAAqH;AACrH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { registerEventListener, unregisterEventListener } from "./events/listeners.js";
|
|
2
|
+
const ATTACH = "attach";
|
|
3
|
+
const DETACH = "detach";
|
|
4
|
+
const pairings = new WeakMap();
|
|
5
|
+
function pairingOf(event) {
|
|
6
|
+
if (event.target === null) {
|
|
7
|
+
throw new Error(`The "${event.type}" event of a <nativeview> has no target element.`);
|
|
8
|
+
}
|
|
9
|
+
let pairing = pairings.get(event.target);
|
|
10
|
+
if (!pairing) {
|
|
11
|
+
pairing = { attachCalled: false, detached: false };
|
|
12
|
+
pairings.set(event.target, pairing);
|
|
13
|
+
}
|
|
14
|
+
return pairing;
|
|
15
|
+
}
|
|
16
|
+
function viewOf(event) {
|
|
17
|
+
const handle = event.nativeHandle;
|
|
18
|
+
if (handle === undefined || !/^\d+$/.test(handle)) {
|
|
19
|
+
throw new Error(`The "attach" event of a <nativeview> carries no native handle in decimal digits: ${JSON.stringify(handle)}.`);
|
|
20
|
+
}
|
|
21
|
+
return BigInt(handle);
|
|
22
|
+
}
|
|
23
|
+
function asHandler(prop, value) {
|
|
24
|
+
if (value === undefined || value === null || value === false)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (typeof value !== "function") {
|
|
27
|
+
throw new TypeError(`${prop} of a <nativeview> must be a function, got ${typeof value}.`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The two native listeners for a pair of user handlers. Both are always made,
|
|
33
|
+
* whichever handler is present: native sends `detach` only after an `attach` it
|
|
34
|
+
* emitted, and the state that pairs them has to see both.
|
|
35
|
+
*
|
|
36
|
+
* `attach` comes through the event queue and `detach` synchronously, so a
|
|
37
|
+
* teardown can overtake the queued `attach`. Such an `attach` is dropped:
|
|
38
|
+
* handing out the pointer of a surface that is already gone would be a crash.
|
|
39
|
+
* `onDetach` runs only when `onAttach` ran, or always when there is no `onAttach`.
|
|
40
|
+
*/
|
|
41
|
+
function listeners(onAttach, onDetach) {
|
|
42
|
+
return {
|
|
43
|
+
attach(event) {
|
|
44
|
+
const pairing = pairingOf(event);
|
|
45
|
+
if (pairing.detached)
|
|
46
|
+
return;
|
|
47
|
+
if (pairing.attachCalled) {
|
|
48
|
+
throw new Error(`<nativeview> ${event.elementId} was attached twice.`);
|
|
49
|
+
}
|
|
50
|
+
if (!onAttach)
|
|
51
|
+
return;
|
|
52
|
+
const view = viewOf(event);
|
|
53
|
+
// Before the call: a throw in `onAttach` still leaves a library that may hold the view.
|
|
54
|
+
pairing.attachCalled = true;
|
|
55
|
+
onAttach(view);
|
|
56
|
+
},
|
|
57
|
+
detach(event) {
|
|
58
|
+
const pairing = pairingOf(event);
|
|
59
|
+
if (pairing.detached) {
|
|
60
|
+
throw new Error(`<nativeview> ${event.elementId} was detached twice.`);
|
|
61
|
+
}
|
|
62
|
+
pairing.detached = true;
|
|
63
|
+
if (!onDetach)
|
|
64
|
+
return;
|
|
65
|
+
if (onAttach && !pairing.attachCalled)
|
|
66
|
+
return;
|
|
67
|
+
onDetach();
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Registers the native listeners for a `<nativeview>`'s `onAttach` and `onDetach`,
|
|
73
|
+
* or removes them when it has neither. Call it on mount and whenever either prop
|
|
74
|
+
* changed; a new function replaces the old one without a second native listener.
|
|
75
|
+
*/
|
|
76
|
+
export function syncNativeviewListeners(eventHandlers, renderer, elementId, onAttach, onDetach) {
|
|
77
|
+
const attach = asHandler("onAttach", onAttach);
|
|
78
|
+
const detach = asHandler("onDetach", onDetach);
|
|
79
|
+
if (!attach && !detach) {
|
|
80
|
+
unregisterEventListener(eventHandlers, renderer, elementId, ATTACH);
|
|
81
|
+
unregisterEventListener(eventHandlers, renderer, elementId, DETACH);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const pair = listeners(attach, detach);
|
|
85
|
+
registerEventListener(eventHandlers, renderer, elementId, ATTACH, pair.attach);
|
|
86
|
+
registerEventListener(eventHandlers, renderer, elementId, DETACH, pair.detach);
|
|
87
|
+
}
|
|
88
|
+
/** `onAttach` and `onDetach`: the adapters register these through `syncNativeviewListeners`, not as DOM handlers. */
|
|
89
|
+
export function isNativeviewHandlerProp(name) {
|
|
90
|
+
return name === "onAttach" || name === "onDetach";
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=nativeview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeview.js","sourceRoot":"","sources":["../js/nativeview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { EventPayload } from "../index.js";
|
|
2
|
+
import { type BoundingClientRect, type ObservableElement } from "./bounds.js";
|
|
3
|
+
/**
|
|
4
|
+
* `ResizeObserver` and `IntersectionObserver` for host elements.
|
|
5
|
+
*
|
|
6
|
+
* Native reports an observed element's border box, content box and visible
|
|
7
|
+
* (clipped) rect after each paint where they changed; the rules of the two DOM
|
|
8
|
+
* APIs are applied here. Entries are delivered once per batch of native
|
|
9
|
+
* events, after all of a frame's reports have arrived.
|
|
10
|
+
*
|
|
11
|
+
* Observing does not read layout. The first observation of every element
|
|
12
|
+
* observed since the last frame is probed together, in one step after the
|
|
13
|
+
* commit, so N observers started by one commit cost one draw, not N.
|
|
14
|
+
*/
|
|
15
|
+
export declare const RESIZE_OBSERVE_EVENT = "resizeObserve";
|
|
16
|
+
export declare const INTERSECT_OBSERVE_EVENT = "intersectObserve";
|
|
17
|
+
/**
|
|
18
|
+
* Probe every subscription made since the last probe, now: the pending
|
|
19
|
+
* mutations are sent and the window is laid out once for all of them. A
|
|
20
|
+
* subscriber that joined an element that has reported already is handed that
|
|
21
|
+
* report instead, with no layout read.
|
|
22
|
+
*/
|
|
23
|
+
export declare function settleObservations(renderer: object): void;
|
|
24
|
+
/**
|
|
25
|
+
* Run the callbacks of every observer with entries waiting, now. The frame
|
|
26
|
+
* loop delivers on its own right after a frame's reports; a test calls this
|
|
27
|
+
* after draining native events, since nothing else would run.
|
|
28
|
+
*/
|
|
29
|
+
export declare function flushObservations(renderer: object): void;
|
|
30
|
+
/** Called for every native event. Returns whether an observer wanted it. */
|
|
31
|
+
export declare function deliverObservation(renderer: object, event: EventPayload): boolean;
|
|
32
|
+
export type ResizeObserverBoxOptions = "border-box" | "content-box";
|
|
33
|
+
export interface ResizeObserverOptions {
|
|
34
|
+
/** Which box's size triggers the callback. Defaults to `"content-box"`. */
|
|
35
|
+
box?: ResizeObserverBoxOptions;
|
|
36
|
+
}
|
|
37
|
+
export interface ResizeObserverSize {
|
|
38
|
+
readonly inlineSize: number;
|
|
39
|
+
readonly blockSize: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ResizeObserverEntry {
|
|
42
|
+
readonly target: ObservableElement;
|
|
43
|
+
/** The content box, positioned by the padding on the left and top. */
|
|
44
|
+
readonly contentRect: BoundingClientRect;
|
|
45
|
+
readonly borderBoxSize: readonly [ResizeObserverSize];
|
|
46
|
+
readonly contentBoxSize: readonly [ResizeObserverSize];
|
|
47
|
+
}
|
|
48
|
+
export type ResizeObserverCallback = (entries: ResizeObserverEntry[], observer: ResizeObserver) => void;
|
|
49
|
+
export declare class ResizeObserver {
|
|
50
|
+
#private;
|
|
51
|
+
constructor(callback: ResizeObserverCallback);
|
|
52
|
+
/** Start observing, or restart: observing an element again reports its size again. */
|
|
53
|
+
observe(target: ObservableElement, options?: ResizeObserverOptions): void;
|
|
54
|
+
unobserve(target: ObservableElement): void;
|
|
55
|
+
disconnect(): void;
|
|
56
|
+
}
|
|
57
|
+
export interface IntersectionObserverInit {
|
|
58
|
+
/** The element whose box targets are tested against. `null` is the window. */
|
|
59
|
+
root?: ObservableElement | null;
|
|
60
|
+
/** Grows or shrinks the root before testing: 1 to 4 lengths in `px` or `%`. */
|
|
61
|
+
rootMargin?: string;
|
|
62
|
+
threshold?: number | number[];
|
|
63
|
+
}
|
|
64
|
+
export interface IntersectionObserverEntry {
|
|
65
|
+
/** `performance.now()` when the change was observed. */
|
|
66
|
+
readonly time: number;
|
|
67
|
+
/**
|
|
68
|
+
* The root's padding box with `rootMargin` applied, or the window for a
|
|
69
|
+
* `null` root.
|
|
70
|
+
*/
|
|
71
|
+
readonly rootBounds: BoundingClientRect;
|
|
72
|
+
readonly boundingClientRect: BoundingClientRect;
|
|
73
|
+
readonly intersectionRect: BoundingClientRect;
|
|
74
|
+
readonly isIntersecting: boolean;
|
|
75
|
+
readonly intersectionRatio: number;
|
|
76
|
+
readonly target: ObservableElement;
|
|
77
|
+
}
|
|
78
|
+
export type IntersectionObserverCallback = (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void;
|
|
79
|
+
export declare class IntersectionObserver {
|
|
80
|
+
#private;
|
|
81
|
+
readonly root: ObservableElement | null;
|
|
82
|
+
readonly rootMargin: string;
|
|
83
|
+
readonly thresholds: readonly number[];
|
|
84
|
+
constructor(callback: IntersectionObserverCallback, options?: IntersectionObserverInit);
|
|
85
|
+
/** Start observing. The first entry arrives after the next frame, whatever the state. */
|
|
86
|
+
observe(target: ObservableElement): void;
|
|
87
|
+
unobserve(target: ObservableElement): void;
|
|
88
|
+
disconnect(): void;
|
|
89
|
+
/** Entries not yet delivered, removed from the queue. */
|
|
90
|
+
takeRecords(): IntersectionObserverEntry[];
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=observers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observers.d.ts","sourceRoot":"","sources":["../js/observers.ts"],"names":[],"mappings":"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"}
|