@qontinui/ui-bridge-native 0.1.6 → 0.2.1

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 (98) hide show
  1. package/dist/control/{action-executor.d.ts → index.d.mts} +14 -6
  2. package/dist/control/index.d.ts +95 -5
  3. package/dist/control/index.js +74 -11
  4. package/dist/control/index.js.map +1 -1
  5. package/dist/control/index.mjs +74 -11
  6. package/dist/control/index.mjs.map +1 -1
  7. package/dist/core/index.d.mts +46 -0
  8. package/dist/core/index.d.ts +43 -6
  9. package/dist/core/index.js +108 -2
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/index.mjs +108 -2
  12. package/dist/core/index.mjs.map +1 -1
  13. package/dist/debug/{inspector.d.ts → index.d.mts} +6 -3
  14. package/dist/debug/index.d.ts +44 -4
  15. package/dist/debug/index.js +2 -2
  16. package/dist/debug/index.js.map +1 -1
  17. package/dist/debug/index.mjs +2 -2
  18. package/dist/debug/index.mjs.map +1 -1
  19. package/dist/design/{design-inspector-native.d.ts → index.d.mts} +11 -7
  20. package/dist/design/index.d.ts +60 -5
  21. package/dist/{design/design-types.d.ts → design-types-BHr6Q1FX.d.mts} +11 -10
  22. package/dist/design-types-BHr6Q1FX.d.ts +205 -0
  23. package/dist/http-server-D2U1k48d.d.mts +703 -0
  24. package/dist/http-server-ck8clUsZ.d.ts +703 -0
  25. package/dist/index.d.mts +89 -0
  26. package/dist/index.d.ts +86 -28
  27. package/dist/index.js +754 -50
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +749 -51
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/react/{useAutoRegister.d.ts → index.d.mts} +15 -7
  32. package/dist/react/index.d.ts +69 -8
  33. package/dist/react/index.js +733 -50
  34. package/dist/react/index.js.map +1 -1
  35. package/dist/react/index.mjs +731 -51
  36. package/dist/react/index.mjs.map +1 -1
  37. package/dist/{core/registry.d.ts → registry-BxXaxmsT.d.ts} +51 -10
  38. package/dist/registry-KdUW_koV.d.mts +253 -0
  39. package/dist/server/index.d.mts +119 -0
  40. package/dist/server/index.d.ts +117 -13
  41. package/dist/server/index.js +272 -16
  42. package/dist/server/index.js.map +1 -1
  43. package/dist/server/index.mjs +272 -16
  44. package/dist/server/index.mjs.map +1 -1
  45. package/dist/{core/types.d.ts → types-BwdPNpII.d.mts} +172 -30
  46. package/dist/types-BwdPNpII.d.ts +525 -0
  47. package/dist/{control/types.d.ts → types-DCEv5qb6.d.ts} +36 -15
  48. package/dist/types-DjB0zJJH.d.mts +197 -0
  49. package/dist/useUIBridgeToast-BPIEbsEc.d.mts +726 -0
  50. package/dist/useUIBridgeToast-DD13oF3k.d.ts +726 -0
  51. package/package.json +2 -2
  52. package/dist/control/action-executor.d.ts.map +0 -1
  53. package/dist/control/index.d.ts.map +0 -1
  54. package/dist/control/types.d.ts.map +0 -1
  55. package/dist/core/element-identifier.d.ts +0 -41
  56. package/dist/core/element-identifier.d.ts.map +0 -1
  57. package/dist/core/index.d.ts.map +0 -1
  58. package/dist/core/registry.d.ts.map +0 -1
  59. package/dist/core/types.d.ts.map +0 -1
  60. package/dist/debug/index.d.ts.map +0 -1
  61. package/dist/debug/inspector.d.ts.map +0 -1
  62. package/dist/design/design-inspector-native.d.ts.map +0 -1
  63. package/dist/design/design-types.d.ts.map +0 -1
  64. package/dist/design/index.d.ts.map +0 -1
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/react/UIBridgeNativeProvider.d.ts +0 -147
  67. package/dist/react/UIBridgeNativeProvider.d.ts.map +0 -1
  68. package/dist/react/index.d.ts.map +0 -1
  69. package/dist/react/useAutoRegister.d.ts.map +0 -1
  70. package/dist/react/useUIBridge.d.ts +0 -103
  71. package/dist/react/useUIBridge.d.ts.map +0 -1
  72. package/dist/react/useUIComponent.d.ts +0 -112
  73. package/dist/react/useUIComponent.d.ts.map +0 -1
  74. package/dist/react/useUIElement.d.ts +0 -162
  75. package/dist/react/useUIElement.d.ts.map +0 -1
  76. package/dist/server/design-handlers.d.ts +0 -47
  77. package/dist/server/design-handlers.d.ts.map +0 -1
  78. package/dist/server/handlers.d.ts +0 -20
  79. package/dist/server/handlers.d.ts.map +0 -1
  80. package/dist/server/http-server.d.ts +0 -247
  81. package/dist/server/http-server.d.ts.map +0 -1
  82. package/dist/server/index.d.ts.map +0 -1
  83. package/dist/server/types.d.ts +0 -200
  84. package/dist/server/types.d.ts.map +0 -1
  85. package/dist/server/ws-connection.d.ts +0 -48
  86. package/dist/server/ws-connection.d.ts.map +0 -1
  87. package/dist/server/ws-event-bridge.d.ts +0 -113
  88. package/dist/server/ws-event-bridge.d.ts.map +0 -1
  89. package/dist/server/ws-protocol.d.ts +0 -48
  90. package/dist/server/ws-protocol.d.ts.map +0 -1
  91. package/dist/server/ws-types.d.ts +0 -65
  92. package/dist/server/ws-types.d.ts.map +0 -1
  93. package/dist/transport/CloudRelayClient.d.ts +0 -51
  94. package/dist/transport/CloudRelayClient.d.ts.map +0 -1
  95. package/dist/transport/DeviceAnnouncer.d.ts +0 -75
  96. package/dist/transport/DeviceAnnouncer.d.ts.map +0 -1
  97. package/dist/transport/index.d.ts +0 -3
  98. package/dist/transport/index.d.ts.map +0 -1
