@symbiote-native/angular 0.7.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +3 -3
  2. package/babel-lower-host-primitives.cjs +636 -0
  3. package/babel-register-composed.cjs +21 -3
  4. package/build/angular/anchor-host-registry.js +3 -1
  5. package/build/angular/anchor-host-registry.js.map +1 -1
  6. package/build/angular/bootstrap.js +1 -1
  7. package/build/angular/bootstrap.js.map +1 -1
  8. package/build/angular/components/activity-indicator/index.android.js +7 -2
  9. package/build/angular/components/activity-indicator/index.android.js.map +1 -1
  10. package/build/angular/components/activity-indicator/index.ios.js +3 -1
  11. package/build/angular/components/activity-indicator/index.ios.js.map +1 -1
  12. package/build/angular/components/activity-indicator/shared.d.ts +1 -1
  13. package/build/angular/components/activity-indicator/shared.js +1 -1
  14. package/build/angular/components/activity-indicator/shared.js.map +1 -1
  15. package/build/angular/components/button.d.ts +3 -0
  16. package/build/angular/components/button.js +22 -5
  17. package/build/angular/components/button.js.map +1 -1
  18. package/build/angular/components/flat-list/index.d.ts +1 -1
  19. package/build/angular/components/flat-list/index.js +47 -14
  20. package/build/angular/components/flat-list/index.js.map +1 -1
  21. package/build/angular/components/image/index.android.js +4 -10
  22. package/build/angular/components/image/index.android.js.map +1 -1
  23. package/build/angular/components/image/index.ios.js +4 -10
  24. package/build/angular/components/image/index.ios.js.map +1 -1
  25. package/build/angular/components/image/shared.d.ts +4 -4
  26. package/build/angular/components/image/shared.js +51 -33
  27. package/build/angular/components/image/shared.js.map +1 -1
  28. package/build/angular/components/image-background.d.ts +3 -0
  29. package/build/angular/components/image-background.js +32 -9
  30. package/build/angular/components/image-background.js.map +1 -1
  31. package/build/angular/components/input-accessory-view/index.d.ts +2 -1
  32. package/build/angular/components/input-accessory-view/index.js +18 -16
  33. package/build/angular/components/input-accessory-view/index.js.map +1 -1
  34. package/build/angular/components/keyboard-avoiding-view/index.d.ts +3 -1
  35. package/build/angular/components/keyboard-avoiding-view/index.js +56 -19
  36. package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
  37. package/build/angular/components/modal/index.d.ts +1 -0
  38. package/build/angular/components/modal/index.js +21 -10
  39. package/build/angular/components/modal/index.js.map +1 -1
  40. package/build/angular/components/pressable/index.d.ts +10 -5
  41. package/build/angular/components/pressable/index.js +61 -16
  42. package/build/angular/components/pressable/index.js.map +1 -1
  43. package/build/angular/components/refresh-control/index.d.ts +2 -1
  44. package/build/angular/components/refresh-control/index.js +13 -9
  45. package/build/angular/components/refresh-control/index.js.map +1 -1
  46. package/build/angular/components/safe-area-view/index.d.ts +3 -1
  47. package/build/angular/components/safe-area-view/index.js +22 -20
  48. package/build/angular/components/safe-area-view/index.js.map +1 -1
  49. package/build/angular/components/scroll-view/index.android.js +44 -14
  50. package/build/angular/components/scroll-view/index.android.js.map +1 -1
  51. package/build/angular/components/scroll-view/index.ios.js +13 -5
  52. package/build/angular/components/scroll-view/index.ios.js.map +1 -1
  53. package/build/angular/components/scroll-view/projection.d.ts +32 -0
  54. package/build/angular/components/scroll-view/projection.js +212 -47
  55. package/build/angular/components/scroll-view/projection.js.map +1 -1
  56. package/build/angular/components/scroll-view/shared.d.ts +2 -0
  57. package/build/angular/components/scroll-view/shared.js +48 -11
  58. package/build/angular/components/scroll-view/shared.js.map +1 -1
  59. package/build/angular/components/scroll-view/sticky-header.js +7 -3
  60. package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
  61. package/build/angular/components/section-list/index.d.ts +9 -1
  62. package/build/angular/components/section-list/index.js +72 -18
  63. package/build/angular/components/section-list/index.js.map +1 -1
  64. package/build/angular/components/switch/index.android.js +23 -9
  65. package/build/angular/components/switch/index.android.js.map +1 -1
  66. package/build/angular/components/switch/index.ios.js +23 -9
  67. package/build/angular/components/switch/index.ios.js.map +1 -1
  68. package/build/angular/components/switch/shared.d.ts +1 -1
  69. package/build/angular/components/switch/shared.js +5 -2
  70. package/build/angular/components/switch/shared.js.map +1 -1
  71. package/build/angular/components/text-input.d.ts +8 -2
  72. package/build/angular/components/text-input.js +79 -34
  73. package/build/angular/components/text-input.js.map +1 -1
  74. package/build/angular/components/touchable/index.d.ts +36 -7
  75. package/build/angular/components/touchable/index.js +280 -72
  76. package/build/angular/components/touchable/index.js.map +1 -1
  77. package/build/angular/components/touchable-native-feedback/index.d.ts +2 -1
  78. package/build/angular/components/touchable-native-feedback/index.js +19 -17
  79. package/build/angular/components/touchable-native-feedback/index.js.map +1 -1
  80. package/build/angular/components/virtualized-list/directives.js +4 -0
  81. package/build/angular/components/virtualized-list/directives.js.map +1 -1
  82. package/build/angular/components/virtualized-list/index.d.ts +8 -2
  83. package/build/angular/components/virtualized-list/index.js +207 -61
  84. package/build/angular/components/virtualized-list/index.js.map +1 -1
  85. package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
  86. package/build/angular/components/virtualized-section-list/index.d.ts +21 -1
  87. package/build/angular/components/virtualized-section-list/index.js +100 -22
  88. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  89. package/build/angular/components.d.ts +2 -2
  90. package/build/angular/components.js +1 -1
  91. package/build/angular/components.js.map +1 -1
  92. package/build/angular/create-portal/index.d.ts +11 -2
  93. package/build/angular/create-portal/index.js +42 -12
  94. package/build/angular/create-portal/index.js.map +1 -1
  95. package/build/angular/create-tunnel/index.js.map +1 -1
  96. package/build/angular/descriptor-to-angular/index.js +3 -1
  97. package/build/angular/descriptor-to-angular/index.js.map +1 -1
  98. package/build/angular/diagnostics.d.ts +33 -0
  99. package/build/angular/diagnostics.js +82 -0
  100. package/build/angular/diagnostics.js.map +1 -0
  101. package/build/angular/gate-demand.d.ts +37 -0
  102. package/build/angular/gate-demand.js +84 -0
  103. package/build/angular/gate-demand.js.map +1 -0
  104. package/build/angular/host-instance/index.js +1 -1
  105. package/build/angular/host-instance/index.js.map +1 -1
  106. package/build/angular/index.d.ts +6 -2
  107. package/build/angular/index.js +16 -1
  108. package/build/angular/index.js.map +1 -1
  109. package/build/angular/modules/animated/create-animated-component.d.ts +1 -0
  110. package/build/angular/modules/animated/create-animated-component.js +41 -18
  111. package/build/angular/modules/animated/create-animated-component.js.map +1 -1
  112. package/build/angular/modules/app-registry/index.js.map +1 -1
  113. package/build/angular/modules/status-bar/index.js +1 -1
  114. package/build/angular/modules/status-bar/index.js.map +1 -1
  115. package/build/angular/primitives/index.d.ts +31 -2
  116. package/build/angular/primitives/index.js +81 -3
  117. package/build/angular/primitives/index.js.map +1 -1
  118. package/build/angular/primitives/shared.d.ts +9 -1
  119. package/build/angular/primitives/shared.js +49 -3
  120. package/build/angular/primitives/shared.js.map +1 -1
  121. package/build/angular/register.d.ts +1 -0
  122. package/build/angular/register.js +35 -0
  123. package/build/angular/register.js.map +1 -0
  124. package/build/angular/render/index.js +51 -6
  125. package/build/angular/render/index.js.map +1 -1
  126. package/build/angular/renderer/index.d.ts +1 -0
  127. package/build/angular/renderer/index.js +157 -21
  128. package/build/angular/renderer/index.js.map +1 -1
  129. package/build/angular/services/color-scheme.service.js.map +1 -1
  130. package/build/angular/services/window-dimensions.service.js +1 -1
  131. package/build/angular/services/window-dimensions.service.js.map +1 -1
  132. package/build/angular/state-style.d.ts +9 -0
  133. package/build/angular/state-style.js +39 -0
  134. package/build/angular/state-style.js.map +1 -0
  135. package/metro-transformer.cjs +69 -0
  136. package/package.json +27 -8
  137. package/src/anchor-host-registry.ts +3 -1
  138. package/src/bootstrap.ts +4 -1
  139. package/src/components/activity-indicator/index.android.ts +7 -2
  140. package/src/components/activity-indicator/index.ios.ts +3 -1
  141. package/src/components/activity-indicator/shared.ts +32 -13
  142. package/src/components/button.ts +36 -6
  143. package/src/components/flat-list/index.ts +91 -29
  144. package/src/components/image/index.android.ts +9 -6
  145. package/src/components/image/index.ios.ts +9 -6
  146. package/src/components/image/shared.ts +110 -45
  147. package/src/components/image-background.ts +47 -10
  148. package/src/components/input-accessory-view/index.ts +41 -18
  149. package/src/components/keyboard-avoiding-view/index.ts +76 -22
  150. package/src/components/modal/index.ts +39 -12
  151. package/src/components/pressable/index.ts +121 -31
  152. package/src/components/refresh-control/index.ts +36 -13
  153. package/src/components/safe-area-view/index.ts +44 -19
  154. package/src/components/scroll-view/index.android.ts +31 -9
  155. package/src/components/scroll-view/index.ios.ts +17 -4
  156. package/src/components/scroll-view/projection.ts +290 -63
  157. package/src/components/scroll-view/shared.ts +124 -30
  158. package/src/components/scroll-view/sticky-header.ts +25 -8
  159. package/src/components/section-list/index.ts +79 -19
  160. package/src/components/switch/index.android.ts +18 -7
  161. package/src/components/switch/index.ios.ts +18 -7
  162. package/src/components/switch/shared.ts +15 -4
  163. package/src/components/text-input.ts +119 -31
  164. package/src/components/touchable/index.ts +339 -72
  165. package/src/components/touchable-native-feedback/index.ts +50 -18
  166. package/src/components/virtualized-list/directives.ts +19 -5
  167. package/src/components/virtualized-list/index.ts +292 -72
  168. package/src/components/virtualized-section-list/directives.ts +6 -3
  169. package/src/components/virtualized-section-list/index.ts +164 -34
  170. package/src/components.ts +6 -1
  171. package/src/create-portal/index.ts +47 -11
  172. package/src/create-tunnel/index.ts +3 -1
  173. package/src/descriptor-to-angular/index.ts +29 -8
  174. package/src/diagnostics.ts +138 -0
  175. package/src/gate-demand.ts +109 -0
  176. package/src/host-instance/index.ts +9 -3
  177. package/src/index.ts +33 -2
  178. package/src/modules/animated/create-animated-component.ts +67 -19
  179. package/src/modules/app-registry/index.ts +3 -1
  180. package/src/modules/status-bar/index.ts +13 -4
  181. package/src/primitives/index.ts +73 -2
  182. package/src/primitives/shared.ts +70 -9
  183. package/src/register.ts +43 -0
  184. package/src/render/index.ts +59 -7
  185. package/src/renderer/index.ts +209 -37
  186. package/src/services/color-scheme.service.ts +3 -1
  187. package/src/services/window-dimensions.service.ts +11 -4
  188. package/src/state-style.ts +39 -0
