@symbiote-native/angular 3.0.2 → 3.1.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 (56) hide show
  1. package/README.md +91 -30
  2. package/build/angular/callback-host.d.ts +2 -5
  3. package/build/angular/callback-host.js +11 -36
  4. package/build/angular/callback-host.js.map +1 -1
  5. package/build/angular/change-detection-flush.d.ts +1 -0
  6. package/build/angular/change-detection-flush.js +58 -14
  7. package/build/angular/change-detection-flush.js.map +1 -1
  8. package/build/angular/components/flat-list/index.d.ts +4 -2
  9. package/build/angular/components/flat-list/index.js +28 -78
  10. package/build/angular/components/flat-list/index.js.map +1 -1
  11. package/build/angular/components/image-shared.d.ts +8 -2
  12. package/build/angular/components/modal/index.d.ts +1 -0
  13. package/build/angular/components/modal/index.js +23 -16
  14. package/build/angular/components/modal/index.js.map +1 -1
  15. package/build/angular/components/section-list/index.d.ts +3 -1
  16. package/build/angular/components/section-list/index.js +10 -2
  17. package/build/angular/components/section-list/index.js.map +1 -1
  18. package/build/angular/components/virtualized-list/directives.js +7 -4
  19. package/build/angular/components/virtualized-list/directives.js.map +1 -1
  20. package/build/angular/components/virtualized-list/index.d.ts +10 -2
  21. package/build/angular/components/virtualized-list/index.js +45 -25
  22. package/build/angular/components/virtualized-list/index.js.map +1 -1
  23. package/build/angular/components/virtualized-section-list/index.d.ts +5 -1
  24. package/build/angular/components/virtualized-section-list/index.js +10 -2
  25. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  26. package/build/angular/element-props.d.ts +16 -5
  27. package/build/angular/elements.d.ts +5 -21
  28. package/build/angular/elements.js +18 -26
  29. package/build/angular/elements.js.map +1 -1
  30. package/build/angular/index.d.ts +0 -1
  31. package/build/angular/index.js +5 -7
  32. package/build/angular/index.js.map +1 -1
  33. package/build/angular/renderer/index.d.ts +11 -0
  34. package/build/angular/renderer/index.js +97 -12
  35. package/build/angular/renderer/index.js.map +1 -1
  36. package/build/angular/runtime-matching.d.ts +0 -1
  37. package/build/angular/runtime-matching.js +6 -29
  38. package/build/angular/runtime-matching.js.map +1 -1
  39. package/package.json +6 -6
  40. package/src/callback-host.ts +10 -43
  41. package/src/change-detection-flush.ts +67 -14
  42. package/src/components/flat-list/index.ts +22 -54
  43. package/src/components/modal/index.ts +22 -16
  44. package/src/components/section-list/index.ts +4 -1
  45. package/src/components/virtualized-list/directives.ts +10 -8
  46. package/src/components/virtualized-list/index.ts +38 -13
  47. package/src/components/virtualized-section-list/index.ts +6 -1
  48. package/src/element-props.ts +22 -13
  49. package/src/elements.ts +21 -56
  50. package/src/index.ts +5 -7
  51. package/src/renderer/index.ts +107 -11
  52. package/src/runtime-matching.ts +6 -30
  53. package/build/angular/style-host.d.ts +0 -11
  54. package/build/angular/style-host.js +0 -86
  55. package/build/angular/style-host.js.map +0 -1
  56. package/src/style-host.ts +0 -94
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @symbiote-native/angular
2
2
 
3
3
  The **Angular adapter** for [SymbioteNative](../../README.md) — render real native iOS/Android views
4
- from Angular, on the _same_ untouched core as React and Vue, with React Native's own renderer
4
+ from Angular, on the _same_ untouched core as React, Vue, Svelte, and Solid, with React Native's own renderer
5
5
  never in the path. It is a `Renderer2`/`RendererFactory2` whose calls map onto the engine's
6
6
  four-call mutation API; `@symbiote-native/engine` does the clone-on-write commit into Fabric.
7
7
 
@@ -22,57 +22,57 @@ already-validated engine with zero changes to it.
22
22
  ## Install
23
23
 
24
24
  ```bash
25
- npm install @symbiote-native/angular react-native @angular/core
25
+ npx @symbiote-native/cli new my-app --framework angular
26
26
  ```
27
27
 
