@qontinui/ui-bridge-native 0.6.11 → 0.6.13
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/README.md +36 -16
- package/dist/control/action-executor.d.ts +42 -2
- package/dist/control/action-executor.d.ts.map +1 -1
- package/dist/control/index.js +723 -4
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +723 -5
- package/dist/control/index.mjs.map +1 -1
- package/dist/control/types.d.ts +82 -1
- package/dist/control/types.d.ts.map +1 -1
- package/dist/core/abortable.d.ts +151 -0
- package/dist/core/abortable.d.ts.map +1 -0
- package/dist/core/action-effect.d.ts +74 -0
- package/dist/core/action-effect.d.ts.map +1 -0
- package/dist/core/element-actions.d.ts +38 -0
- package/dist/core/element-actions.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +853 -15
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +835 -16
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/param-schema.d.ts +282 -0
- package/dist/core/param-schema.d.ts.map +1 -0
- package/dist/core/registry.d.ts +317 -2
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/types.d.ts +231 -32
- package/dist/core/types.d.ts.map +1 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1603 -118
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1585 -119
- package/dist/index.mjs.map +1 -1
- package/dist/react/UIBridgeNativeProvider.d.ts +1 -23
- package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -1
- package/dist/react/index.js +1420 -113
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1420 -113
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/useUIBridge.d.ts +19 -22
- package/dist/react/useUIBridge.d.ts.map +1 -1
- package/dist/react/useUIComponent.d.ts +113 -8
- package/dist/react/useUIComponent.d.ts.map +1 -1
- package/dist/react/useUIElement.d.ts +34 -8
- package/dist/react/useUIElement.d.ts.map +1 -1
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/http-server.d.ts +15 -2
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/index.js +348 -43
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +348 -44
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/observability.d.ts +40 -0
- package/dist/server/observability.d.ts.map +1 -1
- package/dist/server/types.d.ts +57 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/transport/CloudRelayClient.d.ts.map +1 -1
- package/dist/transport/DeviceAnnouncer.d.ts.map +1 -1
- package/dist/transport/relay-logging.d.ts +50 -0
- package/dist/transport/relay-logging.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/core/registry.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Central registry for all UI elements and components registered with UI Bridge Native.
|
|
5
5
|
* Adapted from ui-bridge for React Native environments.
|
|
6
6
|
*/
|
|
7
|
-
import type { RegisteredNativeElement, RegisteredNativeComponent, NativeElementState, NativeElementType, NativeStandardAction, NativeCustomAction, NativeAppInfo, NativeBridgeSnapshot, NativeElementBbox, NativeElementRef, NativeRegistrationCoverage, NativeRouteProviderLike, NativeSnapshotEnrichers, NativeSnapshotEnricher, Workflow, BridgeEventType, BridgeEventListener } from './types';
|
|
7
|
+
import type { RegisteredNativeElement, RegisteredNativeComponent, NativeElementState, NativeElementType, NativeStandardAction, NativeCustomAction, NativeAppInfo, NativeBridgeSnapshot, NativeElementBbox, NativeElementRef, NativeRegistrationCoverage, NativeRouteProviderLike, NativeSnapshotEnrichers, NativeSnapshotEnricher, Workflow, BridgeEventType, BridgeEventListener, IREffect } from './types';
|
|
8
8
|
/**
|
|
9
9
|
* Options for registering an element
|
|
10
10
|
*/
|
|
@@ -19,6 +19,24 @@ export interface RegisterElementOptions {
|
|
|
19
19
|
accessibilityLabel?: string;
|
|
20
20
|
/** Route path where the element was registered (for page-scoped filtering) */
|
|
21
21
|
registrationRoute?: string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Id of the registered scrollable container this element lives inside.
|
|
24
|
+
*
|
|
25
|
+
* When set, {@link computeVisibility} clips the element against that
|
|
26
|
+
* container's measured frame as well as the window, so a row scrolled out of
|
|
27
|
+
* its `ScrollView` / `FlatList` stops reporting `visibility: 'visible'`.
|
|
28
|
+
*
|
|
29
|
+
* DECLARED, not inferred, and that is deliberate. React Native gives the
|
|
30
|
+
* registry no parent chain — `useUIElement` is a hook, so it never wraps its
|
|
31
|
+
* element's children and cannot publish itself as their ancestor. Guessing
|
|
32
|
+
* the ancestor geometrically is worse than not clipping: a full-width scroll
|
|
33
|
+
* container horizontally contains the tab bar and the header too, and
|
|
34
|
+
* clipping those against it would report on-screen chrome as off-screen.
|
|
35
|
+
* A wrong `hidden` is a worse answer than a coarse `visible`.
|
|
36
|
+
*
|
|
37
|
+
* Unset (the default) leaves the window as the only clip region.
|
|
38
|
+
*/
|
|
39
|
+
scrollAncestorId?: string;
|
|
22
40
|
/** Flattened RN style (from StyleSheet.flatten) for design review */
|
|
23
41
|
flatStyle?: Record<string, unknown>;
|
|
24
42
|
/** State-specific style overrides for design review */
|
|
@@ -38,10 +56,49 @@ export interface RegisterComponentOptions {
|
|
|
38
56
|
id: string;
|
|
39
57
|
label?: string;
|
|
40
58
|
description?: string;
|
|
41
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Phase 2 (same plan): the action's published parameter schema. It was
|
|
61
|
+
* ABSENT here and dropped by the object literal in `registerComponent`
|
|
62
|
+
* below, so the field `ComponentAction` declares could never reach a
|
|
63
|
+
* registered native component and the native invocation seam had nothing
|
|
64
|
+
* to validate against. That is the silent-drop trap the plan warns about,
|
|
65
|
+
* already realised.
|
|
66
|
+
*/
|
|
67
|
+
paramSchema?: Record<string, unknown>;
|
|
68
|
+
/**
|
|
69
|
+
* Phase 4 (same plan): the safety annotation. Absent here, an author's
|
|
70
|
+
* `effect: 'destructive'` would die at this hop exactly the way
|
|
71
|
+
* `paramSchema` did before Phase 2 — the literal in `registerComponent`
|
|
72
|
+
* has a closed field list and nothing type-checks the omission.
|
|
73
|
+
*/
|
|
74
|
+
effect?: IREffect;
|
|
75
|
+
/**
|
|
76
|
+
* Phase 3 (plan 2026-08-20-ui-bridge-action-declaration-shape): the second
|
|
77
|
+
* argument is the `ActionHandlerOptions` bag carrying the cancellation
|
|
78
|
+
* signal. A 1-arity handler stays assignable.
|
|
79
|
+
*/
|
|
80
|
+
handler: (params?: unknown, options?: {
|
|
81
|
+
signal?: AbortSignal;
|
|
82
|
+
}) => unknown | Promise<unknown>;
|
|
42
83
|
}>;
|
|
43
84
|
elementIds?: string[];
|
|
44
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Options for {@link NativeUIBridgeRegistry.updateComponentMeta}.
|
|
88
|
+
*
|
|
89
|
+
* Every field is optional and `undefined` means "leave the registered value
|
|
90
|
+
* alone" — the same partial-update semantics {@link RegisterComponentOptions}'s
|
|
91
|
+
* sister {@link NativeUIBridgeRegistry.updateElementMeta} uses. A consequence
|
|
92
|
+
* worth stating: a `description` cannot be CLEARED through this door, only
|
|
93
|
+
* replaced. Pass `actions: []` to publish an empty action list; that is
|
|
94
|
+
* distinguishable from omitting the field.
|
|
95
|
+
*/
|
|
96
|
+
export interface UpdateComponentMetaOptions {
|
|
97
|
+
name?: string;
|
|
98
|
+
description?: string;
|
|
99
|
+
actions?: RegisterComponentOptions['actions'];
|
|
100
|
+
elementIds?: string[];
|
|
101
|
+
}
|
|
45
102
|
/**
|
|
46
103
|
* Registry configuration
|
|
47
104
|
*/
|
|
@@ -78,6 +135,29 @@ export declare function extractHandlerNames(props?: Record<string, unknown>): st
|
|
|
78
135
|
* at the root, because tab elements had `registrationRoute: null`.
|
|
79
136
|
*/
|
|
80
137
|
export declare function matchesCurrentRoute(registrationRoute: string | null | undefined, currentRoute: string): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Derive the snapshot's `activeTab` from an Expo Router segment list.
|
|
140
|
+
*
|
|
141
|
+
* Expo Router spells a layout group as a parenthesised segment and a dynamic
|
|
142
|
+
* route as a bracketed one, so `usePathname()`/`useSegments()` on the "runs"
|
|
143
|
+
* tab of a `(tabs)` layout yield `"/(tabs)/runs"` and `["(tabs)", "runs"]`
|
|
144
|
+
* (the shape the `RouteProvider` doc comment already documents). The tab a user
|
|
145
|
+
* is looking at is therefore the segment immediately following the INNERMOST
|
|
146
|
+
* group.
|
|
147
|
+
*
|
|
148
|
+
* Rules, all deliberately conservative — an unknown tab is reported as absent
|
|
149
|
+
* rather than guessed:
|
|
150
|
+
*
|
|
151
|
+
* - `["(tabs)", "runs"]` → `"runs"`
|
|
152
|
+
* - `["(tabs)", "runs", "[id]"]`→ `"runs"` (a detail screen is still *on* a tab)
|
|
153
|
+
* - `["(tabs)"]` → `"index"` (the group's own index route)
|
|
154
|
+
* - `["(tabs)", "[id]"]` → `undefined` (dynamic route, not a tab)
|
|
155
|
+
* - `["settings"]` → `undefined` (no group layout ⇒ no tabs)
|
|
156
|
+
* - `[]` / `undefined` → `undefined`
|
|
157
|
+
*
|
|
158
|
+
* Exported so the rules are unit-testable without standing up a registry.
|
|
159
|
+
*/
|
|
160
|
+
export declare function deriveActiveTabFromSegments(segments?: string[]): string | undefined;
|
|
81
161
|
/**
|
|
82
162
|
* Project an element's runtime state into a runner-native pixel-space `bbox`.
|
|
83
163
|
*
|
|
@@ -105,6 +185,104 @@ export declare function matchesCurrentRoute(registrationRoute: string | null | u
|
|
|
105
185
|
* (rare; keeps a best-effort box rather than dropping the element).
|
|
106
186
|
*/
|
|
107
187
|
export declare function projectBbox(state: NativeElementState, visibility: 'visible' | 'likely-visible' | 'hidden', pixelRatio?: number): NativeElementBbox | undefined;
|
|
188
|
+
/**
|
|
189
|
+
* A rectangle in window (page) coordinates, logical dp — the same space
|
|
190
|
+
* `measureInWindow` reports `pageX`/`pageY` in.
|
|
191
|
+
*/
|
|
192
|
+
export interface NativePageRect {
|
|
193
|
+
left: number;
|
|
194
|
+
top: number;
|
|
195
|
+
right: number;
|
|
196
|
+
bottom: number;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Why an element is not plainly visible.
|
|
200
|
+
*
|
|
201
|
+
* DUPLICATE of `@qontinui/ui-bridge` `VisibilityReason`
|
|
202
|
+
* (`src/core/types.ts` — `'hidden' | 'off-screen' | 'occluded' | 'no-layout'`),
|
|
203
|
+
* for the same reason the action types above are duplicated: `@qontinui/ui-bridge`
|
|
204
|
+
* is an OPTIONAL peer of this package, so this module must not import from it.
|
|
205
|
+
* KEEP IN SYNC — one vocabulary across both SDKs is the point; do not coin
|
|
206
|
+
* native-only spellings.
|
|
207
|
+
*
|
|
208
|
+
* `'occluded'` is declared but never produced here: React Native gives the
|
|
209
|
+
* registry no hit-test equivalent of `document.elementFromPoint`, so this SDK
|
|
210
|
+
* cannot honestly claim occlusion. It stays in the union so a native reason
|
|
211
|
+
* string is always a valid web reason string.
|
|
212
|
+
*/
|
|
213
|
+
export type NativeVisibilityReason = 'hidden' | 'off-screen' | 'occluded' | 'no-layout';
|
|
214
|
+
/** The three-value verdict carried on every snapshot element. */
|
|
215
|
+
export type NativeVisibility = 'visible' | 'likely-visible' | 'hidden';
|
|
216
|
+
/**
|
|
217
|
+
* Convert an element's measured layout into a page-space rect, or `null` when
|
|
218
|
+
* it has no TRUSTWORTHY page-space origin.
|
|
219
|
+
*
|
|
220
|
+
* STRICTER THAN {@link projectBbox} ON PURPOSE. `projectBbox` falls back to the
|
|
221
|
+
* parent-relative `x`/`y` when `pageX`/`pageY` weren't measured, because a
|
|
222
|
+
* slightly-wrong box is still a usable box. Clipping cannot take that trade: a
|
|
223
|
+
* parent-relative origin compared against window coordinates silently mixes two
|
|
224
|
+
* coordinate spaces and yields a wrong `hidden` verdict — the outcome
|
|
225
|
+
* `RegisterElementOptions.scrollAncestorId` calls worse than a coarse
|
|
226
|
+
* `visible`. So a layout flagged `pageOriginUnmeasured` returns `null` here,
|
|
227
|
+
* and {@link computeVisibility} declines to clip rather than guess.
|
|
228
|
+
*/
|
|
229
|
+
export declare function pageRectOf(state: NativeElementState): NativePageRect | null;
|
|
230
|
+
/**
|
|
231
|
+
* Is this rect empty — nothing can overlap it?
|
|
232
|
+
*
|
|
233
|
+
* {@link intersectRects} returns an INVERTED rect (`right < left`) when the two
|
|
234
|
+
* inputs are disjoint, which is the honest answer for "the reachable region",
|
|
235
|
+
* but `spansOverlap`'s `aMin < bMax && aMax > bMin` reads an inverted span as
|
|
236
|
+
* overlapping. Every consumer of an intersection must ask this first.
|
|
237
|
+
*/
|
|
238
|
+
export declare function isEmptyRect(rect: NativePageRect): boolean;
|
|
239
|
+
/**
|
|
240
|
+
* Intersect two page rects, or `null` when either is absent (`null` means
|
|
241
|
+
* UNKNOWN, so it never narrows the other side).
|
|
242
|
+
*
|
|
243
|
+
* The result may be EMPTY — check {@link isEmptyRect}. That happens whenever
|
|
244
|
+
* the two rects are disjoint, e.g. a scroll container that has itself been
|
|
245
|
+
* scrolled out of the window: nothing inside it can be on screen, and an empty
|
|
246
|
+
* clip is exactly how that is expressed.
|
|
247
|
+
*/
|
|
248
|
+
export declare function intersectRects(a: NativePageRect | null, b: NativePageRect | null): NativePageRect | null;
|
|
249
|
+
/**
|
|
250
|
+
* Decide what a snapshot should say about an element being on screen.
|
|
251
|
+
*
|
|
252
|
+
* THE DEFECT THIS CLOSES: visibility used to be derived from mount + `measure()`
|
|
253
|
+
* alone — `state.visible ? (state.layout ? 'visible' : 'likely-visible') : 'hidden'`
|
|
254
|
+
* — with no comparison against any bounds at all. Every mounted, measured
|
|
255
|
+
* element reported `visible`, including rows scrolled far past the fold, so a
|
|
256
|
+
* snapshot claimed things were on screen that were not.
|
|
257
|
+
*
|
|
258
|
+
* SCOPE — read this before citing it. This is a PURE PROJECTION: it reads
|
|
259
|
+
* `state.visible` and never writes it. An off-screen element still carries
|
|
260
|
+
* `state.visible === true`; only the snapshot's `visibility` /
|
|
261
|
+
* `visibilityReason` change. That is a deliberate divergence from the web SDK,
|
|
262
|
+
* which folds off-screen INTO the boolean (`@qontinui/ui-bridge`
|
|
263
|
+
* `src/core/registry.ts` — `if (!inViewport) return { visible: false, reason:
|
|
264
|
+
* 'off-screen' }`), and it means any consumer asserting on `state.visible`
|
|
265
|
+
* alone — `/manual-test`'s "PRESENT IS NOT VISIBLE" gate among them — sees no
|
|
266
|
+
* change on mobile and stays as vacuous as it was. Closing that needs either a
|
|
267
|
+
* matching demotion of `state.visible` here or a consumer that reads
|
|
268
|
+
* `visibility`; both are contract decisions beyond this projection, and
|
|
269
|
+
* neither is done. The strings are shared with the web SDK; the SHAPE is not.
|
|
270
|
+
*
|
|
271
|
+
* `clip` is the region the element must reach to count as on screen — the
|
|
272
|
+
* window, intersected with the measured frame of a declared
|
|
273
|
+
* `scrollAncestorId`. **A `null`/absent clip means the bounds are UNKNOWN, and
|
|
274
|
+
* an unknown never demotes**: with no viewport injected (every non-RN caller,
|
|
275
|
+
* including this package's own suite) the answer is exactly what it was before.
|
|
276
|
+
* Absence of evidence is not evidence of off-screen.
|
|
277
|
+
*
|
|
278
|
+
* Any overlap at all counts as visible. A half-scrolled row IS on screen, and
|
|
279
|
+
* a ratio threshold would be a second, unshared policy knob for callers to
|
|
280
|
+
* disagree about.
|
|
281
|
+
*/
|
|
282
|
+
export declare function computeVisibility(state: NativeElementState, clip?: NativePageRect | null): {
|
|
283
|
+
visibility: NativeVisibility;
|
|
284
|
+
visibilityReason?: NativeVisibilityReason;
|
|
285
|
+
};
|
|
108
286
|
/**
|
|
109
287
|
* Native UI Bridge Registry
|
|
110
288
|
*
|
|
@@ -150,6 +328,18 @@ export declare class NativeUIBridgeRegistry {
|
|
|
150
328
|
* the `projectBbox` doc comment for why we don't import `react-native` here.
|
|
151
329
|
*/
|
|
152
330
|
private pixelRatio;
|
|
331
|
+
/**
|
|
332
|
+
* Injected getter for the device window size in logical dp, used to clip
|
|
333
|
+
* reported visibility. Injected rather than read here for exactly the reason
|
|
334
|
+
* `pixelRatio` is: a static `import { Dimensions } from 'react-native'` in
|
|
335
|
+
* this non-React core module breaks the vitest suite and risks the
|
|
336
|
+
* Metro/Hermes `unknownModuleError`. It is a PROVIDER, not a value, so a
|
|
337
|
+
* rotation is picked up on the next snapshot with nothing to keep in sync.
|
|
338
|
+
*
|
|
339
|
+
* `null` means the window bounds are UNKNOWN, and {@link computeVisibility}
|
|
340
|
+
* treats unknown bounds as "cannot demote" — never as an empty viewport.
|
|
341
|
+
*/
|
|
342
|
+
private viewportProvider;
|
|
153
343
|
/**
|
|
154
344
|
* Sticky flag: flips `true` the first time any element is registered and
|
|
155
345
|
* stays `true` even after elements are unregistered. Lets agents distinguish
|
|
@@ -175,6 +365,16 @@ export declare class NativeUIBridgeRegistry {
|
|
|
175
365
|
setRouteProvider(provider: NativeRouteProviderLike | null | undefined): void;
|
|
176
366
|
/** Read-only accessor for the registered route provider, if any. */
|
|
177
367
|
getRouteProvider(): NativeRouteProviderLike | null;
|
|
368
|
+
/**
|
|
369
|
+
* Resolve the snapshot's `activeTab`: an explicit `getActiveTab()` on the
|
|
370
|
+
* route provider wins, otherwise derive it from the Expo Router segments the
|
|
371
|
+
* provider already exposes.
|
|
372
|
+
*
|
|
373
|
+
* A throwing or empty-string provider degrades to the derivation rather than
|
|
374
|
+
* to `undefined` — the host's opt-in extra should never be able to make the
|
|
375
|
+
* snapshot WORSE than it was without it. A blank derivation stays blank.
|
|
376
|
+
*/
|
|
377
|
+
private resolveActiveTab;
|
|
178
378
|
/**
|
|
179
379
|
* Set the device pixel ratio used to project per-element `bbox` geometry
|
|
180
380
|
* into physical pixels. The React provider passes `PixelRatio.get()` here
|
|
@@ -184,6 +384,34 @@ export declare class NativeUIBridgeRegistry {
|
|
|
184
384
|
setPixelRatio(ratio: number): void;
|
|
185
385
|
/** Read-only accessor for the device pixel ratio used for bbox projection. */
|
|
186
386
|
getPixelRatio(): number;
|
|
387
|
+
/**
|
|
388
|
+
* Set the getter for the device window size (logical dp) that reported
|
|
389
|
+
* visibility is clipped against. The React provider passes
|
|
390
|
+
* `() => Dimensions.get('window')` here at construction.
|
|
391
|
+
*
|
|
392
|
+
* Pass `null` to detach. While detached the window bounds are UNKNOWN and no
|
|
393
|
+
* element is ever demoted for being outside them.
|
|
394
|
+
*/
|
|
395
|
+
setViewportProvider(provider: (() => {
|
|
396
|
+
width: number;
|
|
397
|
+
height: number;
|
|
398
|
+
}) | null | undefined): void;
|
|
399
|
+
/**
|
|
400
|
+
* The window as a page-space rect, or `null` when it is unknown or the
|
|
401
|
+
* provider returned something unusable (it throws in some RN teardown
|
|
402
|
+
* paths, and a zero-size window would silently hide the entire screen).
|
|
403
|
+
*/
|
|
404
|
+
getViewportRect(): NativePageRect | null;
|
|
405
|
+
/**
|
|
406
|
+
* The region `element` must reach to count as on screen: the window,
|
|
407
|
+
* intersected with the measured frame of its declared `scrollAncestorId`.
|
|
408
|
+
*
|
|
409
|
+
* Returns `null` when neither bound is known — see {@link computeVisibility}
|
|
410
|
+
* for why that means "do not demote" rather than "nothing is visible".
|
|
411
|
+
* An ancestor that is not registered, or registered but not yet measured,
|
|
412
|
+
* contributes nothing rather than hiding its subtree.
|
|
413
|
+
*/
|
|
414
|
+
getClipRectFor(element: RegisteredNativeElement, viewport?: NativePageRect | null): NativePageRect | null;
|
|
187
415
|
/**
|
|
188
416
|
* Register/replace canonical enrichers (modal/toast/undo). HMR-safe — calling
|
|
189
417
|
* with a partial set merges into existing slots instead of clobbering them.
|
|
@@ -270,6 +498,51 @@ export declare class NativeUIBridgeRegistry {
|
|
|
270
498
|
* `registrationRoute` (app-wide registrations) are untouched.
|
|
271
499
|
*/
|
|
272
500
|
markRouteOffscreen(route: string): void;
|
|
501
|
+
/**
|
|
502
|
+
* Re-measure every mounted-visible element's geometry via its stored React
|
|
503
|
+
* ref and write the fresh coordinates into the registry ("measure-on-
|
|
504
|
+
* snapshot").
|
|
505
|
+
*
|
|
506
|
+
* Why: element geometry is otherwise captured ONCE at mount time
|
|
507
|
+
* (`onLayout` + `measureInWindow` in `useUIElement`) and RN never re-fires
|
|
508
|
+
* `onLayout` on pure translation — scrolling a virtualized list
|
|
509
|
+
* (FlashList), recycling a cell, a keyboard shift or an orientation change
|
|
510
|
+
* all move elements WITHOUT updating the stored `state.layout`. Snapshot
|
|
511
|
+
* consumers (vision analyzers hit-testing `bbox`, coord-based tap) then
|
|
512
|
+
* operate on stale positions. Re-measuring at READ time is correct
|
|
513
|
+
* regardless of what moved the element and needs zero per-consumer wiring:
|
|
514
|
+
* every registry entry already stores its ref (see `registerElement`).
|
|
515
|
+
*
|
|
516
|
+
* Per-element outcomes:
|
|
517
|
+
* - non-zero dims → write a fresh full layout (same state shape as the
|
|
518
|
+
* mount-time measure loop in `useUIElement`); counted as `measured`.
|
|
519
|
+
* - zero dims AND the element previously had a non-null `state.layout` →
|
|
520
|
+
* the view collapsed / left the screen; clear to
|
|
521
|
+
* `{ visible: false, layout: null }` (same shape `markRouteOffscreen`
|
|
522
|
+
* writes); counted as `cleared`.
|
|
523
|
+
* - zero dims and it never had a layout → leave state untouched (element
|
|
524
|
+
* in the mount→first-onLayout gap; don't demote `likely-visible`);
|
|
525
|
+
* counted as `skipped`.
|
|
526
|
+
* - no ref / no callable `measureInWindow` (test fixtures, web) → leave
|
|
527
|
+
* untouched; counted as `skipped`.
|
|
528
|
+
*
|
|
529
|
+
* The whole sweep races an overall timeout (default 250 ms) so a dead ref
|
|
530
|
+
* whose `measureInWindow` never calls back can never hang a snapshot: the
|
|
531
|
+
* returned promise resolves at the deadline with whatever counts have
|
|
532
|
+
* accumulated. Late callbacks may still write state afterwards — harmless,
|
|
533
|
+
* freshest data wins. Never throws.
|
|
534
|
+
*
|
|
535
|
+
* Non-React core module on purpose — `measureInWindow` is duck-typed off
|
|
536
|
+
* the stored ref rather than imported from `react-native` (see the
|
|
537
|
+
* `projectBbox` doc comment for why this file must not import RN).
|
|
538
|
+
*/
|
|
539
|
+
refreshMeasurements(options?: {
|
|
540
|
+
timeoutMs?: number;
|
|
541
|
+
}): Promise<{
|
|
542
|
+
measured: number;
|
|
543
|
+
cleared: number;
|
|
544
|
+
skipped: number;
|
|
545
|
+
}>;
|
|
273
546
|
/**
|
|
274
547
|
* Update element state
|
|
275
548
|
*/
|
|
@@ -336,6 +609,33 @@ export declare class NativeUIBridgeRegistry {
|
|
|
336
609
|
* Register a component
|
|
337
610
|
*/
|
|
338
611
|
registerComponent(id: string, options: RegisterComponentOptions): RegisteredNativeComponent;
|
|
612
|
+
/**
|
|
613
|
+
* Update a registered component's declaration in place — name, description,
|
|
614
|
+
* actions, elementIds.
|
|
615
|
+
*
|
|
616
|
+
* Sister to {@link updateElementMeta}, and it exists for the same reason one
|
|
617
|
+
* level up. `registerComponent` publishes the declaration exactly once, and
|
|
618
|
+
* `useUIComponent` registers on mount and never again, so an action whose
|
|
619
|
+
* `label` carries a count, an action that only exists while a row is
|
|
620
|
+
* selected, a `paramSchema` that widens once options load, or an `elementIds`
|
|
621
|
+
* list that grows after mount, all published their mount-time shape to
|
|
622
|
+
* `/control/components` forever. PR #176 closed that hole for an ELEMENT's
|
|
623
|
+
* label; this closes it for a COMPONENT's declaration.
|
|
624
|
+
*
|
|
625
|
+
* **Idempotent by VALUE over the PUBLISHED shape.** `handler` identity is
|
|
626
|
+
* excluded from the comparison — call sites pass inline closures that are
|
|
627
|
+
* freshly allocated every render, so including it would report a change on
|
|
628
|
+
* every call and make the door useless for a render-path publisher. The
|
|
629
|
+
* newest handlers are still STORED whenever `actions` is supplied, which is
|
|
630
|
+
* the other half of the same defect: without it the registry keeps the
|
|
631
|
+
* closure from the render that registered the component, so a handler reading
|
|
632
|
+
* component state read the state as it was at mount.
|
|
633
|
+
*
|
|
634
|
+
* Returns `true` when the published shape changed and an event was emitted,
|
|
635
|
+
* `false` otherwise — the same contract as `updateElementMeta`, so a caller
|
|
636
|
+
* can gate a warning or a state write on a real change.
|
|
637
|
+
*/
|
|
638
|
+
updateComponentMeta(id: string, meta: UpdateComponentMetaOptions): boolean;
|
|
339
639
|
/**
|
|
340
640
|
* Unregister a component
|
|
341
641
|
*/
|
|
@@ -385,10 +685,25 @@ export declare class NativeUIBridgeRegistry {
|
|
|
385
685
|
* server-level override (the bare-server / cloud-relay path) still get a
|
|
386
686
|
* populated `currentRoute` field as long as `setRouteProvider` was called
|
|
387
687
|
* on the registry.
|
|
688
|
+
*
|
|
689
|
+
* `activeTab` resolves through {@link resolveActiveTab} on BOTH branches. An
|
|
690
|
+
* explicit `routeInfo.activeTab` wins outright; otherwise a registered
|
|
691
|
+
* provider's `getActiveTab()` answers and the Expo Router derivation is the
|
|
692
|
+
* fallback. Deriving straight from `routeInfo.segments` here instead — which
|
|
693
|
+
* is what this branch did when `activeTab` was introduced — silently ignored
|
|
694
|
+
* `RouteProvider.getActiveTab` on the ONLY path that serves
|
|
695
|
+
* `control/snapshot` once `setRouteProvider` is wired (the server installs a
|
|
696
|
+
* `getSnapshot` override that passes `routeInfo`), so the opt-in hook for an
|
|
697
|
+
* app whose visible pane is decoupled from the router reached no consumer.
|
|
388
698
|
*/
|
|
389
699
|
createSnapshot(routeInfo?: {
|
|
390
700
|
currentRoute?: string | null;
|
|
391
701
|
segments?: string[];
|
|
702
|
+
/**
|
|
703
|
+
* Explicit active tab for callers that own the answer outright. Omit to
|
|
704
|
+
* let the registered `routeProvider` / the segment derivation resolve it.
|
|
705
|
+
*/
|
|
706
|
+
activeTab?: string | null;
|
|
392
707
|
}, options?: {
|
|
393
708
|
visibleOnly?: boolean;
|
|
394
709
|
currentRouteOnly?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAEjB,gBAAgB,EAChB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,QAAQ,EAER,eAAe,EACf,mBAAmB,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|