@@ -1,9 +1,34 @@
1
- import { AnimatedProps, dlog, isAnchor, reduceProps, routeProp, whenCommitted, createElement, appendChild, insertBefore, removeChild, } from '@symbiote-native/engine';
1
+ import { AnimatedProps, dlog, isDebug, isAnchor, reduceProps, routeProp, whenCommitted, createElement, appendChild, insertBefore, removeChild, } from '@symbiote-native/engine';
2
+ import { countAngular } from '../../diagnostics';
2
3
  import { createInitialStickyState, readLayoutNumber, reduceSticky, STICKY_HEADER_Z_INDEX, } from '@symbiote-native/components';
3
4
  import { descriptorFor } from '@symbiote-native/components';
4
5
  import { Platform } from '@symbiote-native/engine';
5
6
  const contentProjection = new WeakMap();
6
- const projectedWrappers = new WeakMap();
7
+ // Which controller owns a projected child. Keyed by EVERY projected child, not only the wrapped
8
+ // ones: sticky indices are positional, so a child removed behind the controller's back leaves a dead
9
+ // record that inflates every later child's paint index (see removeScrollViewProjectedChild). A
10
+ // windowed list recycles cells continuously, so that drift grows with scroll distance.
11
+ const projectedOwners = new WeakMap();
12
+ // Controllers with a coalesced sticky reconcile owed, drained once per change-detection pass by
13
+ // flushScrollViewProjections (see ScrollViewProjectionController.scheduleReconcile for why the
14
+ // flush must be synchronous rather than a microtask). A strong Set is correct here: an entry lives
15
+ // only from the mutation that queued it to the end of that same pass.
16
+ const pendingProjections = new Set();
17
+ /**
18
+ * Run every sticky reconcile owed by this change-detection pass. Wired to the renderer factory's
19
+ * `end()`, which Angular calls at the end of `ApplicationRef.tick` — after both channels that feed
20
+ * a projection controller have written (children through the renderer, `stickyHeaderIndices` through
21
+ * an `@Input`), and before the surface's microtask-coalesced commit runs.
22
+ */
23
+ export function flushScrollViewProjections() {
24
+ if (pendingProjections.size === 0)
25
+ return;
26
+ // Snapshot: a reconcile can wrap a record, and wrapping is itself a projected mutation.
27
+ const owed = [...pendingProjections];
28
+ pendingProjections.clear();
29
+ for (const controller of owed)
30
+ controller.flushReconcile();
31
+ }
7
32
  function createViewNode() {
8
33
  const descriptor = descriptorFor('symbiote-view');
9
34
  return createElement(descriptor.component, descriptor.isText);
@@ -12,7 +37,8 @@ function directNode(record) {
12
37
  return record.wrapper ?? record.child;
13
38
  }
14
39
  function isProjectedRefreshControl(node) {
15
- if (node.component === 'PullToRefreshView' || node.component === 'AndroidSwipeRefreshLayout') {
40
+ if (node.component === 'PullToRefreshView' ||
41
+ node.component === 'AndroidSwipeRefreshLayout') {
16
42
  return true;
17
43
  }
18
44
  // Angular public <RefreshControl> is an anchor host whose real native refresh node lives inside
@@ -39,14 +65,18 @@ class StickyProjectionWrapper {
39
65
  cancelBind;
40
66
  listenerId;
41
67
  debounceTimer;
42
- constructor(controller, childIndex, node) {
68
+ constructor(controller,
69
+ // NOT readonly: a window step renumbers every paint index below it without changing which child
70
+ // this header is. See setChildIndex.
71
+ childIndex, node) {
43
72
  this.controller = controller;
44
73
  this.childIndex = childIndex;
45
74
  this.node = node;
46
- this.animatedTranslateY = this.controller.config.scrollAnimatedValue.interpolate({
47
- inputRange: [-1, 0],
48
- outputRange: [0, 0],
49
- });
75
+ this.animatedTranslateY =
76
+ this.controller.config.scrollAnimatedValue.interpolate({
77
+ inputRange: [-1, 0],
78
+ outputRange: [0, 0],
79
+ });
50
80
  dlog(`STICKY[wrap] created index=${childIndex} scrollValueIsNative=${this.controller.config.scrollAnimatedValue.__isNative()}`);
51
81
  this.dispatch({ kind: 'inputs-changed' });
52
82
  }
@@ -71,6 +101,24 @@ class StickyProjectionWrapper {
71
101
  rebuild() {
72
102
  this.dispatch({ kind: 'inputs-changed' });
73
103
  }
104
+ // A window step renumbers every paint index below it while the header itself is unchanged: same
105
+ // child, same measured layout, new position among the projected children. Recreating the wrapper
106
+ // for that throws away `measured`/`layoutY` so the header re-measures from scratch, and costs a
107
+ // native round trip per step (restoreDefaultValues + dropAnimatedNode out, a fresh interpolation +
108
+ // AnimatedProps in). Feed the new index to the SAME state machine and let the reducer's range
109
+ // guard decide whether anything must be rebuilt.
110
+ //
111
+ // Identity is the CHILD - it owns the record, the record owns this wrapper - never the position.
112
+ // Angular CDK's virtual scroll makes the same call: on a window move `_updateContext` writes
113
+ // `view.context.index = renderedRange.start + i` into the EXISTING view rather than recreating it,
114
+ // and its trackBy is offset by `renderedRange.start` so identity stays absolute
115
+ // (`cdk/scrolling/virtual-for-of.ts`).
116
+ setChildIndex(next) {
117
+ if (this.childIndex === next)
118
+ return;
119
+ this.childIndex = next;
120
+ this.dispatch({ kind: 'inputs-changed' });
121
+ }
74
122
  inputs() {
75
123
  return {
76
124
  os: Platform.OS,
@@ -87,7 +135,8 @@ class StickyProjectionWrapper {
87
135
  for (const effect of effects) {
88
136
  switch (effect.kind) {
89
137
  case 'rebuild-interpolation': {
90
- if (this.interpolation !== undefined && this.listenerId !== undefined) {
138
+ if (this.interpolation !== undefined &&
139
+ this.listenerId !== undefined) {
91
140
  this.interpolation.removeListener(this.listenerId);
92
141
  this.listenerId = undefined;
93
142
  }
@@ -134,7 +183,7 @@ class StickyProjectionWrapper {
134
183
  // so the wrapper is JS-driven end to end. If the scroll value has been made native up front the
135
184
  // cascade to child listeners stops (AnimatedWithChildren.__callListeners skips children once
136
185
  // isNative) and this never fires - the header then renders in place and never moves.
137
- animatedValueListener = ({ value }) => {
186
+ animatedValueListener = ({ value, }) => {
138
187
  dlog(() => `STICKY[wrap] index=${this.childIndex} animated-tick value=${String(value)}`);
139
188
  if (typeof value === 'number')
140
189
  this.dispatch({ kind: 'animated-tick', value });
@@ -146,7 +195,10 @@ class StickyProjectionWrapper {
146
195
  };
147
196
  const passthrough = this.state.translateY === null
148
197
  ? undefined
149
- : { transform: [{ translateY: this.state.translateY }], zIndex: STICKY_HEADER_Z_INDEX };
198
+ : {
199
+ transform: [{ translateY: this.state.translateY }],
200
+ zIndex: STICKY_HEADER_Z_INDEX,
201
+ };
150
202
  return {
151
203
  style: passthrough === undefined ? style : [style, passthrough],
152
204
  onLayout: this.onLayout,
@@ -195,12 +247,52 @@ export class ScrollViewProjectionController {
195
247
  // impossible to read as either a real loop or two lists warming up in turn.
196
248
  instanceId = ++projectionControllerSeq;
197
249
  reconcileSeq = 0;
250
+ isReconcilePending = false;
251
+ shouldNotifyAll = false;
198
252
  constructor(config) {
199
253
  this.config = config;
200
254
  }
201
255
  update(config) {
202
256
  this.config = config;
203
- this.reconcileStickyRecords();
257
+ // The one caller that must notify every wrapper: scrollViewHeight / invertStickyHeaders live in
258
+ // this config and reach the wrappers through nothing else.
259
+ this.scheduleReconcile(true);
260
+ }
261
+ /**
262
+ * Coalesce every reconcile request of one change-detection pass into a SINGLE walk.
263
+ *
264
+ * Cost is half the reason: the walk is O(records), so running it per projected mutation makes
265
+ * mounting M children O(M^2) - 801 children on the benchmark screen's PATH A. Correctness is the
266
+ * worse half. A windowed list feeds the controller through TWO channels that land at different
267
+ * moments in the same pass: children arrive through the renderer (insert/remove), while
268
+ * `stickyHeaderIndices` arrive as an ordinary `@Input` via `update()` from ngOnChanges. Reconciling
269
+ * on each mutation therefore guarantees at least one walk matching the NEW children against the
270
+ * OLD indices - and those indices are positions in the rendered child array
271
+ * (`stickyChildPositions`), which shift by 1-3 the moment VirtualizedList grows a leading spacer or
272
+ * a forced sticky cell. Every mismatch re-labels a header and re-parents engine nodes for nothing.
273
+ *
274
+ * The flush point is `RendererFactory2.end()`: the end of the pass, still SYNCHRONOUS. It must not
275
+ * be a microtask - engine mutations only `markDirty`, the commit is microtask-coalesced by the
276
+ * surface, and a reconcile queued after that commit mutates a tree nobody commits again. Headless
277
+ * the sticky wrapper then never reaches Fabric at all (six tests caught exactly this); on device it
278
+ * lands a frame late or not at all. `end()` runs inside `ApplicationRef.tick`, so it precedes every
279
+ * microtask queued during the pass.
280
+ */
281
+ scheduleReconcile(notifyAll = false) {
282
+ countAngular('projectionSchedules');
283
+ this.shouldNotifyAll ||= notifyAll;
284
+ if (this.isReconcilePending)
285
+ return;
286
+ this.isReconcilePending = true;
287
+ pendingProjections.add(this);
288
+ }
289
+ // Called by the renderer factory's end(). Public only for that seam.
290
+ flushReconcile() {
291
+ countAngular('projectionFlushes');
292
+ this.isReconcilePending = false;
293
+ const notifyAll = this.shouldNotifyAll;
294
+ this.shouldNotifyAll = false;
295
+ this.reconcileStickyRecords(notifyAll);
204
296
  }
205
297
  bindContentNode(node) {
206
298
  dlog(`Angular ScrollView projection bindContentNode node=${node.component} preExistingChildren=${node.children.length} recordsBefore=${this.records.length}`);
@@ -208,10 +300,16 @@ export class ScrollViewProjectionController {
208
300
  contentProjection.set(node, this);
209
301
  if (this.records.length === 0 && node.children.length > 0) {
210
302
  for (const child of [...node.children]) {
211
- this.records.push({ child, wrapper: undefined, sticky: undefined, stickyIndex: undefined });
303
+ this.records.push({
304
+ child,
305
+ wrapper: undefined,
306
+ sticky: undefined,
307
+ stickyIndex: undefined,
308
+ });
309
+ projectedOwners.set(child, this);
212
310
  }
213
311
  }
214
- this.reconcileStickyRecords();
312
+ this.scheduleReconcile();
215
313
  }
216
314
  appendProjectedChild(parent, child, insert) {
217
315
  dlog(`Angular ScrollView projection appendProjectedChild parent=${parent.component} child=${child.component} recordsBefore=${this.records.length}`);
@@ -225,8 +323,9 @@ export class ScrollViewProjectionController {
225
323
  stickyIndex: undefined,
226
324
  };
227
325
  this.records.push(record);
326
+ projectedOwners.set(child, this);
228
327
  this.insertRecord(parent, record, undefined, insert);
229
- this.reconcileStickyRecords();
328
+ this.scheduleReconcile();
230
329
  }
231
330
  insertProjectedChild(parent, child, beforeChild, insert) {
232
331
  dlog(`Angular ScrollView projection insertProjectedChild parent=${parent.component} child=${child.component} before=${beforeChild ? `${beforeChild.component}` : 'null'} recordsBefore=${this.records.length}`);
@@ -242,22 +341,35 @@ export class ScrollViewProjectionController {
242
341
  sticky: undefined,
243
342
  stickyIndex: undefined,
244
343
  };
245
- const index = beforeRecord === undefined ? this.records.length : this.records.indexOf(beforeRecord);
344
+ // An insert-BEFORE whose anchor is not a record degrades into an append, here and again in
345
+ // insertRecord below - silently, which is how an ordering fault stays invisible until the screen
346
+ // is already wrong. A list that only ever appends (the benchmark screen's PATH A) never hits it;
347
+ // a virtualized list recycling cells into the middle does.
348
+ if (beforeChild !== null && beforeRecord === undefined) {
349
+ dlog(() => `STICKY[proj#${this.instanceId}] ORDER insert-before anchor NOT a record ` +
350
+ `child=${child.component} before=${beforeChild.component} -> APPENDED to end`);
351
+ }
352
+ const index = beforeRecord === undefined
353
+ ? this.records.length
354
+ : this.records.indexOf(beforeRecord);
246
355
  this.records.splice(index, 0, record);
356
+ projectedOwners.set(child, this);
247
357
  this.insertRecord(parent, record, beforeRecord, insert);
248
- this.reconcileStickyRecords();
358
+ this.scheduleReconcile();
249
359
  }
250
360
  removeProjectedChild(child, remove) {
251
361
  const record = this.records.find(entry => entry.child === child || entry.wrapper === child);
252
362
  if (record === undefined || this.contentNode === undefined)
253
363
  return false;
254
364
  record.sticky?.destroy();
255
- projectedWrappers.delete(record.child);
365
+ projectedOwners.delete(record.child);
256
366
  const direct = directNode(record);
257
- if (direct.parent === this.contentNode)
258
- remove(this.contentNode, direct);
367
+ // The wrapper, when there is one, is the node actually parented to the content — detach
368
+ // whichever of the two carries the link, so a wrapped child never leaves its wrapper behind.
369
+ if (direct.parent !== undefined)
370
+ remove(direct.parent, direct);
259
371
  this.records.splice(this.records.indexOf(record), 1);
260
- this.reconcileStickyRecords();
372
+ this.scheduleReconcile();
261
373
  return true;
262
374
  }
263
375
  nextStickyHeaderY(index) {
@@ -272,8 +384,24 @@ export class ScrollViewProjectionController {
272
384
  if (this.headerLayoutYs.get(index) === y)
273
385
  return;
274
386
  this.headerLayoutYs.set(index, y);
275
- for (const record of this.records)
276
- record.sticky?.rebuild();
387
+ // EXACTLY ONE wrapper reads this value. `nextStickyHeaderY(i)` returns the first sticky index
388
+ // greater than i, so `index` is the "next header" of the closest sticky index BELOW it and of
389
+ // no one else. Broadcasting to all of them instead cost O(N) per layout and O(N^2) to settle a
390
+ // screen - 200 headers answered "ranges unchanged, skipped rebuild" 199 times per layout event,
391
+ // 40 000 dispatches to lay out the benchmark screen's PATH A.
392
+ const stickyIndices = this.config.stickyHeaderIndices ?? [];
393
+ let previous;
394
+ // Same ascending-order assumption nextStickyHeaderY already makes.
395
+ for (const entry of stickyIndices) {
396
+ if (entry >= index)
397
+ break;
398
+ previous = entry;
399
+ }
400
+ if (previous === undefined)
401
+ return;
402
+ this.records
403
+ .find(record => record.stickyIndex === previous)
404
+ ?.sticky?.rebuild();
277
405
  }
278
406
  insertRecord(parent, record, beforeRecord, insert) {
279
407
  const before = beforeRecord === undefined ? undefined : directNode(beforeRecord);
@@ -284,19 +412,28 @@ export class ScrollViewProjectionController {
284
412
  else
285
413
  insert(parent, record.child, before);
286
414
  }
287
- reconcileStickyRecords() {
415
+ // notifyAll re-dispatches every sticky wrapper's inputs. Only a CONFIG change needs that
416
+ // (scrollViewHeight / invertStickyHeaders arrive through update() and reach the wrappers nowhere
417
+ // else). An INSERT must not: this walk runs once per projected child, so notifying N wrappers on
418
+ // each of M inserts is M x N - 801 x 200 = 160 200 dispatches to mount the benchmark screen's
419
+ // PATH A, versus 70 x 3 = 210 on the canary, which is why only the big screen dies. The two input
420
+ // changes an insert can actually cause are covered without a broadcast: a shifted childIndex by
421
+ // the stickyIndex branch below, and a moved neighbour by recordHeaderLayoutY.
422
+ reconcileStickyRecords(notifyAll = false) {
288
423
  if (this.contentNode === undefined)
289
424
  return;
290
425
  const seq = ++this.reconcileSeq;
291
426
  dlog(() => `STICKY[proj#${this.instanceId}] reconcile#${seq} records=${this.records.length} ` +
292
427
  `children=${this.contentNode?.children.length} sticky=${JSON.stringify(this.config.stickyHeaderIndices ?? [])}`);
293
428
  const stickyIndices = new Set(this.config.stickyHeaderIndices ?? []);
294
- if (this.config.customStickyHeaderComponent !== undefined && stickyIndices.size > 0) {
429
+ if (this.config.customStickyHeaderComponent !== undefined &&
430
+ stickyIndices.size > 0) {
295
431
  dlog('STICKY[proj] uses built-in sticky wrapper; custom StickyHeaderComponent is explicit-composition only');
296
432
  }
297
433
  let paintIndex = 0;
298
434
  for (const record of [...this.records]) {
299
- if (this.config.excludeRefreshControl && isProjectedRefreshControl(record.child)) {
435
+ if (this.config.excludeRefreshControl &&
436
+ isProjectedRefreshControl(record.child)) {
300
437
  // Removed INLINE, not through removeProjectedChild: that method ends with its own
301
438
  // reconcileStickyRecords(), so calling it from inside this walk re-enters the walk while
302
439
  // this.records is being spliced under it - one refresh control could then drive an
@@ -317,13 +454,28 @@ export class ScrollViewProjectionController {
317
454
  else if (!shouldWrap && record.wrapper !== undefined)
318
455
  this.unwrapRecord(record);
319
456
  else if (shouldWrap && record.stickyIndex !== childIndex) {
320
- record.sticky?.destroy();
321
- record.sticky = new StickyProjectionWrapper(this, childIndex, directNode(record));
457
+ countAngular('stickyWrapperReuses');
458
+ record.sticky?.setChildIndex(childIndex);
322
459
  record.stickyIndex = childIndex;
323
460
  }
324
- else if (shouldWrap)
461
+ else if (shouldWrap && notifyAll)
325
462
  record.sticky?.rebuild();
326
463
  }
464
+ // `paintIndex` above is counted off RECORDS, but the screen paints `contentNode.children`. The
465
+ // reconcile line at the top prints only the two COUNTS, which stay equal under any permutation
466
+ // - so it can never see this. Once the orders diverge, every sticky index addresses the wrong
467
+ // child and each wrap moves another node, so the fault compounds with scroll distance instead
468
+ // of correcting itself. Guarded by isDebug because it walks both lists.
469
+ if (!isDebug())
470
+ return;
471
+ const expected = this.records.map(record => directNode(record));
472
+ const painted = this.contentNode?.children ?? [];
473
+ const at = expected.findIndex((node, index) => node !== painted[index]);
474
+ if (at >= 0 || expected.length !== painted.length) {
475
+ dlog(`STICKY[proj#${this.instanceId}] ORDER DIVERGED at ${at} ` +
476
+ `records=${expected.length} painted=${painted.length} ` +
477
+ `expected=${expected[at]?.component ?? 'none'} painted=${painted[at]?.component ?? 'none'}`);
478
+ }
327
479
  }
328
480
  // The removal half of removeProjectedChild, without its trailing reconcile - safe to call from
329
481
  // inside the reconcile walk itself.
@@ -331,7 +483,7 @@ export class ScrollViewProjectionController {
331
483
  if (this.contentNode === undefined)
332
484
  return;
333
485
  record.sticky?.destroy();
334
- projectedWrappers.delete(record.child);
486
+ projectedOwners.delete(record.child);
335
487
  const direct = directNode(record);
336
488
  if (direct.parent === this.contentNode)
337
489
  removeChild(this.contentNode, direct);
@@ -350,22 +502,42 @@ export class ScrollViewProjectionController {
350
502
  if (this.contentNode === undefined)
351
503
  return;
352
504
  const wrapper = createViewNode();
353
- const currentParent = record.child.parent;
354
- const currentIndex = currentParent?.children.indexOf(record.child) ?? -1;
355
- if (currentParent === this.contentNode && currentIndex >= 0) {
356
- insertBefore(this.contentNode, wrapper, record.child);
357
- removeChild(this.contentNode, record.child);
358
- }
359
- else {
505
+ // The slot comes from `records`, the list that always knows where this record sits, never from
506
+ // the child's own current parent. Read off the child, a child not sitting DIRECTLY in the content
507
+ // has no slot to give up and the wrapper lands at the END - the wrapped cell jumps to the bottom
508
+ // of the scroll content, a silent reordering that compounds with scroll distance instead of
509
+ // correcting itself, and a windowed list reaches that state routinely. Angular CDK carries the
510
+ // same warning at its own insert site: insert AT the index, never insert-then-move, because an
511
+ // extra anchor node in between throws the move off (`cdk/scrolling/virtual-for-of.ts`,
512
+ // `_getEmbeddedViewArgs`) - and this file's tree is full of anchors.
513
+ //
514
+ // Order is load-bearing: place the wrapper at the slot FIRST, then move the child into it. The
515
+ // engine's appendChild detaches the child from its old parent, so the wrapper slides into the
516
+ // position the child vacates and no explicit removeChild is needed.
517
+ const after = this.nextDirectAfter(record);
518
+ if (after === undefined)
360
519
  appendChild(this.contentNode, wrapper);
361
- }
520
+ else
521
+ insertBefore(this.contentNode, wrapper, after);
362
522
  appendChild(wrapper, record.child);
363
523
  record.wrapper = wrapper;
524
+ countAngular('stickyWrapperCreates');
364
525
  record.sticky = new StickyProjectionWrapper(this, childIndex, wrapper);
365
526
  record.stickyIndex = childIndex;
366
- projectedWrappers.set(record.child, record);
367
527
  dlog(`STICKY[proj#${this.instanceId}] WRAP child=${record.child.component} paintIndex=${childIndex}`);
368
528
  }
529
+ // The painted node of the first record AFTER `record` that is actually parented to the content —
530
+ // i.e. the anchor the wrapper must be inserted before. Records whose node has not been inserted
531
+ // yet are skipped rather than treated as a slot: a record exists from the moment the renderer
532
+ // reports the child, which can precede its placement.
533
+ nextDirectAfter(record) {
534
+ for (let index = this.records.indexOf(record) + 1; index < this.records.length; index += 1) {
535
+ const node = directNode(this.records[index]);
536
+ if (node.parent === this.contentNode)
537
+ return node;
538
+ }
539
+ return undefined;
540
+ }
369
541
  unwrapRecord(record) {
370
542
  if (this.contentNode === undefined || record.wrapper === undefined)
371
543
  return;
@@ -377,19 +549,12 @@ export class ScrollViewProjectionController {
377
549
  insertBefore(this.contentNode, record.child, wrapper);
378
550
  removeChild(this.contentNode, wrapper);
379
551
  record.wrapper = undefined;
380
- projectedWrappers.delete(record.child);
381
552
  }
382
553
  }
383
554
  export function getScrollViewProjection(node) {
384
555
  return contentProjection.get(node);
385
556
  }
386
557
  export function removeScrollViewProjectedChild(child, remove) {
387
- const record = projectedWrappers.get(child);
388
- if (record === undefined)
389
- return false;
390
- const controller = record.wrapper?.parent
391
- ? contentProjection.get(record.wrapper.parent)
392
- : undefined;
393
- return controller?.removeProjectedChild(child, remove) ?? false;
558
+ return (projectedOwners.get(child)?.removeProjectedChild(child, remove) ?? false);
394
559
  }
395
560
  //# sourceMappingURL=projection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../../src/components/scroll-view/projection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../../src/components/scroll-view/projection.ts"],"names":[],"mappings":"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"}
@@ -144,6 +144,7 @@ export declare abstract class ScrollViewBase implements IAngularScrollViewInputs
144
144
  readonly accessibilityTap: EventEmitter<ISymbioteEvent>;
145
145
  readonly magicTap: EventEmitter<ISymbioteEvent>;
146
146
  readonly accessibilityEscape: EventEmitter<ISymbioteEvent>;
147
+ private readonly gateDemand;
147
148
  testID: string | undefined;
148
149
  nativeID: string | undefined;
149
150
  accessible: boolean | undefined;
@@ -212,6 +213,7 @@ export declare abstract class ScrollViewBase implements IAngularScrollViewInputs
212
213
  private refreshControlProps;
213
214
  get hasProjectedRefreshControl(): boolean;
214
215
  readonly contentProps: import("@angular/core").Signal<Record<string, unknown>>;
216
+ private gatedAccessibilityCallback;
215
217
  private emitterCallback;
216
218
  private stickyOnScrollHandler;
217
219
  private get hostNode();
@@ -19,6 +19,7 @@ import { Directive, computed, signal, ElementRef, EventEmitter, Output, ViewChil
19
19
  import { attachStickyScroll, buildScrollViewHandle, didContentSizeChange, forwardScrollEvent, readLayoutDimension, resolveAccessibilityProps, resolveDecelerationRate, resolveScrollForwarding, selectScrollIntrinsics, splitLayoutProps, } from '@symbiote-native/components';
20
20
  import { AnimatedValue, dlog, event as animatedEvent, isNativeAnimatedAvailable, isSymbioteNode, resolveClassName, whenCommitted, } from '@symbiote-native/engine';
21
21
  import { anchorHostStyle, SymbioteHostPropsDirective } from '../../primitives';
22
+ import { gateWanted, injectGateDemand, } from '../../gate-demand';
22
23
  import { RefreshControl } from '../refresh-control';
23
24
  import { ScrollViewProjectionController } from './projection';
24
25
  import * as i0 from "@angular/core";
@@ -209,6 +210,9 @@ export class ScrollViewBase {
209
210
  accessibilityTap = new EventEmitter();
210
211
  magicTap = new EventEmitter();
211
212
  accessibilityEscape = new EventEmitter();
213
+ // Null unless an adapter wrapper renders this ScrollView in its own template — VirtualizedList
214
+ // does. An app's own `<ScrollView>` gets null and answers from its own `.observed`.
215
+ gateDemand = injectGateDemand();
212
216
  testID;
213
217
  nativeID;
214
218
  accessible;
@@ -350,7 +354,8 @@ export class ScrollViewBase {
350
354
  return value;
351
355
  }
352
356
  get hasStickyHeaders() {
353
- return this.stickyHeaderIndices !== undefined && this.stickyHeaderIndices.length > 0;
357
+ return (this.stickyHeaderIndices !== undefined &&
358
+ this.stickyHeaderIndices.length > 0);
354
359
  }
355
360
  // A class-name string resolves through the shared registry before it reaches
356
361
  // selectScrollIntrinsics, which only understands style objects/arrays.
@@ -360,8 +365,7 @@ export class ScrollViewBase {
360
365
  : this.contentContainerStyle;
361
366
  }
362
367
  get scrollViewBaseStyle() {
363
- return selectScrollIntrinsics(this.isHorizontal, this.resolvedContentContainerStyle)
364
- .scrollViewBaseStyle;
368
+ return selectScrollIntrinsics(this.isHorizontal, this.resolvedContentContainerStyle).scrollViewBaseStyle;
365
369
  }
366
370
  // Bridges non-reactive @Input fields into the reactive graph, so a computed() can memoize a
367
371
  // bag derived from them. Signal inputs would make this unnecessary, but `input()` is visible
@@ -433,10 +437,10 @@ export class ScrollViewBase {
433
437
  onMomentumScrollBegin: this.onMomentumScrollBegin,
434
438
  onMomentumScrollEnd: this.onMomentumScrollEnd,
435
439
  onScrollToTop: this.emitterCallback(this.scrollToTop),
436
- onAccessibilityAction: this.emitterCallback(this.accessibilityAction),
437
- onAccessibilityTap: this.emitterCallback(this.accessibilityTap),
438
- onMagicTap: this.emitterCallback(this.magicTap),
439
- onAccessibilityEscape: this.emitterCallback(this.accessibilityEscape),
440
+ onAccessibilityAction: this.gatedAccessibilityCallback('accessibilityAction'),
441
+ onAccessibilityTap: this.gatedAccessibilityCallback('accessibilityTap'),
442
+ onMagicTap: this.gatedAccessibilityCallback('magicTap'),
443
+ onAccessibilityEscape: this.gatedAccessibilityCallback('accessibilityEscape'),
440
444
  });
441
445
  // RN defaults nested scrolling ON (ScrollView.js `nestedScrollEnabled ?? true`); Android needs
442
446
  // it to scroll a nested scrollable independently, iOS handles nesting natively (a no-op there).
@@ -576,8 +580,12 @@ export class ScrollViewBase {
576
580
  contentProps = computed(() => {
577
581
  this.inputsRevision();
578
582
  const { contentStyle } = selectScrollIntrinsics(this.isHorizontal, this.resolvedContentContainerStyle);
579
- const bag = { style: contentStyle, collapsable: false };
580
- if (this.maintainVisibleContentPosition !== undefined || this.snapToAlignment !== undefined) {
583
+ const bag = {
584
+ style: contentStyle,
585
+ collapsable: false,
586
+ };
587
+ if (this.maintainVisibleContentPosition !== undefined ||
588
+ this.snapToAlignment !== undefined) {
581
589
  bag.collapsableChildren = false;
582
590
  }
583
591
  bag.onLayout = this.handleContentLayout;
@@ -594,6 +602,18 @@ export class ScrollViewBase {
594
602
  // subscribes a template's (event) listeners in its CREATION pass, before any input is written and
595
603
  // before this component's own view is first refreshed - so `observed` is already settled at the
596
604
  // first evaluation and cannot flip afterwards without destroying the whole component.
605
+ // The four GATED accessibility events, which `emitterCallback` cannot answer alone: VirtualizedList
606
+ // renders this component and binds all four, so `.observed` is true on every list in the app
607
+ // whether or not anything listens. A demand from above decides instead — see `gate-demand.ts`.
608
+ //
609
+ // Deliberately NOT applied to the projected RefreshControl's four, one site below: that emitter
610
+ // belongs to a component the APP wrote and projected in, so its `.observed` is honest.
611
+ gatedAccessibilityCallback(name) {
612
+ const emitter = this[name];
613
+ if (!gateWanted(this.gateDemand, name, emitter))
614
+ return undefined;
615
+ return this.emitterCallback(emitter);
616
+ }
597
617
  emitterCallback(emitter) {
598
618
  if (!emitter.observed)
599
619
  return undefined;
@@ -612,7 +632,9 @@ export class ScrollViewBase {
612
632
  this.cachedStickyOnScrollSource = userOnScroll;
613
633
  this.cachedStickyOnScrollHandler = animatedEvent([{ nativeEvent: { contentOffset: { y: this.scrollAnimatedValue } } }], userOnScroll === undefined
614
634
  ? undefined
615
- : { listener: (...args) => forwardScrollEvent(userOnScroll, args) });
635
+ : {
636
+ listener: (...args) => forwardScrollEvent(userOnScroll, args),
637
+ });
616
638
  }
617
639
  return this.cachedStickyOnScrollHandler;
618
640
  }
@@ -657,6 +679,20 @@ export class ScrollViewBase {
657
679
  // actually moved, so `signal.set`'s own Object.is check makes an unchanged poll dirty nothing.
658
680
  ngDoCheck() {
659
681
  this.anchorStyle.set(anchorHostStyle(this.elementRef));
682
+ // The attach can want a node that does not exist yet, and nothing else would ask again.
683
+ // ngOnChanges covers "indices arrived late"; it does NOT cover "indices arrived late AND the host
684
+ // node had not committed yet", which is exactly what a VirtualizedList does - it derives
685
+ // stickyHeaderIndices from the measured window, so they land after this component's
686
+ // ngAfterViewInit and before its host node resolves. Device-diagnosed 2026-08-18 on
687
+ // examples/angular BenchmarkScreen STICKY PATH B, whose log ends on `attachSticky NOT attaching
688
+ // (wantsAttach=true hasNode=false)` - sticky never turned on, while PATH A (literal indices in
689
+ // the template) worked because ngAfterViewInit already saw a node. Retried ONLY from that stuck
690
+ // state, so a settled ScrollView pays nothing per check. Device-verified the same day.
691
+ // Not covered headless: sticky-native-attach.test.ts's late-indices case has its node resolved by
692
+ // the time the indices land, and the deferred-creation ordering under `@if` never rendered the
693
+ // ScrollView at all.
694
+ if (this.stickyAttachedEnabled && this.stickyAttachedNode === null)
695
+ this.attachSticky();
660
696
  }
661
697
  // The projected RefreshControl is a @ContentChild, not an @Input, so ngOnChanges never fires when
662
698
  // one is added or removed at the use site - and `excludeRefreshControl` decides whether the
@@ -701,7 +737,8 @@ export class ScrollViewBase {
701
737
  // Nothing that decides the attach has changed - return rather than detach and rebind the
702
738
  // native scroll event, which every unrelated @Input change would otherwise churn now that
703
739
  // ngOnChanges drives this too.
704
- if (wantsAttach === this.stickyAttachedEnabled && node === this.stickyAttachedNode) {
740
+ if (wantsAttach === this.stickyAttachedEnabled &&
741
+ node === this.stickyAttachedNode) {
705
742
  dlog('STICKY[sv] attachSticky skipped (nothing about the attach changed)');
706
743
  return;
707
744
  }