28
- `react-native` and `@angular/core` (**>=20**, for stable zoneless change detection) stay your app's
29
- own top-level dependencies. `npx @symbiote-native/cli new` wires the AOT pipeline (`ngc --watch`
30
- alongside Metro — see [Run it](#run-it)) and the Metro config for a new app; wiring them into an
31
- existing one still follows [`examples/angular`](../../examples/angular) rather than a generator.
28
+ One command, nothing to wire by hand: this adapter needs the most build wiring of the five (the
29
+ AOT pipeline, `ngc --watch` alongside Metro, the static-block Babel plugin below) — the generator
30
+ sets up all of it, plus `@symbiote-native/angular`/`react-native`/`@angular/core`/`@angular/forms`
31
+ as your app's own dependencies.
32
32
 
33
- ---
33
+ <details>
34
+ <summary>Manual install (no generator — an existing app, or you want to wire it yourself)</summary>
34
35
 
35
- ## Use it
36
+ ```bash
37
+ npm install @symbiote-native/angular react-native @angular/core @angular/forms
38
+ ```
36
39
 
37
- The native entry reaches the _same_ `registerRunnable` seam as React and Vue — only the adapter
38
- changes. It hands the surface's `rootTag` to `mount` from `@symbiote-native/angular`, which drives the
39
- engine through Angular's `Renderer2`:
40
+ `react-native`, `@angular/core`, and `@angular/forms` (all **>=20**, for stable zoneless change
41
+ detection) stay your app's own top-level dependencies. `@angular/forms` is a real peer, not
42
+ boilerplate — `text-input`'s `NG_VALUE_ACCESSOR` registration (for `ngModel`/`formControl*`
43
+ binding) imports `ControlValueAccessor` from it. Follow [`examples/angular`](../../examples/angular)
44
+ for the AOT pipeline (`ngc --watch` alongside Metro — see [Run it](#run-it)) and the Metro config;
45
+ there is no wiring script for an existing app.
40
46
 
41
- ```js
42
- // index.js
43
- import { AppRegistry as RNAppRegistry } from 'react-native';
44
- import { mount } from '@symbiote-native/angular';
45
- import { AppComponent } from './App';
46
- import { name as appName } from './app.json';
47
+ </details>
47
48
 
48
- // registerRunnable (not registerComponent): RN stores a raw mount callback and never renders
49
- // it with its own renderer. We mount the Angular app onto the surface's rootTag.
50
- RNAppRegistry.registerRunnable(appName, ({ rootTag }) => {
51
- mount(rootTag, AppComponent);
52
- });
53
- ```
49
+ ---
50
+
51
+ ## Use it
54
52
 
55
53
  The app is ordinary standalone Angular. The native primitives are lowercase intrinsic tags, same as
56
54
  every other adapter — Angular still needs them declared in the component's `imports:` array (an
57
55
  Angular "element directive" is what makes `ngtsc` accept the tag with typed props), so
58
56
  `SYMBIOTE_ELEMENTS` from `@symbiote-native/angular` covers the whole primitive surface in one import.
59
- A tap→increment counter:
57
+ Styling is a CSS class against a plain `.css` file — the convention every example app here
58
+ follows. A tap→increment counter:
60
59
 
61
60
  ```ts
62
61
  import { Component, signal } from '@angular/core';
63
62
  import { SYMBIOTE_ELEMENTS } from '@symbiote-native/angular';
63
+ import './App.css';
64
64
 
65
65
  @Component({
66
66
  selector: 'app-root',
67
67
  standalone: true,
68
68
  imports: [SYMBIOTE_ELEMENTS],
69
69
  template: `
70
- <view [style]="{ padding: 24 }">
70
+ <safe-area-view class="screen">
71
71
  <text>Taps: {{ count() }}</text>
72
72
  <pressable (press)="count.set(count() + 1)">
73
73
  <text>Tap me</text>
74
74
  </pressable>
75
- </view>
75
+ </safe-area-view>
76
76
  `,
77
77
  })
78
78
  export class AppComponent {
@@ -80,6 +80,57 @@ export class AppComponent {
80
80
  }
81
81
  ```
82
82
 
83
+ ```css
84
+ /* App.css */
85
+ .screen {
86
+ flex: 1;
87
+ align-items: center;
88
+ justify-content: center;
89
+ padding: 24px;
90
+ }
91
+ ```
92
+
93
+ <details>
94
+ <summary>Native entry point (index.js) — already scaffolded by <code>npx @symbiote-native/cli new --framework angular</code></summary>
95
+
96
+ The zero-config entry mirrors real Angular's own `bootstrapApplication(RootComponent, config)`
97
+ idiom and wires the same RN-backed host seams the other adapters' entries do — this is what
98
+ [`examples/angular`](../../examples/angular) actually uses:
99
+
100
+ ```js
101
+ // index.js
102
+
103
+ // Registers host behaviors (Image, Pressable, Switch, ...) that /bootstrap alone doesn't
104
+ // reach; deleting this breaks them silently (Metro's production inlineRequires makes a
105
+ // side-effect-only barrel import go lazy, see register.ts).
106
+ import '@symbiote-native/angular';
107
+ import { bootstrapApplication } from '@symbiote-native/angular/bootstrap';
108
+ import { AppComponent } from './App';
109
+ import { name as appName } from './app.json';
110
+
111
+ bootstrapApplication(AppComponent, { appName });
112
+ ```
113
+
114
+ For anything the defaults don't cover, drive the lower-level seam directly — the same
115
+ `registerRunnable` seam React and Vue use, with `mount` from `@symbiote-native/angular` driving the
116
+ engine through Angular's `Renderer2`:
117
+
118
+ ```js
119
+ // index.js
120
+ import { AppRegistry as RNAppRegistry } from 'react-native';
121
+ import { mount } from '@symbiote-native/angular';
122
+ import { AppComponent } from './App';
123
+ import { name as appName } from './app.json';
124
+
125
+ // registerRunnable (not registerComponent): RN stores a raw mount callback and never renders
126
+ // it with its own renderer. We mount the Angular app onto the surface's rootTag.
127
+ RNAppRegistry.registerRunnable(appName, ({ rootTag }) => {
128
+ mount(rootTag, AppComponent);
129
+ });
130
+ ```
131
+
132
+ </details>
133
+
83
134
  The full canary is [`examples/angular`](../../examples/angular) — a stock RN 0.86 app whose
84
135
  [`App.ts`](../../examples/angular/src/App.ts) exercises the same surface as the React and Vue
85
136
  reference canaries, standalone components, zoneless change detection.
@@ -89,8 +140,8 @@ reference canaries, standalone components, zoneless change detection.
89
140
  ## Parity — and the one gap
90
141
 
91
142
  Angular reaches the same 21+ primitives, runtime modules, `Animated` on both drivers, gestures,
92
- accessibility, and the `VirtualizedList` family as React and Vue, verified on-device on iOS and
93
- Android. That parity is **structural, not
143
+ accessibility, and the `VirtualizedList` family as React, Vue, Svelte, and Solid, verified
144
+ on-device on iOS and Android. That parity is **structural, not
94
145
  hand-copied**: the component logic (state machines + render functions) is written **once** in
95
146
  `@symbiote-native/components`, and Angular supplies only its lifecycle (`Renderer2` + zoneless change
96
147
  detection + the descriptor→`createElement` bridge).
@@ -122,13 +173,23 @@ Angular also requires **zoneless change detection** (`provideZonelessChangeDetec
122
173
  `@angular/core >=20`) — zone.js fights Hermes, and versions before 20 don't offer a stable
123
174
  zoneless API. This is the version floor for the whole adapter, not a suggestion.
124
175
 
176
+ `babel.config.js` needs `@babel/plugin-transform-class-static-block`, listed **first**, before
177
+ `@symbiote-native/angular`'s own `babel-register-composed` and linker plugins. `ngc` emits static
178
+ blocks (`tsconfig.angular.base.json`'s `useDefineForClassFields: false` at ES2022 lowers a static
179
+ property initializer to one), and RN's preset doesn't enable that transform — the class-features
180
+ plugin then refuses the class outright. This only surfaces in a **Release** build (where that
181
+ transform actually runs) and is invisible to every headless check, so a hand-wired app missing it
182
+ builds and tests clean right up until the first release build. `npx @symbiote-native/cli new
183
+ --framework angular` already includes it; wiring Angular into an existing app by hand needs it
184
+ copied from [`examples/angular`](../../examples/angular)'s own `babel.config.js`.
185
+
125
186
  ---
126
187
 
127
188
  ## Run it
128
189
 
129
190
  [`examples/angular`](../../examples/angular) is a stock React Native 0.86 app. Requires Node ≥
130
- 22.13 and the [RN environment setup](https://reactnative.dev/docs/set-up-your-environment) (Xcode,
131
- CocoaPods):
191
+ 22.13 (react-native 0.86's own `package.json#engines`) and the [RN environment
192
+ setup](https://reactnative.dev/docs/set-up-your-environment) (Xcode, CocoaPods):
132
193
 
133
194
  ```bash
134
195
  cd examples/angular
@@ -1,4 +1,4 @@
1
- import { type OnChanges, type OnDestroy, type SimpleChanges } from '@angular/core';
1
+ import { type OnChanges, type SimpleChanges } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  /**
4
4
  * THE SAME NAMES AS A LITERAL, and the duplication is forced rather than chosen.
@@ -13,13 +13,10 @@ import * as i0 from "@angular/core";
13
13
  export declare const CALLBACK_ATTRIBUTE_SELECTOR: string;
14
14
  /** Exported for the guard alone — the decorator below must spell its own list for ngtsc. */
15
15
  export declare const CALLBACK_INPUT_NAMES: readonly string[];
16
- export declare class SymbioteCallbackHost implements OnChanges, OnDestroy {
16
+ export declare class SymbioteCallbackHost implements OnChanges {
17
17
  private readonly renderer;
18
18
  private readonly host;
19
- private readonly detector;
20
- constructor();
21
19
  ngOnChanges(changes: SimpleChanges): void;
22
- ngOnDestroy(): void;
23
20
  static ɵfac: i0.ɵɵFactoryDeclaration<SymbioteCallbackHost, never>;
24
21
  static ɵdir: i0.ɵɵDirectiveDeclaration<SymbioteCallbackHost, "[onAccessibilityAction],[onAccessibilityEscape],[onAccessibilityTap],[onBlur],[onContentSizeChange],[onEndEditing],[onError],[onFocus],[onHoverIn],[onHoverOut],[onKeyPress],[onLayout],[onLoad],[onLoadEnd],[onLoadStart],[onLongPress],[onMagicTap],[onMomentumScrollBegin],[onMomentumScrollEnd],[onMoveShouldSetResponder],[onMoveShouldSetResponderCapture],[onPartialLoad],[onPress],[onPressIn],[onPressMove],[onPressOut],[onProgress],[onRefresh],[onResponderEnd],[onResponderGrant],[onResponderMove],[onResponderReject],[onResponderRelease],[onResponderStart],[onResponderTerminate],[onResponderTerminationRequest],[onScrollBeginDrag],[onScrollEndDrag],[onScrollToTop],[onSelectionChange],[onStartShouldSetResponder],[onStartShouldSetResponderCapture],[onSubmitEditing],[onValueChange]", never, { "onAccessibilityAction": { "alias": "onAccessibilityAction"; "required": false; }; "onAccessibilityEscape": { "alias": "onAccessibilityEscape"; "required": false; }; "onAccessibilityTap": { "alias": "onAccessibilityTap"; "required": false; }; "onBlur": { "alias": "onBlur"; "required": false; }; "onContentSizeChange": { "alias": "onContentSizeChange"; "required": false; }; "onEndEditing": { "alias": "onEndEditing"; "required": false; }; "onError": { "alias": "onError"; "required": false; }; "onFocus": { "alias": "onFocus"; "required": false; }; "onHoverIn": { "alias": "onHoverIn"; "required": false; }; "onHoverOut": { "alias": "onHoverOut"; "required": false; }; "onKeyPress": { "alias": "onKeyPress"; "required": false; }; "onLayout": { "alias": "onLayout"; "required": false; }; "onLoad": { "alias": "onLoad"; "required": false; }; "onLoadEnd": { "alias": "onLoadEnd"; "required": false; }; "onLoadStart": { "alias": "onLoadStart"; "required": false; }; "onLongPress": { "alias": "onLongPress"; "required": false; }; "onMagicTap": { "alias": "onMagicTap"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "onMoveShouldSetResponder": { "alias": "onMoveShouldSetResponder"; "required": false; }; "onMoveShouldSetResponderCapture": { "alias": "onMoveShouldSetResponderCapture"; "required": false; }; "onPartialLoad": { "alias": "onPartialLoad"; "required": false; }; "onPress": { "alias": "onPress"; "required": false; }; "onPressIn": { "alias": "onPressIn"; "required": false; }; "onPressMove": { "alias": "onPressMove"; "required": false; }; "onPressOut": { "alias": "onPressOut"; "required": false; }; "onProgress": { "alias": "onProgress"; "required": false; }; "onRefresh": { "alias": "onRefresh"; "required": false; }; "onResponderEnd": { "alias": "onResponderEnd"; "required": false; }; "onResponderGrant": { "alias": "onResponderGrant"; "required": false; }; "onResponderMove": { "alias": "onResponderMove"; "required": false; }; "onResponderReject": { "alias": "onResponderReject"; "required": false; }; "onResponderRelease": { "alias": "onResponderRelease"; "required": false; }; "onResponderStart": { "alias": "onResponderStart"; "required": false; }; "onResponderTerminate": { "alias": "onResponderTerminate"; "required": false; }; "onResponderTerminationRequest": { "alias": "onResponderTerminationRequest"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onScrollToTop": { "alias": "onScrollToTop"; "required": false; }; "onSelectionChange": { "alias": "onSelectionChange"; "required": false; }; "onStartShouldSetResponder": { "alias": "onStartShouldSetResponder"; "required": false; }; "onStartShouldSetResponderCapture": { "alias": "onStartShouldSetResponderCapture"; "required": false; }; "onSubmitEditing": { "alias": "onSubmitEditing"; "required": false; }; "onValueChange": { "alias": "onValueChange"; "required": false; }; }, {}, never, never, true, never>;
25
22
  }
@@ -1,29 +1,14 @@
1
- // The directive that owns a `ChangeDetectorRef` for the elements that actually need one.
1
+ // The directive that CLAIMS an `on*` prop binding on a tag, and nothing more.
2
2
  //
3
- // An `on*` PROP is forwarded to the engine node, and the ENGINE calls it — Angular is told nothing,
4
- // so a plain field mutation inside the app's handler dirties no view. `createCallbackWrapper` fixes
5
- // that with `markForCheck`, and until 2026-09-18 the ref it marked came from `SymbioteElement`
6
- // injecting one on EVERY element, because any element MAY carry a callback.
3
+ // Unclaimed, `[onPress]="fn"` on an element is NG0306 in dev mode (`setDomProperty` refuses `on*`
4
+ // DOM properties, `render3/instructions/shared.ts:296-298`), so something has to own the name. The
5
+ // renderer wraps the value on its way through and marks the view with `markForCheck` when the engine
6
+ // calls it. That view is found from the node when the callback FIRES (`change-detection-flush.ts`),
7
+ // so this directive injects no `ChangeDetectorRef`.
7
8
  //
8
- // Almost none does. Priced on JavaScriptCore, an injection is ~1.0-2.4 us per element — 10-24 ms
9
- // over the ten thousand of a thousand-row screen, all of it to build `ViewRef`s nothing reads
10
- // (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts`, the `ChangeDetectorRef` row).
11
- //
12
- // MATCHING IS THE CHEAPER QUESTION THAN INJECTING, and that had to be measured rather than assumed,
13
- // because the selector below is dozens of alternatives and Angular tries a component's whole
14
- // directive list against every element it creates. The ladder's `cb-probe` arm carries this exact
15
- // string WITHOUT matching anything — the state of every element on the benchmark row — so the two
16
- // halves are priced against each other in one process, rotated, with a resolution bar:
17
- //
18
- // carrying the selector 4.3 5.9 -2.0 5.7 -1.5 ms inside the bar in four of five
19
- // the ChangeDetectorRef 9.7 23.5 13.6 31.3 23.8 ms
20
- // the CALLBACK HOST -3.9 -9.3 -25.5 -25.6 -25.3 ms all five negative, three outside
21
- //
22
- // WHAT IS NOT VERIFIED, said plainly: the ladder's arm carries ONE element directive beside this one,
23
- // where a real screen carries two dozen, and the `ng-elements` bench arm could not confirm the change
24
- // at app scale — the machine it was measured on swung its untouched CONTROL from 229 to 566 ms, so
25
- // nothing quoted off it would have carried a verdict either way. The controlled A/B is the evidence
26
- // here; the bench-arm confirmation is owed.
9
+ // Carrying the selector is free: Angular tries it against every element it creates, and the
10
+ // ladder's `cb-probe` arm priced that inside the resolution bar in four runs of five
11
+ // (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts`).
27
12
  //
28
13
  // IT HOLDS NO INPUTS, which is what keeps the change off the public surface. The `on*` props stay
29
14
  // declared on `SymbioteElement` and its subclasses, so every type and every forward is unchanged;
@@ -33,8 +18,7 @@
33
18
  //
34
19
  // A LEAF, like `change-detection-flush` and `renderer/value-change`: importing `elements.ts` from
35
20
  // here would close a cycle, since that file is what puts this directive in `SYMBIOTE_ELEMENTS`.
36
- import { ChangeDetectorRef, Directive, ElementRef, Renderer2, inject, } from '@angular/core';
37
- import { registerViewMarker, unregisterViewMarker, } from './change-detection-flush';
21
+ import { Directive, ElementRef, Renderer2, inject, } from '@angular/core';
38
22
  import * as i0 from "@angular/core";
39
23
  /**
40
24
  * Every `on*` input any element directive declares, except the one that fires per FRAME.
@@ -116,10 +100,6 @@ export class SymbioteCallbackHost {
116
100
  constructor() {
117
101
  this.renderer = inject(Renderer2);
118
102
  this.host = inject(ElementRef);
119
- this.detector = inject(ChangeDetectorRef);
120
- const node = this.host.nativeElement;
121
- if (typeof node === 'object' && node !== null)
122
- registerViewMarker(node, this.detector);
123
103
  }
124
104
  ngOnChanges(changes) {
125
105
  // The renderer wraps the value on its way through, so this forwards it raw — same shape as the
@@ -127,11 +107,6 @@ export class SymbioteCallbackHost {
127
107
  for (const name of Object.keys(changes))
128
108
  this.renderer.setProperty(this.host.nativeElement, name, changes[name]?.currentValue);
129
109
  }
130
- ngOnDestroy() {
131
- const node = this.host.nativeElement;
132
- if (typeof node === 'object' && node !== null)
133
- unregisterViewMarker(node);
134
- }
135
110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteCallbackHost, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
136
111
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteCallbackHost, isStandalone: true, selector: "[onAccessibilityAction],[onAccessibilityEscape],[onAccessibilityTap],[onBlur],[onContentSizeChange],[onEndEditing],[onError],[onFocus],[onHoverIn],[onHoverOut],[onKeyPress],[onLayout],[onLoad],[onLoadEnd],[onLoadStart],[onLongPress],[onMagicTap],[onMomentumScrollBegin],[onMomentumScrollEnd],[onMoveShouldSetResponder],[onMoveShouldSetResponderCapture],[onPartialLoad],[onPress],[onPressIn],[onPressMove],[onPressOut],[onProgress],[onRefresh],[onResponderEnd],[onResponderGrant],[onResponderMove],[onResponderReject],[onResponderRelease],[onResponderStart],[onResponderTerminate],[onResponderTerminationRequest],[onScrollBeginDrag],[onScrollEndDrag],[onScrollToTop],[onSelectionChange],[onStartShouldSetResponder],[onStartShouldSetResponderCapture],[onSubmitEditing],[onValueChange]", inputs: { onAccessibilityAction: "onAccessibilityAction", onAccessibilityEscape: "onAccessibilityEscape", onAccessibilityTap: "onAccessibilityTap", onBlur: "onBlur", onContentSizeChange: "onContentSizeChange", onEndEditing: "onEndEditing", onError: "onError", onFocus: "onFocus", onHoverIn: "onHoverIn", onHoverOut: "onHoverOut", onKeyPress: "onKeyPress", onLayout: "onLayout", onLoad: "onLoad", onLoadEnd: "onLoadEnd", onLoadStart: "onLoadStart", onLongPress: "onLongPress", onMagicTap: "onMagicTap", onMomentumScrollBegin: "onMomentumScrollBegin", onMomentumScrollEnd: "onMomentumScrollEnd", onMoveShouldSetResponder: "onMoveShouldSetResponder", onMoveShouldSetResponderCapture: "onMoveShouldSetResponderCapture", onPartialLoad: "onPartialLoad", onPress: "onPress", onPressIn: "onPressIn", onPressMove: "onPressMove", onPressOut: "onPressOut", onProgress: "onProgress", onRefresh: "onRefresh", onResponderEnd: "onResponderEnd", onResponderGrant: "onResponderGrant", onResponderMove: "onResponderMove", onResponderReject: "onResponderReject", onResponderRelease: "onResponderRelease", onResponderStart: "onResponderStart", onResponderTerminate: "onResponderTerminate", onResponderTerminationRequest: "onResponderTerminationRequest", onScrollBeginDrag: "onScrollBeginDrag", onScrollEndDrag: "onScrollEndDrag", onScrollToTop: "onScrollToTop", onSelectionChange: "onSelectionChange", onStartShouldSetResponder: "onStartShouldSetResponder", onStartShouldSetResponderCapture: "onStartShouldSetResponderCapture", onSubmitEditing: "onSubmitEditing", onValueChange: "onValueChange" }, usesOnChanges: true, ngImport: i0 }); }
137
112
  }
@@ -207,5 +182,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
207
182
  ],
208
183
  standalone: true,
209
184
  }]
210
- }], ctorParameters: () => [] });
185
+ }] });
211
186
  //# sourceMappingURL=callback-host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"callback-host.js","sourceRoot":"","sources":["../../src/callback-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"callback-host.js","sourceRoot":"","sources":["../../src/callback-host.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ export declare function markReadBackNode(node: object): void;
1
2
  interface IViewMarker {
2
3
  markForCheck(): void;
3
4
  }
@@ -32,16 +32,50 @@
32
32
  // notification, so it cannot open that window at all. It is also the narrower answer — the only
33
33
  // view that has to be re-checked is the one holding the binding.
34
34
  //
35
- // The flush is registered by the element DIRECTIVE, which is the only thing here that owns a
36
- // `ChangeDetectorRef` for that view. A tag written under `CUSTOM_ELEMENTS_SCHEMA` with no directive
37
- // matched therefore gets no flush and keeps the stale-read behaviour — the directive is the
38
- // supported route (`[(value)]` is NG8007 without it), and this leaf has no way to reach a view it
39
- // was never handed.
35
+ // THE VIEW IS FOUND FROM THE NODE, at the moment an event needs it, not injected per element. Ivy
36
+ // patches `__ngContext__` onto every view's root elements and every directive host, so the nearest
37
+ // patched ancestor names the LView that declares the element - the one holding its `[value]`. A
38
+ // `ViewRef` over that LView is what `inject(ChangeDetectorRef)` would have handed out, built only
39
+ // for the element that fired, which is what let the read-back tags drop their directive instance
40
+ // (`element-directive-free.test.ts`). Projected content resolves to the view it is PROJECTED into,
41
+ // Angular's own discovery limit; the listener's `markForCheck` still reaches the declaring view.
40
42
  //
41
43
  // When a fourth behavior starts reading an app value back, it needs a name in the renderer's
42
44
  // `READ_BACK_*` sets — the census is `queueMicrotask` / `afterCommit` in
43
45
  // `core/components/src/behaviors`.
46
+ import { ɵViewRef as ViewRef, ɵgetLContext as getLContext, } from '@angular/core';
47
+ import { isSymbioteNode, parentOf, reportUncaughtError, } from '@symbiote-native/engine';
44
48
  const viewFlushes = new WeakMap();
49
+ // Nodes whose view is found lazily when they flush. Anything else keeps the no-op an unregistered
50
+ // node always had - `flushViewFor` also runs after every wrapped `on*` prop, and a press must not
51
+ // start paying a synchronous re-check it never needed.
52
+ const readBackNodes = new WeakSet();
53
+ export function markReadBackNode(node) {
54
+ readBackNodes.add(node);
55
+ }
56
+ // Ivy's monkey-patch key (`render3/interfaces/context.ts`, `MONKEY_PATCH_KEY_NAME`).
57
+ const NG_CONTEXT = '__ngContext__';
58
+ /** The LView-backed ref for the view that declares `node`, or undefined outside any view. */
59
+ function viewRefOf(node) {
60
+ let patched = node;
61
+ while (patched !== undefined && !(NG_CONTEXT in patched))
62
+ patched = isSymbioteNode(patched) ? parentOf(patched) : undefined;
63
+ if (patched === undefined)
64
+ return undefined;
65
+ const lView = getLContext(patched)?.lView;
66
+ return lView === undefined || lView === null ? undefined : new ViewRef(lView);
67
+ }
68
+ // REPORTED, NOT RETHROWN: this is the one change detection outside `ApplicationRef.tick()`'s error
69
+ // boundary, called from inside a native event dispatch where a throw becomes `RCTFatal`. Same
70
+ // channel `SymbioteErrorHandler` reports through.
71
+ function detectChangesReported(view) {
72
+ try {
73
+ view.detectChanges();
74
+ }
75
+ catch (error) {
76
+ reportUncaughtError(error, { origin: 'angular flush' });
77
+ }
78
+ }
45
79
  const ON_PREFIX = /^on[A-Z]/;
46
80
  // The one `onX` that fires per FRAME rather than per gesture — with sticky headers RN pins
47
81
  // `scrollEventThrottle` to 1, i.e. 60 times a second. `markForCheck` walks to the ROOT, so wrapping
@@ -123,14 +157,12 @@ export function createCallbackWrapper(node) {
123
157
  * element on JavaScriptCore (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts`), so a
124
158
  * thousand-row screen paid for ten thousand `ViewRef`s to serve none.
125
159
  *
126
- * `SymbioteCallbackHost` registers here instead, and it MATCHES on the callback attributes rather
127
- * than being injected — so an element with no `on*` binding neither instantiates it nor pays for it.
128
- * Measured as the whole trade, selector included: -3.9 / -9.3 / -25.5 ms over ten thousand elements.
160
+ * Only a composed component's host directive registers here (`primitives/shared.ts`); a TAG's
161
+ * view is found from the node when its callback fires (`markViewFor`), so no element pays an
162
+ * injection for a callback it may never carry.
129
163
  *
130
- * Separate from `viewFlushes` deliberately. They come from different directives, on overlapping but
131
- * different sets of tags, and they are not the same instruction: this one SCHEDULES and reaches every
132
- * ancestor, that one re-checks ONE view synchronously. Collapsing them into a single entry would make
133
- * whichever directive registered last decide which of the two an element gets.
164
+ * Separate from `viewFlushes` deliberately: this one SCHEDULES and reaches every ancestor, that one
165
+ * re-checks ONE view synchronously.
134
166
  */
135
167
  const viewMarkers = new WeakMap();
136
168
  export function registerViewMarker(node, marker) {
@@ -142,7 +174,10 @@ export function unregisterViewMarker(node) {
142
174
  export function markViewFor(node) {
143
175
  if (typeof node !== 'object' || node === null)
144
176
  return;
145
- viewMarkers.get(node)?.markForCheck();
177
+ // A composed component's host directive registers its own ref; a TAG registers nothing and has its
178
+ // view found here, only when a callback actually fires (see the header).
179
+ const marker = viewMarkers.get(node) ?? viewRefOf(node);
180
+ marker?.markForCheck();
146
181
  }
147
182
  export function registerViewFlush(node, flush) {
148
183
  viewFlushes.set(node, flush);
@@ -153,6 +188,15 @@ export function unregisterViewFlush(node) {
153
188
  export function flushViewFor(node) {
154
189
  if (typeof node !== 'object' || node === null)
155
190
  return;
156
- viewFlushes.get(node)?.();
191
+ const registered = viewFlushes.get(node);
192
+ if (registered !== undefined) {
193
+ registered();
194
+ return;
195
+ }
196
+ if (!readBackNodes.has(node))
197
+ return;
198
+ const view = viewRefOf(node);
199
+ if (view !== undefined)
200
+ detectChangesReported(view);
157
201
  }
158
202
  //# sourceMappingURL=change-detection-flush.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-detection-flush.js","sourceRoot":"","sources":["../../src/change-detection-flush.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change-detection-flush.js","sourceRoot":"","sources":["../../src/change-detection-flush.ts"],"names":[],"mappings":"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"}
@@ -65,8 +65,11 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
65
65
  scrollEventThrottle?: number;
66
66
  keyboardShouldPersistTaps?: boolean | 'always' | 'never' | 'handled';
67
67
  keyboardDismissMode?: 'none' | 'on-drag' | 'interactive';
68
+ removeClippedSubviews?: boolean;
69
+ nestedScrollEnabled?: boolean;
68
70
  style?: IStyleProp<IViewStyle>;
69
71
  contentContainerStyle?: IStyleProp<IViewStyle>;
72
+ get resolvedRemoveClippedSubviews(): boolean;
70
73
  itemDir?: VListItemDirective<ItemT>;
71
74
  headerDir?: VListHeaderDirective;
72
75
  footerDir?: VListFooterDirective;
@@ -95,7 +98,6 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
95
98
  context: IVListItemContext<ItemT>;
96
99
  }[];
97
100
  rowSeparatorContext(highlighted: unknown, leadingRow: unknown, trailingRow: unknown): IVListSeparatorContext<ItemT>;
98
- itemSeparatorContext(highlighted: unknown, leadingItem: unknown, trailingItem: unknown): IVListSeparatorContext<ItemT>;
99
101
  scrollToOffset(params: {
100
102
  offset: number;
101
103
  animated?: boolean;
@@ -121,5 +123,5 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
121
123
  getScrollNode(): ISymbioteNode | null;
122
124
  recordInteraction(): void;
123
125
  static ɵfac: i0.ɵɵFactoryDeclaration<FlatList<any>, never>;
124
- static ɵcmp: i0.ɵɵComponentDeclaration<FlatList<any>, "FlatList", never, { "data": { "alias": "data"; "required": true; }; "testID": { "alias": "testID"; "required": false; }; "numColumns": { "alias": "numColumns"; "required": false; }; "columnWrapperStyle": { "alias": "columnWrapperStyle"; "required": false; }; "keyExtractor": { "alias": "keyExtractor"; "required": false; }; "getItemLayout": { "alias": "getItemLayout"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "inverted": { "alias": "inverted"; "required": false; }; "extraData": { "alias": "extraData"; "required": false; }; "onEndReachedThreshold": { "alias": "onEndReachedThreshold"; "required": false; }; "onStartReachedThreshold": { "alias": "onStartReachedThreshold"; "required": false; }; "refreshing": { "alias": "refreshing"; "required": false; }; "progressViewOffset": { "alias": "progressViewOffset"; "required": false; }; "viewabilityConfig": { "alias": "viewabilityConfig"; "required": false; }; "viewabilityConfigCallbackPairs": { "alias": "viewabilityConfigCallbackPairs"; "required": false; }; "initialNumToRender": { "alias": "initialNumToRender"; "required": false; }; "initialScrollIndex": { "alias": "initialScrollIndex"; "required": false; }; "maxToRenderPerBatch": { "alias": "maxToRenderPerBatch"; "required": false; }; "updateCellsBatchingPeriod": { "alias": "updateCellsBatchingPeriod"; "required": false; }; "windowSize": { "alias": "windowSize"; "required": false; }; "stickyHeaderIndices": { "alias": "stickyHeaderIndices"; "required": false; }; "maintainVisibleContentPosition": { "alias": "maintainVisibleContentPosition"; "required": false; }; "onScroll": { "alias": "onScroll"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "scrollEventThrottle": { "alias": "scrollEventThrottle"; "required": false; }; "keyboardShouldPersistTaps": { "alias": "keyboardShouldPersistTaps"; "required": false; }; "keyboardDismissMode": { "alias": "keyboardDismissMode"; "required": false; }; "style": { "alias": "style"; "required": false; }; "contentContainerStyle": { "alias": "contentContainerStyle"; "required": false; }; }, { "endReached": "endReached"; "startReached": "startReached"; "refresh": "refresh"; "viewableItemsChanged": "viewableItemsChanged"; "scrollToIndexFailed": "scrollToIndexFailed"; }, ["itemDir", "headerDir", "footerDir", "emptyDir", "separatorDir"], never, true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
126
+ static ɵcmp: i0.ɵɵComponentDeclaration<FlatList<any>, "FlatList", never, { "data": { "alias": "data"; "required": true; }; "testID": { "alias": "testID"; "required": false; }; "numColumns": { "alias": "numColumns"; "required": false; }; "columnWrapperStyle": { "alias": "columnWrapperStyle"; "required": false; }; "keyExtractor": { "alias": "keyExtractor"; "required": false; }; "getItemLayout": { "alias": "getItemLayout"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "inverted": { "alias": "inverted"; "required": false; }; "extraData": { "alias": "extraData"; "required": false; }; "onEndReachedThreshold": { "alias": "onEndReachedThreshold"; "required": false; }; "onStartReachedThreshold": { "alias": "onStartReachedThreshold"; "required": false; }; "refreshing": { "alias": "refreshing"; "required": false; }; "progressViewOffset": { "alias": "progressViewOffset"; "required": false; }; "viewabilityConfig": { "alias": "viewabilityConfig"; "required": false; }; "viewabilityConfigCallbackPairs": { "alias": "viewabilityConfigCallbackPairs"; "required": false; }; "initialNumToRender": { "alias": "initialNumToRender"; "required": false; }; "initialScrollIndex": { "alias": "initialScrollIndex"; "required": false; }; "maxToRenderPerBatch": { "alias": "maxToRenderPerBatch"; "required": false; }; "updateCellsBatchingPeriod": { "alias": "updateCellsBatchingPeriod"; "required": false; }; "windowSize": { "alias": "windowSize"; "required": false; }; "stickyHeaderIndices": { "alias": "stickyHeaderIndices"; "required": false; }; "maintainVisibleContentPosition": { "alias": "maintainVisibleContentPosition"; "required": false; }; "onScroll": { "alias": "onScroll"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "scrollEventThrottle": { "alias": "scrollEventThrottle"; "required": false; }; "keyboardShouldPersistTaps": { "alias": "keyboardShouldPersistTaps"; "required": false; }; "keyboardDismissMode": { "alias": "keyboardDismissMode"; "required": false; }; "removeClippedSubviews": { "alias": "removeClippedSubviews"; "required": false; }; "nestedScrollEnabled": { "alias": "nestedScrollEnabled"; "required": false; }; "style": { "alias": "style"; "required": false; }; "contentContainerStyle": { "alias": "contentContainerStyle"; "required": false; }; }, { "endReached": "endReached"; "startReached": "startReached"; "refresh": "refresh"; "viewableItemsChanged": "viewableItemsChanged"; "scrollToIndexFailed": "scrollToIndexFailed"; }, ["itemDir", "headerDir", "footerDir", "emptyDir", "separatorDir"], never, true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
125
127
  }