@@ -5,7 +5,7 @@
5
5
  * Adapted from ui-bridge for React Native environments.
6
6
  */
7
7
  type AnyNativeElement = any;
8
- export interface WaitOptions {
8
+ interface WaitOptions {
9
9
  /** Wait for element to be visible */
10
10
  visible?: boolean;
11
11
  /** Wait for element to be enabled */
@@ -19,22 +19,22 @@ export interface WaitOptions {
19
19
  /** Polling interval in milliseconds */
20
20
  interval?: number;
21
21
  }
22
- export type ActionHandler<TParams = unknown, TResult = unknown> = (params?: TParams) => TResult | Promise<TResult>;
23
- export interface CustomAction<TParams = unknown, TResult = unknown> {
22
+ type ActionHandler<TParams = unknown, TResult = unknown> = (params?: TParams) => TResult | Promise<TResult>;
23
+ interface CustomAction<TParams = unknown, TResult = unknown> {
24
24
  id: string;
25
25
  label?: string;
26
26
  description?: string;
27
27
  handler: ActionHandler<TParams, TResult>;
28
28
  }
29
- export interface ComponentAction<TParams = unknown, TResult = unknown> {
29
+ interface ComponentAction<TParams = unknown, TResult = unknown> {
30
30
  id: string;
31
31
  label?: string;
32
32
  description?: string;
33
33
  paramSchema?: Record<string, unknown>;
34
34
  handler: ActionHandler<TParams, TResult>;
35
35
  }
36
- export type WorkflowStepType = 'element-action' | 'component-action' | 'wait' | 'assert' | 'navigate' | 'branch' | 'loop' | 'extract' | 'log' | 'custom';
37
- export interface WorkflowStep {
36
+ type WorkflowStepType = 'element-action' | 'component-action' | 'wait' | 'assert' | 'navigate' | 'branch' | 'loop' | 'extract' | 'log' | 'custom';
37
+ interface WorkflowStep {
38
38
  id: string;
39
39
  type: WorkflowStepType;
40
40
  target?: string;
@@ -43,29 +43,29 @@ export interface WorkflowStep {
43
43
  waitOptions?: WaitOptions;
44
44
  handler?: () => unknown | Promise<unknown>;
45
45
  }
46
- export interface Workflow {
46
+ interface Workflow {
47
47
  id: string;
48
48
  name: string;
49
49
  description?: string;
50
50
  steps: WorkflowStep[];
51
51
  defaultParams?: Record<string, unknown>;
52
52
  }
53
- export type BridgeEventType = 'element:registered' | 'element:unregistered' | 'element:stateChanged' | 'component:registered' | 'component:unregistered' | 'action:started' | 'action:completed' | 'action:failed' | 'workflow:started' | 'workflow:stepCompleted' | 'workflow:completed' | 'workflow:failed' | 'render:snapshot' | 'error';
54
- export interface BridgeEvent<T = unknown> {
53
+ type BridgeEventType = 'element:registered' | 'element:unregistered' | 'element:stateChanged' | 'component:registered' | 'component:unregistered' | 'action:started' | 'action:completed' | 'action:failed' | 'workflow:started' | 'workflow:stepCompleted' | 'workflow:completed' | 'workflow:failed' | 'render:snapshot' | 'error';
54
+ interface BridgeEvent<T = unknown> {
55
55
  type: BridgeEventType;
56
56
  timestamp: number;
57
57
  data: T;
58
58
  }
59
- export type BridgeEventListener<T = unknown> = (event: BridgeEvent<T>) => void;
59
+ type BridgeEventListener<T = unknown> = (event: BridgeEvent<T>) => void;
60
60
  /**
61
61
  * React Native element reference type.
62
62
  * Uses a generic type to avoid conflicts between different react-native versions.
63
63
  */
64
- export type NativeElementRef = AnyNativeElement | null;
64
+ type NativeElementRef = AnyNativeElement | null;
65
65
  /**
66
66
  * Element identification for React Native (replaces XPath/CSS selectors)
67
67
  */
68
- export interface NativeElementIdentifier {
68
+ interface NativeElementIdentifier {
69
69
  /** Explicit UI Bridge identifier */
70
70
  uiId?: string;
71
71
  /** React Native testID prop */
@@ -82,7 +82,7 @@ export interface NativeElementIdentifier {
82
82
  /**
83
83
  * Layout information from onLayout callback
84
84
  */
85
- export interface NativeLayout {
85
+ interface NativeLayout {
86
86
  /** X position relative to parent */
87
87
  x: number;
88
88
  /** Y position relative to parent */
@@ -99,7 +99,7 @@ export interface NativeLayout {
99
99
  /**
100
100
  * Current state of a native UI element
101
101
  */
102
- export interface NativeElementState {
102
+ interface NativeElementState {
103
103
  /** Whether the element is mounted in the tree */
104
104
  mounted: boolean;
105
105
  /** Whether the element is visible on screen */
@@ -130,15 +130,15 @@ export interface NativeElementState {
130
130
  /**
131
131
  * Types of native UI elements that can be registered
132
132
  */
133
- export type NativeElementType = 'button' | 'input' | 'text' | 'view' | 'scroll' | 'list' | 'listItem' | 'switch' | 'checkbox' | 'radio' | 'image' | 'touchable' | 'pressable' | 'modal' | 'custom';
133
+ type NativeElementType = 'button' | 'input' | 'text' | 'view' | 'scroll' | 'list' | 'listItem' | 'switch' | 'checkbox' | 'radio' | 'image' | 'touchable' | 'pressable' | 'modal' | 'custom';
134
134
  /**
135
135
  * Standard actions available on native elements
136
136
  */
137
- export type NativeStandardAction = 'press' | 'click' | 'longPress' | 'doubleTap' | 'type' | 'clear' | 'focus' | 'blur' | 'scroll' | 'swipe' | 'toggle';
137
+ type NativeStandardAction = 'press' | 'click' | 'longPress' | 'doubleTap' | 'type' | 'clear' | 'focus' | 'blur' | 'scroll' | 'swipe' | 'toggle';
138
138
  /**
139
139
  * Custom action definition for native elements
140
140
  */
141
- export interface NativeCustomAction<TParams = unknown, TResult = unknown> {
141
+ interface NativeCustomAction<TParams = unknown, TResult = unknown> {
142
142
  /** Action identifier */
143
143
  id: string;
144
144
  /** Human-readable label */
@@ -151,7 +151,7 @@ export interface NativeCustomAction<TParams = unknown, TResult = unknown> {
151
151
  /**
152
152
  * A native UI element registered with the bridge
153
153
  */
154
- export interface RegisteredNativeElement {
154
+ interface RegisteredNativeElement {
155
155
  /** Unique identifier for this element */
156
156
  id: string;
157
157
  /** Reference to the native element */
@@ -188,7 +188,7 @@ export interface RegisteredNativeElement {
188
188
  /**
189
189
  * Component action definition for native components
190
190
  */
191
- export interface NativeComponentAction<TParams = unknown, TResult = unknown> {
191
+ interface NativeComponentAction<TParams = unknown, TResult = unknown> {
192
192
  /** Action identifier */
193
193
  id: string;
194
194
  /** Human-readable label */
@@ -203,7 +203,7 @@ export interface NativeComponentAction<TParams = unknown, TResult = unknown> {
203
203
  /**
204
204
  * A native component registered with the bridge (higher-level than elements)
205
205
  */
206
- export interface RegisteredNativeComponent {
206
+ interface RegisteredNativeComponent {
207
207
  /** Unique identifier for this component */
208
208
  id: string;
209
209
  /** Human-readable name */
@@ -222,7 +222,7 @@ export interface RegisteredNativeComponent {
222
222
  /**
223
223
  * Action request for native elements
224
224
  */
225
- export interface NativeActionRequest {
225
+ interface NativeActionRequest {
226
226
  /** Action to execute */
227
227
  action: NativeStandardAction | string;
228
228
  /** Action parameters */
@@ -247,7 +247,7 @@ export interface NativeActionRequest {
247
247
  /**
248
248
  * Response from a native action execution
249
249
  */
250
- export interface NativeActionResponse {
250
+ interface NativeActionResponse {
251
251
  /** Whether the action succeeded */
252
252
  success: boolean;
253
253
  /** Element state after the action */
@@ -267,10 +267,28 @@ export interface NativeActionResponse {
267
267
  /** Time spent waiting for conditions */
268
268
  waitDurationMs?: number;
269
269
  }
270
+ /**
271
+ * Registration coverage metadata. Lets automation agents detect routes that
272
+ * have interactive controls but never registered any of them with the bridge,
273
+ * without having to read source code.
274
+ *
275
+ * - `totalRegistered`: number of elements currently in the registry.
276
+ * - `everHadRegistrations`: sticks `true` once any element is registered, even
277
+ * after every element has been unregistered. A route that registered then
278
+ * unmounted should NOT be reported as "never wired".
279
+ * - `byRoute`: count of currently-registered elements grouped by
280
+ * `registrationRoute`. Elements registered without a route are bucketed
281
+ * under `'?'`, which is itself a useful diagnostic signal.
282
+ */
283
+ interface NativeRegistrationCoverage {
284
+ totalRegistered: number;
285
+ everHadRegistrations: boolean;
286
+ byRoute: Record<string, number>;
287
+ }
270
288
  /**
271
289
  * Snapshot of the entire native UI bridge state
272
290
  */
273
- export interface NativeBridgeSnapshot {
291
+ interface NativeBridgeSnapshot {
274
292
  /** Timestamp of the snapshot */
275
293
  timestamp: number;
276
294
  /** All registered elements */
@@ -306,20 +324,144 @@ export interface NativeBridgeSnapshot {
306
324
  currentRoute?: string | null;
307
325
  /** Current route segments (if a RouteProvider is configured) */
308
326
  segments?: string[];
327
+ /** Modal/sheet/drawer context (populated when a modalDetector enricher is registered) */
328
+ modalStack?: NativeSnapshotModalContext;
329
+ /** Toast/snackbar context (populated when a toastCapture enricher is registered) */
330
+ toasts?: NativeSnapshotToastContext;
331
+ /** Undo/redo context (populated when an undoTracker enricher is registered) */
332
+ undoRedo?: NativeSnapshotUndoContext;
333
+ /**
334
+ * Registration coverage metadata so agents can detect routes that have
335
+ * interactive controls but did not register them with the bridge.
336
+ */
337
+ registration?: NativeRegistrationCoverage;
338
+ }
339
+ /** A single detected modal-like surface (modal, sheet, drawer, popover, alert) */
340
+ interface NativeModalInfo {
341
+ id: string;
342
+ title?: string;
343
+ type: 'modal' | 'sheet' | 'drawer' | 'popover' | 'alertdialog' | 'dialog';
344
+ /** Whether the modal blocks interaction with the underlying UI */
345
+ blocking: boolean;
346
+ /** Whether it can be dismissed by the user (backdrop tap, swipe, esc, etc.) */
347
+ dismissible: boolean;
348
+ detectedAt: number;
349
+ }
350
+ /**
351
+ * Modal context attached to a snapshot. Field names match the web SDK's
352
+ * `SnapshotModalContext` so external agents can write transport-agnostic checks
353
+ * like `snapshot.modalStack?.hasBlockingModal`.
354
+ */
355
+ interface NativeSnapshotModalContext {
356
+ modals: NativeModalInfo[];
357
+ topModal?: NativeModalInfo;
358
+ hasBlockingModal: boolean;
359
+ count: number;
360
+ }
361
+ /** A captured toast/snackbar */
362
+ interface NativeCapturedToast {
363
+ id: string;
364
+ message: string;
365
+ level: 'info' | 'success' | 'warning' | 'error' | 'loading' | 'unknown';
366
+ appearedAt: number;
367
+ dismissedAt?: number;
368
+ visible: boolean;
369
+ /** Total duration in ms (lifetime so far if still visible, total if dismissed) */
370
+ durationMs: number;
371
+ }
372
+ /** Toast context attached to a snapshot */
373
+ interface NativeSnapshotToastContext {
374
+ /** Toasts currently on screen */
375
+ active: NativeCapturedToast[];
376
+ /** Recently-dismissed toasts retained by the capture buffer (most recent first) */
377
+ recent: NativeCapturedToast[];
378
+ /** Total number of toasts ever captured by this tracker */
379
+ totalCaptured: number;
309
380
  }
381
+ /**
382
+ * Undo/redo context attached to a snapshot. Mirrors the web SDK's
383
+ * `SnapshotUndoContext` minus DOM-only fields — RN has no `document.execCommand`
384
+ * or selectors, so the native variant relies entirely on developer declaration.
385
+ */
386
+ interface NativeSnapshotUndoContext {
387
+ /** Whether undo appears to be available */
388
+ canUndo: boolean;
389
+ /** Whether redo appears to be available */
390
+ canRedo: boolean;
391
+ /** Description of what undo would reverse */
392
+ undoDescription?: string;
393
+ /** Description of what redo would restore */
394
+ redoDescription?: string;
395
+ /** Undo stack depth (if known) */
396
+ undoDepth?: number;
397
+ /** Redo stack depth (if known) */
398
+ redoDepth?: number;
399
+ /** Human-readable summary for AI */
400
+ summary: string;
401
+ }
402
+ /**
403
+ * Modal-stack tracker contract. Surfaced in NativeSnapshotEnrichers so the
404
+ * test-hook HTTP endpoints (`control/modal/push`, `control/modal/dismiss/:id`)
405
+ * can drive the same instance the snapshot reads from. Any duck-typed
406
+ * implementation that satisfies this shape can fill the slot — production
407
+ * uses the `ModalDetector` class.
408
+ */
409
+ interface NativeModalDetectorLike {
410
+ getSnapshotModalContext(): NativeSnapshotModalContext;
411
+ pushModal(modal: {
412
+ id: string;
413
+ title?: string;
414
+ type?: NativeModalInfo['type'];
415
+ blocking?: boolean;
416
+ dismissible?: boolean;
417
+ }): void;
418
+ dismissModal(id: string): boolean | void;
419
+ getActive(): NativeModalInfo[];
420
+ }
421
+ /**
422
+ * Canonical enricher slot. Each tracker exposes a `getSnapshot*Context()` method
423
+ * that the registry calls during `createSnapshot`. NavigationTracker is intentionally
424
+ * NOT here — route info already flows through `currentRoute` / `segments`.
425
+ */
426
+ interface NativeSnapshotEnrichers {
427
+ modalDetector?: NativeModalDetectorLike;
428
+ toastCapture?: {
429
+ getSnapshotToastContext(): NativeSnapshotToastContext;
430
+ };
431
+ undoTracker?: {
432
+ getSnapshotUndoContext(): NativeSnapshotUndoContext;
433
+ };
434
+ }
435
+ /**
436
+ * Pluggable snapshot enricher: receives base context and returns extra fields
437
+ * that get `Object.assign`ed onto the snapshot. Used for ad-hoc/custom trackers
438
+ * (e.g. runner sidebar tabs) without growing the canonical enricher set.
439
+ */
440
+ type NativeSnapshotEnricher = (ctx: {
441
+ elements: RegisteredNativeElement[];
442
+ currentRoute: string | null;
443
+ }) => Record<string, unknown>;
310
444
  /**
311
445
  * UI Bridge Native feature flags
312
446
  */
313
- export interface NativeUIBridgeFeatures {
447
+ interface NativeUIBridgeFeatures {
314
448
  /** Enable HTTP control server */
315
449
  server?: boolean;
316
450
  /** Enable debug tools (inspector overlay) */
317
451
  debug?: boolean;
452
+ /**
453
+ * Enable test-only HTTP endpoints that let external runners drive
454
+ * registry-internal state (currently `control/modal/push` and
455
+ * `control/modal/dismiss/:id`). Default `false` so production builds
456
+ * cannot have their modal stack manipulated remotely; set to `true`
457
+ * (typically gated on `__DEV__`) when running automated tests.
458
+ */
459
+ testHooks?: boolean;
318
460
  }
319
461
  /**
320
462
  * UI Bridge Native configuration
321
463
  */
322
- export interface NativeUIBridgeConfig {
464
+ interface NativeUIBridgeConfig {
323
465
  /** Port for HTTP server */
324
466
  serverPort?: number;
325
467
  /** Enable verbose logging */
@@ -337,7 +479,7 @@ export interface NativeUIBridgeConfig {
337
479
  /**
338
480
  * Find request for discovering native elements
339
481
  */
340
- export interface NativeFindRequest {
482
+ interface NativeFindRequest {
341
483
  /** Filter by element type */
342
484
  types?: NativeElementType[];
343
485
  /** Filter by testID pattern (supports wildcards) */
@@ -352,7 +494,7 @@ export interface NativeFindRequest {
352
494
  /**
353
495
  * Discovered native element
354
496
  */
355
- export interface DiscoveredNativeElement {
497
+ interface DiscoveredNativeElement {
356
498
  /** Element ID */
357
499
  id: string;
358
500
  /** Element type */
@@ -369,7 +511,7 @@ export interface DiscoveredNativeElement {
369
511
  /**
370
512
  * Find response
371
513
  */
372
- export interface NativeFindResponse {
514
+ interface NativeFindResponse {
373
515
  /** Discovered elements */
374
516
  elements: DiscoveredNativeElement[];
375
517
  /** Total count */
@@ -379,5 +521,5 @@ export interface NativeFindResponse {
379
521
  /** Timestamp */
380
522
  timestamp: number;
381
523
  }
382
- export {};
383
- //# sourceMappingURL=types.d.ts.map
524
+
525
+ export type { ActionHandler as A, BridgeEvent as B, ComponentAction as C, DiscoveredNativeElement as D, Workflow as E, WorkflowStep as F, WorkflowStepType as G, NativeModalDetectorLike as H, NativeActionRequest as N, RegisteredNativeComponent as R, WaitOptions as W, BridgeEventListener as a, BridgeEventType as b, CustomAction as c, NativeActionResponse as d, NativeBridgeSnapshot as e, NativeCapturedToast as f, NativeComponentAction as g, NativeCustomAction as h, NativeElementIdentifier as i, NativeElementRef as j, NativeElementState as k, NativeElementType as l, NativeFindRequest as m, NativeFindResponse as n, NativeLayout as o, NativeModalInfo as p, NativeRegistrationCoverage as q, NativeSnapshotEnricher as r, NativeSnapshotEnrichers as s, NativeSnapshotModalContext as t, NativeSnapshotToastContext as u, NativeSnapshotUndoContext as v, NativeStandardAction as w, NativeUIBridgeConfig as x, NativeUIBridgeFeatures as y, RegisteredNativeElement as z };