@symbiote-native/angular 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/build/angular/bootstrap.js +1 -1
- package/build/angular/bootstrap.js.map +1 -1
- package/build/angular/components/activity-indicator/index.android.js +7 -2
- package/build/angular/components/activity-indicator/index.android.js.map +1 -1
- package/build/angular/components/activity-indicator/index.ios.js +3 -1
- package/build/angular/components/activity-indicator/index.ios.js.map +1 -1
- package/build/angular/components/activity-indicator/shared.d.ts +1 -1
- package/build/angular/components/activity-indicator/shared.js +1 -1
- package/build/angular/components/activity-indicator/shared.js.map +1 -1
- package/build/angular/components/button.js +13 -5
- package/build/angular/components/button.js.map +1 -1
- package/build/angular/components/flat-list/index.d.ts +1 -1
- package/build/angular/components/flat-list/index.js +47 -14
- package/build/angular/components/flat-list/index.js.map +1 -1
- package/build/angular/components/image/index.android.js +4 -2
- package/build/angular/components/image/index.android.js.map +1 -1
- package/build/angular/components/image/index.ios.js +4 -2
- package/build/angular/components/image/index.ios.js.map +1 -1
- package/build/angular/components/image/shared.js +18 -6
- package/build/angular/components/image/shared.js.map +1 -1
- package/build/angular/components/image-background.js +22 -8
- package/build/angular/components/image-background.js.map +1 -1
- package/build/angular/components/input-accessory-view/index.js +7 -2
- package/build/angular/components/input-accessory-view/index.js.map +1 -1
- package/build/angular/components/keyboard-avoiding-view/index.d.ts +1 -0
- package/build/angular/components/keyboard-avoiding-view/index.js +39 -9
- package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
- package/build/angular/components/modal/index.js +7 -2
- package/build/angular/components/modal/index.js.map +1 -1
- package/build/angular/components/pressable/index.d.ts +1 -1
- package/build/angular/components/pressable/index.js +6 -2
- package/build/angular/components/pressable/index.js.map +1 -1
- package/build/angular/components/refresh-control/index.js +3 -1
- package/build/angular/components/refresh-control/index.js.map +1 -1
- package/build/angular/components/safe-area-view/index.js +3 -1
- package/build/angular/components/safe-area-view/index.js.map +1 -1
- package/build/angular/components/scroll-view/index.android.js +44 -14
- package/build/angular/components/scroll-view/index.android.js.map +1 -1
- package/build/angular/components/scroll-view/index.ios.js +13 -5
- package/build/angular/components/scroll-view/index.ios.js.map +1 -1
- package/build/angular/components/scroll-view/projection.d.ts +32 -0
- package/build/angular/components/scroll-view/projection.js +212 -47
- package/build/angular/components/scroll-view/projection.js.map +1 -1
- package/build/angular/components/scroll-view/shared.js +28 -7
- package/build/angular/components/scroll-view/shared.js.map +1 -1
- package/build/angular/components/scroll-view/sticky-header.js +7 -3
- package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
- package/build/angular/components/section-list/index.d.ts +6 -1
- package/build/angular/components/section-list/index.js +63 -18
- package/build/angular/components/section-list/index.js.map +1 -1
- package/build/angular/components/switch/index.android.js +17 -3
- package/build/angular/components/switch/index.android.js.map +1 -1
- package/build/angular/components/switch/index.ios.js +17 -3
- package/build/angular/components/switch/index.ios.js.map +1 -1
- package/build/angular/components/switch/shared.d.ts +1 -1
- package/build/angular/components/switch/shared.js +5 -2
- package/build/angular/components/switch/shared.js.map +1 -1
- package/build/angular/components/text-input.d.ts +1 -1
- package/build/angular/components/text-input.js +25 -5
- package/build/angular/components/text-input.js.map +1 -1
- package/build/angular/components/touchable/index.d.ts +29 -7
- package/build/angular/components/touchable/index.js +246 -69
- package/build/angular/components/touchable/index.js.map +1 -1
- package/build/angular/components/touchable-native-feedback/index.js +2 -2
- package/build/angular/components/touchable-native-feedback/index.js.map +1 -1
- package/build/angular/components/virtualized-list/directives.js +4 -0
- package/build/angular/components/virtualized-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-list/index.d.ts +5 -2
- package/build/angular/components/virtualized-list/index.js +197 -60
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.d.ts +18 -1
- package/build/angular/components/virtualized-section-list/index.js +90 -21
- package/build/angular/components/virtualized-section-list/index.js.map +1 -1
- package/build/angular/components.d.ts +1 -1
- package/build/angular/components.js.map +1 -1
- package/build/angular/create-portal/index.js +5 -1
- package/build/angular/create-portal/index.js.map +1 -1
- package/build/angular/create-tunnel/index.js.map +1 -1
- package/build/angular/descriptor-to-angular/index.js +3 -1
- package/build/angular/descriptor-to-angular/index.js.map +1 -1
- package/build/angular/diagnostics.d.ts +33 -0
- package/build/angular/diagnostics.js +82 -0
- package/build/angular/diagnostics.js.map +1 -0
- package/build/angular/host-instance/index.js +1 -1
- package/build/angular/host-instance/index.js.map +1 -1
- package/build/angular/index.d.ts +5 -2
- package/build/angular/index.js +15 -1
- package/build/angular/index.js.map +1 -1
- package/build/angular/modules/animated/create-animated-component.js +27 -9
- package/build/angular/modules/animated/create-animated-component.js.map +1 -1
- package/build/angular/modules/app-registry/index.js.map +1 -1
- package/build/angular/modules/status-bar/index.js +1 -1
- package/build/angular/modules/status-bar/index.js.map +1 -1
- package/build/angular/primitives/index.d.ts +19 -2
- package/build/angular/primitives/index.js +39 -3
- package/build/angular/primitives/index.js.map +1 -1
- package/build/angular/primitives/shared.d.ts +9 -1
- package/build/angular/primitives/shared.js +49 -3
- package/build/angular/primitives/shared.js.map +1 -1
- package/build/angular/render/index.js +48 -5
- package/build/angular/render/index.js.map +1 -1
- package/build/angular/renderer/index.d.ts +1 -0
- package/build/angular/renderer/index.js +37 -2
- package/build/angular/renderer/index.js.map +1 -1
- package/build/angular/services/color-scheme.service.js.map +1 -1
- package/build/angular/services/window-dimensions.service.js +1 -1
- package/build/angular/services/window-dimensions.service.js.map +1 -1
- package/package.json +5 -5
- package/src/bootstrap.ts +4 -1
- package/src/components/activity-indicator/index.android.ts +7 -2
- package/src/components/activity-indicator/index.ios.ts +3 -1
- package/src/components/activity-indicator/shared.ts +32 -13
- package/src/components/button.ts +19 -6
- package/src/components/flat-list/index.ts +91 -29
- package/src/components/image/index.android.ts +9 -2
- package/src/components/image/index.ios.ts +9 -2
- package/src/components/image/shared.ts +58 -19
- package/src/components/image-background.ts +29 -10
- package/src/components/input-accessory-view/index.ts +27 -10
- package/src/components/keyboard-avoiding-view/index.ts +55 -15
- package/src/components/modal/index.ts +22 -8
- package/src/components/pressable/index.ts +51 -21
- package/src/components/refresh-control/index.ts +22 -8
- package/src/components/safe-area-view/index.ts +16 -7
- package/src/components/scroll-view/index.android.ts +31 -9
- package/src/components/scroll-view/index.ios.ts +17 -4
- package/src/components/scroll-view/projection.ts +290 -63
- package/src/components/scroll-view/shared.ts +93 -26
- package/src/components/scroll-view/sticky-header.ts +25 -8
- package/src/components/section-list/index.ts +61 -19
- package/src/components/switch/index.android.ts +14 -3
- package/src/components/switch/index.ios.ts +14 -3
- package/src/components/switch/shared.ts +15 -4
- package/src/components/text-input.ts +45 -13
- package/src/components/touchable/index.ts +296 -72
- package/src/components/touchable-native-feedback/index.ts +32 -10
- package/src/components/virtualized-list/directives.ts +19 -5
- package/src/components/virtualized-list/index.ts +274 -72
- package/src/components/virtualized-section-list/directives.ts +6 -3
- package/src/components/virtualized-section-list/index.ts +146 -34
- package/src/components.ts +4 -1
- package/src/create-portal/index.ts +8 -2
- package/src/create-tunnel/index.ts +3 -1
- package/src/descriptor-to-angular/index.ts +29 -8
- package/src/diagnostics.ts +138 -0
- package/src/host-instance/index.ts +9 -3
- package/src/index.ts +31 -2
- package/src/modules/animated/create-animated-component.ts +44 -15
- package/src/modules/app-registry/index.ts +3 -1
- package/src/modules/status-bar/index.ts +13 -4
- package/src/primitives/index.ts +46 -2
- package/src/primitives/shared.ts +70 -9
- package/src/render/index.ts +56 -6
- package/src/renderer/index.ts +76 -14
- package/src/services/color-scheme.service.ts +3 -1
- package/src/services/window-dimensions.service.ts +11 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/touchable-native-feedback/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,iGAAiG;AACjG,4FAA4F;AAC5F,+EAA+E;AAC/E,kGAAkG;AAClG,6FAA6F;AAC7F,gFAAgF;AAChF,iGAAiG;AACjG,2CAA2C;AAC3C,EAAE;AACF,yFAAyF;AACzF,gGAAgG;AAChG,mGAAmG;AACnG,iGAAiG;AACjG,kGAAkG;AAClG,2FAA2F;AAE3F,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,SAAS,EACT,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,GAGP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,iCAAiC,EACjC,gBAAgB,EAChB,oBAAoB,EACpB,8BAA8B,GAO/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/touchable-native-feedback/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
// context change (no churn of the cell's own view across windowing recomputes).
|
|
26
26
|
import { Directive, Input, TemplateRef, ViewContainerRef, inject, } from '@angular/core';
|
|
27
27
|
import { dlog } from '@symbiote-native/engine';
|
|
28
|
+
import { countAngular } from '../../diagnostics';
|
|
28
29
|
import * as i0 from "@angular/core";
|
|
29
30
|
let vListOutletInstanceCounter = 0;
|
|
30
31
|
function isRecord(value) {
|
|
@@ -103,6 +104,7 @@ export class VListOutletDirective {
|
|
|
103
104
|
if (changes['templateRef'] !== undefined) {
|
|
104
105
|
dlog(`Angular VListOutlet#${this.instanceId} templateRef CHANGED (was=${changes['templateRef'].previousValue !== undefined} now=${this.templateRef !== undefined}) -> clear + recreate`);
|
|
105
106
|
this.viewContainer.clear();
|
|
107
|
+
countAngular('outletCreates');
|
|
106
108
|
this.viewRef =
|
|
107
109
|
this.templateRef === undefined
|
|
108
110
|
? null
|
|
@@ -110,12 +112,14 @@ export class VListOutletDirective {
|
|
|
110
112
|
return;
|
|
111
113
|
}
|
|
112
114
|
if (this.viewRef !== null && this.context !== undefined) {
|
|
115
|
+
countAngular('outletUpdates');
|
|
113
116
|
dlog(`Angular VListOutlet#${this.instanceId} context updated, markForCheck`);
|
|
114
117
|
this.updateContext(this.viewRef.context, this.context);
|
|
115
118
|
this.viewRef.markForCheck();
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
ngOnDestroy() {
|
|
122
|
+
countAngular('outletDestroys');
|
|
119
123
|
dlog(`Angular VListOutlet#${this.instanceId} destroyed`);
|
|
120
124
|
this.viewContainer.clear();
|
|
121
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../../../src/components/virtualized-list/directives.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,wFAAwF;AACxF,wFAAwF;AACxF,uFAAuF;AACvF,uFAAuF;AACvF,uFAAuF;AACvF,uDAAuD;AACvD,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,sGAAsG;AACtG,iDAAiD;AACjD,iDAAiD;AACjD,gDAAgD;AAChD,gHAAgH;AAChH,uBAAuB;AACvB,EAAE;AACF,wFAAwF;AACxF,gGAAgG;AAChG,EAAE;AACF,8FAA8F;AAC9F,+FAA+F;AAC/F,uFAAuF;AACvF,6FAA6F;AAC7F,gFAAgF;AAEhF,OAAO,EACL,SAAS,EACT,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,MAAM,GAKP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC
|
|
1
|
+
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../../../src/components/virtualized-list/directives.ts"],"names":[],"mappings":"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"}
|
|
@@ -187,11 +187,13 @@ export declare class VirtualizedList<ItemT = unknown> implements IVirtualizedLis
|
|
|
187
187
|
private readonly listState;
|
|
188
188
|
private renderVersion;
|
|
189
189
|
private readonly cellMeasures;
|
|
190
|
+
private cellContexts;
|
|
191
|
+
private nextCellContexts;
|
|
192
|
+
private cellContextEpoch;
|
|
190
193
|
private readonly separatorOverrides;
|
|
191
194
|
private viewableTimer;
|
|
192
195
|
private batchTimer;
|
|
193
196
|
private lastEffectSignature;
|
|
194
|
-
private lastRenderSignature;
|
|
195
197
|
private lastRecompute;
|
|
196
198
|
private readonly cdr;
|
|
197
199
|
private readonly elementRef;
|
|
@@ -216,7 +218,7 @@ export declare class VirtualizedList<ItemT = unknown> implements IVirtualizedLis
|
|
|
216
218
|
private keyFor;
|
|
217
219
|
private buildInputs;
|
|
218
220
|
private dispatch;
|
|
219
|
-
private
|
|
221
|
+
private isWindowSettled;
|
|
220
222
|
private runEffects;
|
|
221
223
|
ngOnChanges(): void;
|
|
222
224
|
ngDoCheck(): void;
|
|
@@ -224,6 +226,7 @@ export declare class VirtualizedList<ItemT = unknown> implements IVirtualizedLis
|
|
|
224
226
|
ngOnDestroy(): void;
|
|
225
227
|
private recomputeView;
|
|
226
228
|
private buildWindowCell;
|
|
229
|
+
private contextFor;
|
|
227
230
|
private buildSeparatorContext;
|
|
228
231
|
private spacerStyle;
|
|
229
232
|
private cellMeasure;
|
|
@@ -24,11 +24,12 @@
|
|
|
24
24
|
// Lists have no Descriptor render fn — the cell content is the framework's own children.
|
|
25
25
|
// Cells/spacers are plain symbiote-view host elements.
|
|
26
26
|
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Output, ViewChild, computed, inject, signal, } from '@angular/core';
|
|
27
|
-
import { DEFAULT_END_REACHED_THRESHOLD, DEFAULT_INITIAL_NUM_TO_RENDER, DEFAULT_MAX_TO_RENDER_PER_BATCH, DEFAULT_START_REACHED_THRESHOLD, DEFAULT_UPDATE_CELLS_BATCHING_PERIOD, DEFAULT_WINDOW_SIZE, EMPTY_OFFSET, FIRST_INDEX, INVERTED_X_STYLE, INVERTED_Y_STYLE, buildListPlan, buildViewabilityPairs, createInitialListState, isSeparatorGapInRange, listEffectSignature, readLayoutLength, readScrollOffset, reduceList, resolveAccessibilityProps, resolveItemKey, } from '@symbiote-native/components';
|
|
27
|
+
import { DEFAULT_END_REACHED_THRESHOLD, DEFAULT_INITIAL_NUM_TO_RENDER, DEFAULT_MAX_TO_RENDER_PER_BATCH, DEFAULT_START_REACHED_THRESHOLD, DEFAULT_UPDATE_CELLS_BATCHING_PERIOD, DEFAULT_WINDOW_SIZE, EMPTY_OFFSET, FIRST_INDEX, INVERTED_X_STYLE, INVERTED_Y_STYLE, buildListPlan, buildViewabilityPairs, computeWindow, createInitialListState, isSeparatorGapInRange, listEffectSignature, readLayoutLength, readLayoutOffset, readScrollOffset, reduceList, resolveAccessibilityProps, resolveItemKey, } from '@symbiote-native/components';
|
|
28
28
|
import { dlog, flattenStyle, } from '@symbiote-native/engine';
|
|
29
|
+
import { countAngular } from '../../diagnostics';
|
|
29
30
|
import { ScrollView } from '../scroll-view';
|
|
30
31
|
import { RefreshControl } from '../refresh-control';
|
|
31
|
-
import { anchorHostStyle, SymbioteStyleInputDirective, ViewHost } from '../../primitives';
|
|
32
|
+
import { anchorHostStyle, SymbioteStyleInputDirective, ViewHost, } from '../../primitives';
|
|
32
33
|
import { VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListOutletDirective, VListSeparatorDirective, } from './directives';
|
|
33
34
|
import * as i0 from "@angular/core";
|
|
34
35
|
import * as i1 from "../../primitives/shared";
|
|
@@ -162,6 +163,23 @@ export class VirtualizedList {
|
|
|
162
163
|
listState = createInitialListState();
|
|
163
164
|
renderVersion = EMPTY_OFFSET;
|
|
164
165
|
cellMeasures = new Map();
|
|
166
|
+
// A cell's context object is the ONLY thing its stamped view reads, and VListOutletDirective
|
|
167
|
+
// refreshes that view whenever the object's IDENTITY changes. recomputeView runs on every frame
|
|
168
|
+
// the window moves, so minting a fresh context per cell made a four-row slide cost a refresh of
|
|
169
|
+
// EVERY cell in the window. MEASURED on PATH B geometry (544 entries, 320px viewport, RN
|
|
170
|
+
// defaults), per fling frame: 233-cell window, 4 cells genuinely entering, 228 outlet updates —
|
|
171
|
+
// each one a copyContextFields plus a markForCheck that walks to the root. Solid, same geometry,
|
|
172
|
+
// same shared reducer, same engine output: 4. Handing back the SAME object for a cell whose item
|
|
173
|
+
// and index did not move keeps `[vListOutletContext]` reference-equal, so ngOnChanges never fires
|
|
174
|
+
// for it. The fast adapters get this by construction — Solid's <For> is keyed on the cell KEY
|
|
175
|
+
// strings precisely so "the plan's freshly-built cell objects" cannot rebuild every row
|
|
176
|
+
// (adapters/solid/src/components/virtualized-list/shared.tsx, the cellKeys memo).
|
|
177
|
+
cellContexts = new Map();
|
|
178
|
+
nextCellContexts = new Map();
|
|
179
|
+
// Everything a cell's CONTENT can depend on that is not its own item identity. RN's contract for
|
|
180
|
+
// "re-render the cells, the data object itself did not change" is extraData; without it here an
|
|
181
|
+
// extraData flip would reuse every context and repaint nothing.
|
|
182
|
+
cellContextEpoch = undefined;
|
|
165
183
|
separatorOverrides = new Map();
|
|
166
184
|
// The adapter-owned debounce (minimumViewTime) and incremental-fill timers; the reducer only
|
|
167
185
|
// hands back a delay.
|
|
@@ -169,9 +187,6 @@ export class VirtualizedList {
|
|
|
169
187
|
batchTimer = null;
|
|
170
188
|
// Dedupes the after-commit effects: they run only when the windowing signature changed.
|
|
171
189
|
lastEffectSignature = '';
|
|
172
|
-
// Dedupes dispatch's markForCheck against the RENDERED window (see dispatch below). Distinct from
|
|
173
|
-
// lastEffectSignature, which gates the batch-fill timer and deliberately includes scrollOffset.
|
|
174
|
-
lastRenderSignature = '';
|
|
175
190
|
// Dedupes ngDoCheck's own recompute. WITHOUT this, recomputeView() unconditionally rebuilds
|
|
176
191
|
// windowCells (and each cell's `separators` handle — fresh closures every call) on EVERY CD pass,
|
|
177
192
|
// including ones triggered by something else entirely in the app. A fresh context object flows
|
|
@@ -266,7 +281,7 @@ export class VirtualizedList {
|
|
|
266
281
|
return this.maxToRenderPerBatch ?? DEFAULT_MAX_TO_RENDER_PER_BATCH;
|
|
267
282
|
}
|
|
268
283
|
get updateCellsBatchingPeriodValue() {
|
|
269
|
-
return this.updateCellsBatchingPeriod ?? DEFAULT_UPDATE_CELLS_BATCHING_PERIOD;
|
|
284
|
+
return (this.updateCellsBatchingPeriod ?? DEFAULT_UPDATE_CELLS_BATCHING_PERIOD);
|
|
270
285
|
}
|
|
271
286
|
get onEndReachedThresholdValue() {
|
|
272
287
|
return this.onEndReachedThreshold ?? DEFAULT_END_REACHED_THRESHOLD;
|
|
@@ -278,6 +293,7 @@ export class VirtualizedList {
|
|
|
278
293
|
// flow through it, which an @Output() can't carry), so this is a stable arrow field passed
|
|
279
294
|
// straight to [onScroll]. onLayout is a real @Output() now, bound via (layout)="onLayoutTick($event)".
|
|
280
295
|
onScrollTick = (event) => {
|
|
296
|
+
countAngular('scrollTicks');
|
|
281
297
|
const offset = readScrollOffset(event, this.isHorizontal);
|
|
282
298
|
if (offset === undefined)
|
|
283
299
|
return;
|
|
@@ -352,20 +368,43 @@ export class VirtualizedList {
|
|
|
352
368
|
if (!result.changed)
|
|
353
369
|
return;
|
|
354
370
|
this.renderVersion += 1;
|
|
355
|
-
|
|
356
|
-
// end-reached distance, viewability and the batch-fill timer, all handled above in runEffects.
|
|
357
|
-
// The TEMPLATE reads none of those; it reads the window. Marking on the offset repainted the
|
|
358
|
-
// whole ancestor chain 60 times a second on a sticky screen for a window that had not moved.
|
|
359
|
-
const signature = this.renderSignature();
|
|
360
|
-
if (signature === this.lastRenderSignature)
|
|
371
|
+
if (this.isWindowSettled(action))
|
|
361
372
|
return;
|
|
362
|
-
|
|
373
|
+
countAngular('listMarks');
|
|
363
374
|
this.cdr.markForCheck();
|
|
364
375
|
}
|
|
365
|
-
// The
|
|
366
|
-
|
|
376
|
+
// The reducer reports `changed` for EVERY scroll offset - it has to, since the offset feeds
|
|
377
|
+
// end-reached distance, viewability and the batch-fill timer, all handled by runEffects. The
|
|
378
|
+
// TEMPLATE reads none of those; it reads the window. Marking on the offset repainted the whole
|
|
379
|
+
// ancestor chain 60 times a second on a sticky screen for a window that had not moved.
|
|
380
|
+
//
|
|
381
|
+
// So the question here is "would a render leave the window exactly where it is", and it is asked
|
|
382
|
+
// of the state as it is NOW. It must NOT be answered by comparing the last-rendered window with
|
|
383
|
+
// the one before it: that window was derived from the PREVIOUS scroll offset, so once two
|
|
384
|
+
// consecutive derives agree the comparison reads "settled" for every offset that ever follows -
|
|
385
|
+
// no mark, no CD, no ngDoCheck, no refresh-metrics, so the window can never move again and the
|
|
386
|
+
// list goes permanently deaf mid-scroll (device: examples/angular Benchmark sticky path B froze
|
|
387
|
+
// at exactly the window the first viewport asked for, blank below it).
|
|
388
|
+
//
|
|
389
|
+
// computeWindow re-run over the CACHED offset table answers it directly. Two scans, no
|
|
390
|
+
// allocation - buildOffsets, the O(count) allocating half, still runs once per render only. It is
|
|
391
|
+
// the same function the render will use, so this cannot drift away from the window it predicts.
|
|
392
|
+
isWindowSettled(action) {
|
|
393
|
+
// A measurement rewrites the very offset table the prediction reads, so it has no cached
|
|
394
|
+
// geometry to answer from.
|
|
395
|
+
if (action.kind === 'measure')
|
|
396
|
+
return false;
|
|
367
397
|
const m = this.listState.metrics;
|
|
368
|
-
|
|
398
|
+
// Mid-fill: the committed window is still climbing toward target one batch step per render, and
|
|
399
|
+
// only a render advances it. Skipping the mark here is what stalls the incremental fill.
|
|
400
|
+
if (m.first !== m.target.first || m.last !== m.target.last)
|
|
401
|
+
return false;
|
|
402
|
+
const next = computeWindow(m.count, m.offsets, m.lengths, this.listState.scrollOffset, this.listState.viewportLength, this.windowSizeValue, this.initialNumToRenderValue);
|
|
403
|
+
const isSettled = next.first === m.target.first && next.last === m.target.last;
|
|
404
|
+
if (!isSettled)
|
|
405
|
+
dlog(`Angular VirtualizedList window moves [${m.first}, ${m.last}] -> ` +
|
|
406
|
+
`[${next.first}, ${next.last}] at offset ${this.listState.scrollOffset}`);
|
|
407
|
+
return isSettled;
|
|
369
408
|
}
|
|
370
409
|
runEffects(effects, inputs) {
|
|
371
410
|
for (const effect of effects) {
|
|
@@ -377,7 +416,9 @@ export class VirtualizedList {
|
|
|
377
416
|
this.endReached.emit({ distanceFromEnd: effect.distanceFromEnd });
|
|
378
417
|
break;
|
|
379
418
|
case 'fire-start-reached':
|
|
380
|
-
this.startReached.emit({
|
|
419
|
+
this.startReached.emit({
|
|
420
|
+
distanceFromStart: effect.distanceFromStart,
|
|
421
|
+
});
|
|
381
422
|
break;
|
|
382
423
|
case 'fire-scroll-to-index-failed':
|
|
383
424
|
this.scrollToIndexFailed.emit({
|
|
@@ -436,6 +477,7 @@ export class VirtualizedList {
|
|
|
436
477
|
// grows exactly one step per meaningful CD. The projected templates (ContentChild) are resolved
|
|
437
478
|
// from the second CD on; the first paint (count/viewport still 0) corrects on the layout-driven CD.
|
|
438
479
|
ngDoCheck() {
|
|
480
|
+
countAngular('listChecks');
|
|
439
481
|
const recomputeInputs = [
|
|
440
482
|
this.data,
|
|
441
483
|
this.extraData,
|
|
@@ -469,6 +511,7 @@ export class VirtualizedList {
|
|
|
469
511
|
return;
|
|
470
512
|
}
|
|
471
513
|
// The single derive-per-CD: recompute the window off the current state before the view reads it.
|
|
514
|
+
countAngular('listRecomputes');
|
|
472
515
|
reduceList(this.listState, { kind: 'refresh-metrics' }, this.buildInputs());
|
|
473
516
|
this.recomputeView();
|
|
474
517
|
}
|
|
@@ -492,7 +535,9 @@ export class VirtualizedList {
|
|
|
492
535
|
this.itemCount = m.count;
|
|
493
536
|
const hasHeader = this.headerDir !== undefined;
|
|
494
537
|
const hasSeparators = this.separatorDir !== undefined;
|
|
495
|
-
const stickySet = this.stickyHeaderIndices !== undefined
|
|
538
|
+
const stickySet = this.stickyHeaderIndices !== undefined
|
|
539
|
+
? new Set(this.stickyHeaderIndices)
|
|
540
|
+
: undefined;
|
|
496
541
|
this.resolvedContentContainerStyle = this.isHorizontal
|
|
497
542
|
? [this.contentContainerStyle, { width: m.total }]
|
|
498
543
|
: this.contentContainerStyle;
|
|
@@ -512,9 +557,27 @@ export class VirtualizedList {
|
|
|
512
557
|
? undefined
|
|
513
558
|
: {
|
|
514
559
|
...this.maintainVisibleContentPosition,
|
|
515
|
-
minIndexForVisible: this.maintainVisibleContentPosition.minIndexForVisible +
|
|
560
|
+
minIndexForVisible: this.maintainVisibleContentPosition.minIndexForVisible +
|
|
561
|
+
(hasHeader ? 1 : 0),
|
|
516
562
|
};
|
|
563
|
+
// A change in anything a cell's content reads other than its own item invalidates every cached
|
|
564
|
+
// context: identity reuse is only sound while the reused object still describes the cell.
|
|
565
|
+
const epoch = [
|
|
566
|
+
this.data,
|
|
567
|
+
this.extraData,
|
|
568
|
+
this.getItem,
|
|
569
|
+
this.keyExtractor,
|
|
570
|
+
];
|
|
571
|
+
const previousEpoch = this.cellContextEpoch;
|
|
572
|
+
this.cellContextEpoch = epoch;
|
|
573
|
+
if (previousEpoch === undefined ||
|
|
574
|
+
previousEpoch.length !== epoch.length ||
|
|
575
|
+
!previousEpoch.every((value, index) => value === epoch[index])) {
|
|
576
|
+
this.cellContexts.clear();
|
|
577
|
+
}
|
|
517
578
|
if (m.count === FIRST_INDEX) {
|
|
579
|
+
this.cellContexts.clear();
|
|
580
|
+
this.nextCellContexts.clear();
|
|
518
581
|
this.windowCells = [];
|
|
519
582
|
this.forcedStickyCell = null;
|
|
520
583
|
this.leadingSpacerStyle = null;
|
|
@@ -534,13 +597,17 @@ export class VirtualizedList {
|
|
|
534
597
|
keyFor: this.keyFor,
|
|
535
598
|
stickyIndices: stickySet,
|
|
536
599
|
hasHeader,
|
|
537
|
-
hasSeparators,
|
|
538
600
|
});
|
|
539
601
|
this.leadingSpacerStyle =
|
|
540
|
-
plan.leadingExtent > EMPTY_OFFSET
|
|
541
|
-
|
|
602
|
+
plan.leadingExtent > EMPTY_OFFSET
|
|
603
|
+
? this.spacerStyle(plan.leadingExtent)
|
|
604
|
+
: null;
|
|
605
|
+
this.gapSpacerStyle =
|
|
606
|
+
plan.gapExtent > EMPTY_OFFSET ? this.spacerStyle(plan.gapExtent) : null;
|
|
542
607
|
this.trailingSpacerStyle =
|
|
543
|
-
plan.trailingExtent > EMPTY_OFFSET
|
|
608
|
+
plan.trailingExtent > EMPTY_OFFSET
|
|
609
|
+
? this.spacerStyle(plan.trailingExtent)
|
|
610
|
+
: null;
|
|
544
611
|
this.renderedStickyIndices =
|
|
545
612
|
stickySet !== undefined && plan.stickyChildPositions.length > 0
|
|
546
613
|
? plan.stickyChildPositions
|
|
@@ -555,10 +622,19 @@ export class VirtualizedList {
|
|
|
555
622
|
: null;
|
|
556
623
|
const cells = [];
|
|
557
624
|
for (const planned of plan.cells) {
|
|
558
|
-
|
|
625
|
+
// RN gates the separator on the last index of the DATA, not of the WINDOW
|
|
626
|
+
// (VirtualizedList.js:793 `const end = getItemCount(data) - 1`), and now that the separator
|
|
627
|
+
// lives INSIDE the measuring wrapper that distinction is load-bearing: gating on the window
|
|
628
|
+
// would make a cell's own measured height change as the window slides past it. Device-measured
|
|
629
|
+
// 2026-08-19 as a run of cells all shifting by exactly the divider's 1px.
|
|
630
|
+
const includeSeparator = hasSeparators && planned.index < m.count - 1;
|
|
559
631
|
cells.push(this.buildWindowCell(planned.index, planned.key, includeSeparator));
|
|
560
632
|
}
|
|
561
633
|
this.windowCells = cells;
|
|
634
|
+
// Swap, don't prune: a cell that left the window is simply absent from the pass that just ran,
|
|
635
|
+
// so the old map is the garbage and the new one is exactly the live set.
|
|
636
|
+
this.cellContexts = this.nextCellContexts;
|
|
637
|
+
this.nextCellContexts = new Map();
|
|
562
638
|
dlog(`Angular VirtualizedList window [${m.first}, ${m.last}] of ${m.count} ` +
|
|
563
639
|
`(offset=${this.listState.scrollOffset}, viewport=${this.listState.viewportLength}, rendered=${cells.length})`);
|
|
564
640
|
}
|
|
@@ -566,18 +642,32 @@ export class VirtualizedList {
|
|
|
566
642
|
// separator context — so both plan.cells and plan.forcedStickyCell build identically.
|
|
567
643
|
buildWindowCell(index, key, includeSeparator) {
|
|
568
644
|
const item = this.getItem(this.data, index);
|
|
569
|
-
const context = {
|
|
570
|
-
$implicit: item,
|
|
571
|
-
index,
|
|
572
|
-
separators: this.makeSeparators(index),
|
|
573
|
-
};
|
|
574
645
|
return {
|
|
575
646
|
key,
|
|
576
647
|
index,
|
|
577
|
-
context,
|
|
648
|
+
context: this.contextFor(key, index, item),
|
|
578
649
|
measure: this.cellMeasure(index),
|
|
579
|
-
separatorContext: includeSeparator
|
|
650
|
+
separatorContext: includeSeparator
|
|
651
|
+
? this.buildSeparatorContext(index, item)
|
|
652
|
+
: undefined,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
// The context for one cell, reused by identity when the cell did not move. See cellContexts.
|
|
656
|
+
contextFor(key, index, item) {
|
|
657
|
+
const cached = this.cellContexts.get(key);
|
|
658
|
+
if (cached !== undefined &&
|
|
659
|
+
cached.$implicit === item &&
|
|
660
|
+
cached.index === index) {
|
|
661
|
+
this.nextCellContexts.set(key, cached);
|
|
662
|
+
return cached;
|
|
663
|
+
}
|
|
664
|
+
const context = {
|
|
665
|
+
$implicit: item,
|
|
666
|
+
index,
|
|
667
|
+
separators: this.makeSeparators(index),
|
|
580
668
|
};
|
|
669
|
+
this.nextCellContexts.set(key, context);
|
|
670
|
+
return context;
|
|
581
671
|
}
|
|
582
672
|
buildSeparatorContext(index, item) {
|
|
583
673
|
const overrides = this.separatorOverrides.get(index);
|
|
@@ -592,7 +682,9 @@ export class VirtualizedList {
|
|
|
592
682
|
// arbitrary separator props); the typed fields above stay authoritative.
|
|
593
683
|
if (overrides !== undefined) {
|
|
594
684
|
for (const key of Object.keys(overrides)) {
|
|
595
|
-
if (key === 'highlighted' ||
|
|
685
|
+
if (key === 'highlighted' ||
|
|
686
|
+
key === 'leadingItem' ||
|
|
687
|
+
key === 'trailingItem')
|
|
596
688
|
continue;
|
|
597
689
|
context[key] = overrides[key];
|
|
598
690
|
}
|
|
@@ -610,10 +702,11 @@ export class VirtualizedList {
|
|
|
610
702
|
const length = readLayoutLength(event, this.isHorizontal);
|
|
611
703
|
if (length === undefined)
|
|
612
704
|
return;
|
|
613
|
-
|
|
705
|
+
const offset = readLayoutOffset(event, this.isHorizontal);
|
|
706
|
+
dlog(`Angular VirtualizedList cell ${index} measured length=${length} offset=${offset ?? 'none'}`);
|
|
614
707
|
// The reducer guards a fixed getItemLayout and a repeated length; a no-op leaves state and the
|
|
615
708
|
// view untouched (dispatch marks for check only when something changed).
|
|
616
|
-
this.dispatch({ kind: 'measure', index, length });
|
|
709
|
+
this.dispatch({ kind: 'measure', index, length, offset });
|
|
617
710
|
};
|
|
618
711
|
this.cellMeasures.set(index, measure);
|
|
619
712
|
return measure;
|
|
@@ -625,13 +718,16 @@ export class VirtualizedList {
|
|
|
625
718
|
measure(event);
|
|
626
719
|
}
|
|
627
720
|
isSymbioteEvent(value) {
|
|
628
|
-
return typeof value === 'object' && value !== null && 'nativeEvent' in value;
|
|
721
|
+
return (typeof value === 'object' && value !== null && 'nativeEvent' in value);
|
|
629
722
|
}
|
|
630
723
|
mergeSeparator(gapIndex, patch) {
|
|
631
724
|
const count = this.listState.metrics.count;
|
|
632
725
|
if (!isSeparatorGapInRange(gapIndex, count))
|
|
633
726
|
return;
|
|
634
|
-
this.separatorOverrides.set(gapIndex, {
|
|
727
|
+
this.separatorOverrides.set(gapIndex, {
|
|
728
|
+
...this.separatorOverrides.get(gapIndex),
|
|
729
|
+
...patch,
|
|
730
|
+
});
|
|
635
731
|
this.cdr.markForCheck();
|
|
636
732
|
}
|
|
637
733
|
makeSeparators(index) {
|
|
@@ -679,7 +775,10 @@ export class VirtualizedList {
|
|
|
679
775
|
});
|
|
680
776
|
}
|
|
681
777
|
scrollToEnd(params) {
|
|
682
|
-
this.dispatch({
|
|
778
|
+
this.dispatch({
|
|
779
|
+
kind: 'scroll-to-end',
|
|
780
|
+
animated: params?.animated ?? true,
|
|
781
|
+
});
|
|
683
782
|
}
|
|
684
783
|
flashScrollIndicators() {
|
|
685
784
|
this.scrollView?.flashScrollIndicators();
|
|
@@ -729,12 +828,20 @@ export class VirtualizedList {
|
|
|
729
828
|
[accessibilityValue]="foldedAccessibility().accessibilityValue"
|
|
730
829
|
[accessibilityActions]="foldedAccessibility().accessibilityActions"
|
|
731
830
|
[accessibilityLabelledBy]="foldedAccessibility().accessibilityLabelledBy"
|
|
732
|
-
[importantForAccessibility]="
|
|
831
|
+
[importantForAccessibility]="
|
|
832
|
+
foldedAccessibility().importantForAccessibility
|
|
833
|
+
"
|
|
733
834
|
[accessibilityLiveRegion]="foldedAccessibility().accessibilityLiveRegion"
|
|
734
835
|
[screenReaderFocusable]="foldedAccessibility().screenReaderFocusable"
|
|
735
|
-
[accessibilityViewIsModal]="
|
|
736
|
-
|
|
737
|
-
|
|
836
|
+
[accessibilityViewIsModal]="
|
|
837
|
+
foldedAccessibility().accessibilityViewIsModal
|
|
838
|
+
"
|
|
839
|
+
[accessibilityElementsHidden]="
|
|
840
|
+
foldedAccessibility().accessibilityElementsHidden
|
|
841
|
+
"
|
|
842
|
+
[accessibilityIgnoresInvertColors]="
|
|
843
|
+
foldedAccessibility().accessibilityIgnoresInvertColors
|
|
844
|
+
"
|
|
738
845
|
[accessibilityLanguage]="foldedAccessibility().accessibilityLanguage"
|
|
739
846
|
[accessibilityRespondsToUserInteraction]="
|
|
740
847
|
foldedAccessibility().accessibilityRespondsToUserInteraction
|
|
@@ -742,7 +849,9 @@ export class VirtualizedList {
|
|
|
742
849
|
[accessibilityShowsLargeContentViewer]="
|
|
743
850
|
foldedAccessibility().accessibilityShowsLargeContentViewer
|
|
744
851
|
"
|
|
745
|
-
[accessibilityLargeContentTitle]="
|
|
852
|
+
[accessibilityLargeContentTitle]="
|
|
853
|
+
foldedAccessibility().accessibilityLargeContentTitle
|
|
854
|
+
"
|
|
746
855
|
(accessibilityAction)="accessibilityActionTick($event)"
|
|
747
856
|
(accessibilityTap)="accessibilityTapTick($event)"
|
|
748
857
|
(magicTap)="magicTapTick($event)"
|
|
@@ -798,21 +907,29 @@ export class VirtualizedList {
|
|
|
798
907
|
@if (gapSpacerStyle !== null) {
|
|
799
908
|
<symbiote-view [style]="gapSpacerStyle"></symbiote-view>
|
|
800
909
|
}
|
|
910
|
+
<!-- The separator sits INSIDE the measuring view, as RN's own cell renderer places it
|
|
911
|
+
(VirtualizedListCellRenderer.js:218-221). As a sibling it is an extra flex child, so
|
|
912
|
+
the chrome between two cells is gap + separator + gap while a spacer collapsing that
|
|
913
|
+
region replaces it with a single gap — every cell below the leading spacer then lands
|
|
914
|
+
short by (separator + gap) and the content jumps by that much whenever the window's
|
|
915
|
+
first index moves. Measured at exactly 17px on device 2026-08-19; see
|
|
916
|
+
.claude/rules/list-geometry-feedback-loop.md. -->
|
|
801
917
|
@for (cell of windowCells; track cell.key) {
|
|
802
|
-
<symbiote-view
|
|
918
|
+
<symbiote-view
|
|
919
|
+
(layout)="handleCellLayout(cell.measure, $event)"
|
|
920
|
+
[style]="cellStyle"
|
|
921
|
+
>
|
|
803
922
|
<ng-container
|
|
804
923
|
[vListOutlet]="itemDir?.templateRef"
|
|
805
924
|
[vListOutletContext]="cell.context"
|
|
806
925
|
></ng-container>
|
|
807
|
-
|
|
808
|
-
@if (cell.separatorContext !== undefined) {
|
|
809
|
-
<symbiote-view>
|
|
926
|
+
@if (cell.separatorContext !== undefined) {
|
|
810
927
|
<ng-container
|
|
811
928
|
[vListOutlet]="separatorDir?.templateRef"
|
|
812
929
|
[vListOutletContext]="cell.separatorContext"
|
|
813
930
|
></ng-container>
|
|
814
|
-
|
|
815
|
-
|
|
931
|
+
}
|
|
932
|
+
</symbiote-view>
|
|
816
933
|
}
|
|
817
934
|
@if (trailingSpacerStyle !== null) {
|
|
818
935
|
<symbiote-view [style]="trailingSpacerStyle"></symbiote-view>
|
|
@@ -832,7 +949,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
832
949
|
args: [{
|
|
833
950
|
selector: 'VirtualizedList',
|
|
834
951
|
standalone: true,
|
|
835
|
-
hostDirectives: [
|
|
952
|
+
hostDirectives: [
|
|
953
|
+
{ directive: SymbioteStyleInputDirective, inputs: ['style'] },
|
|
954
|
+
],
|
|
836
955
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
837
956
|
imports: [ScrollView, RefreshControl, VListOutletDirective, ViewHost],
|
|
838
957
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
@@ -851,12 +970,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
851
970
|
[accessibilityValue]="foldedAccessibility().accessibilityValue"
|
|
852
971
|
[accessibilityActions]="foldedAccessibility().accessibilityActions"
|
|
853
972
|
[accessibilityLabelledBy]="foldedAccessibility().accessibilityLabelledBy"
|
|
854
|
-
[importantForAccessibility]="
|
|
973
|
+
[importantForAccessibility]="
|
|
974
|
+
foldedAccessibility().importantForAccessibility
|
|
975
|
+
"
|
|
855
976
|
[accessibilityLiveRegion]="foldedAccessibility().accessibilityLiveRegion"
|
|
856
977
|
[screenReaderFocusable]="foldedAccessibility().screenReaderFocusable"
|
|
857
|
-
[accessibilityViewIsModal]="
|
|
858
|
-
|
|
859
|
-
|
|
978
|
+
[accessibilityViewIsModal]="
|
|
979
|
+
foldedAccessibility().accessibilityViewIsModal
|
|
980
|
+
"
|
|
981
|
+
[accessibilityElementsHidden]="
|
|
982
|
+
foldedAccessibility().accessibilityElementsHidden
|
|
983
|
+
"
|
|
984
|
+
[accessibilityIgnoresInvertColors]="
|
|
985
|
+
foldedAccessibility().accessibilityIgnoresInvertColors
|
|
986
|
+
"
|
|
860
987
|
[accessibilityLanguage]="foldedAccessibility().accessibilityLanguage"
|
|
861
988
|
[accessibilityRespondsToUserInteraction]="
|
|
862
989
|
foldedAccessibility().accessibilityRespondsToUserInteraction
|
|
@@ -864,7 +991,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
864
991
|
[accessibilityShowsLargeContentViewer]="
|
|
865
992
|
foldedAccessibility().accessibilityShowsLargeContentViewer
|
|
866
993
|
"
|
|
867
|
-
[accessibilityLargeContentTitle]="
|
|
994
|
+
[accessibilityLargeContentTitle]="
|
|
995
|
+
foldedAccessibility().accessibilityLargeContentTitle
|
|
996
|
+
"
|
|
868
997
|
(accessibilityAction)="accessibilityActionTick($event)"
|
|
869
998
|
(accessibilityTap)="accessibilityTapTick($event)"
|
|
870
999
|
(magicTap)="magicTapTick($event)"
|
|
@@ -920,21 +1049,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
920
1049
|
@if (gapSpacerStyle !== null) {
|
|
921
1050
|
<symbiote-view [style]="gapSpacerStyle"></symbiote-view>
|
|
922
1051
|
}
|
|
1052
|
+
<!-- The separator sits INSIDE the measuring view, as RN's own cell renderer places it
|
|
1053
|
+
(VirtualizedListCellRenderer.js:218-221). As a sibling it is an extra flex child, so
|
|
1054
|
+
the chrome between two cells is gap + separator + gap while a spacer collapsing that
|
|
1055
|
+
region replaces it with a single gap — every cell below the leading spacer then lands
|
|
1056
|
+
short by (separator + gap) and the content jumps by that much whenever the window's
|
|
1057
|
+
first index moves. Measured at exactly 17px on device 2026-08-19; see
|
|
1058
|
+
.claude/rules/list-geometry-feedback-loop.md. -->
|
|
923
1059
|
@for (cell of windowCells; track cell.key) {
|
|
924
|
-
<symbiote-view
|
|
1060
|
+
<symbiote-view
|
|
1061
|
+
(layout)="handleCellLayout(cell.measure, $event)"
|
|
1062
|
+
[style]="cellStyle"
|
|
1063
|
+
>
|
|
925
1064
|
<ng-container
|
|
926
1065
|
[vListOutlet]="itemDir?.templateRef"
|
|
927
1066
|
[vListOutletContext]="cell.context"
|
|
928
1067
|
></ng-container>
|
|
929
|
-
|
|
930
|
-
@if (cell.separatorContext !== undefined) {
|
|
931
|
-
<symbiote-view>
|
|
1068
|
+
@if (cell.separatorContext !== undefined) {
|
|
932
1069
|
<ng-container
|
|
933
1070
|
[vListOutlet]="separatorDir?.templateRef"
|
|
934
1071
|
[vListOutletContext]="cell.separatorContext"
|
|
935
1072
|
></ng-container>
|
|
936
|
-
|
|
937
|
-
|
|
1073
|
+
}
|
|
1074
|
+
</symbiote-view>
|
|
938
1075
|
}
|
|
939
1076
|
@if (trailingSpacerStyle !== null) {
|
|
940
1077
|
<symbiote-view [style]="trailingSpacerStyle"></symbiote-view>
|