@symbiote-native/angular 0.5.0 → 0.6.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.
- package/babel-register-composed.cjs +11 -3
- package/build/angular/anchor-host-registry.d.ts +2 -0
- package/build/angular/anchor-host-registry.js +84 -0
- package/build/angular/anchor-host-registry.js.map +1 -0
- package/build/angular/components/input-accessory-view/index.d.ts +2 -1
- package/build/angular/components/input-accessory-view/index.js +28 -39
- package/build/angular/components/input-accessory-view/index.js.map +1 -1
- package/build/angular/components/scroll-view/projection.js +70 -48
- package/build/angular/components/scroll-view/projection.js.map +1 -1
- package/build/angular/components/scroll-view/shared.js +28 -25
- package/build/angular/components/scroll-view/shared.js.map +1 -1
- package/build/angular/components/scroll-view/sticky-header.d.ts +6 -7
- package/build/angular/components/scroll-view/sticky-header.js +82 -65
- package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
- package/build/angular/components/touchable/index.d.ts +2 -5
- package/build/angular/components/touchable/index.js +36 -56
- package/build/angular/components/touchable/index.js.map +1 -1
- package/build/angular/components/virtualized-list/index.d.ts +5 -20
- package/build/angular/components/virtualized-list/index.js +145 -275
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.js +2 -4
- package/build/angular/components/virtualized-section-list/index.js.map +1 -1
- package/build/angular/index.d.ts +2 -1
- package/build/angular/index.js +6 -1
- package/build/angular/index.js.map +1 -1
- package/build/angular/renderer/index.d.ts +0 -1
- package/build/angular/renderer/index.js +5 -60
- package/build/angular/renderer/index.js.map +1 -1
- package/package.json +9 -7
- package/src/__tests__/responder-nested-cd.test.ts +1 -1
- package/src/anchor-host-registry.ts +88 -0
- package/src/components/input-accessory-view/index.ts +30 -39
- package/src/components/scroll-view/projection.ts +76 -46
- package/src/components/scroll-view/shared.ts +27 -19
- package/src/components/scroll-view/sticky-header.ts +89 -64
- package/src/components/touchable/index.ts +52 -66
- package/src/components/virtualized-list/index.ts +157 -368
- package/src/components/virtualized-section-list/index.ts +6 -3
- package/src/index.ts +6 -1
- package/src/renderer/index.ts +5 -63
- package/src/renderer/renderer.test.ts +2 -1
- package/build/bootstrap.d.ts +0 -7
- package/build/bootstrap.js +0 -14
- package/build/components/activity-indicator/index.android.d.ts +0 -9
- package/build/components/activity-indicator/index.android.js +0 -64
- package/build/components/activity-indicator/index.d.ts +0 -1
- package/build/components/activity-indicator/index.ios.d.ts +0 -5
- package/build/components/activity-indicator/index.ios.js +0 -64
- package/build/components/activity-indicator/index.js +0 -3
- package/build/components/activity-indicator/shared.d.ts +0 -64
- package/build/components/activity-indicator/shared.js +0 -424
- package/build/components/button.d.ts +0 -60
- package/build/components/button.js +0 -456
- package/build/components/flat-list/index.d.ts +0 -119
- package/build/components/flat-list/index.js +0 -691
- package/build/components/image/index.android.d.ts +0 -7
- package/build/components/image/index.android.js +0 -88
- package/build/components/image/index.d.ts +0 -1
- package/build/components/image/index.ios.d.ts +0 -7
- package/build/components/image/index.ios.js +0 -88
- package/build/components/image/index.js +0 -2
- package/build/components/image/shared.d.ts +0 -101
- package/build/components/image/shared.js +0 -405
- package/build/components/image-background.d.ts +0 -78
- package/build/components/image-background.js +0 -583
- package/build/components/input-accessory-view/index.d.ts +0 -56
- package/build/components/input-accessory-view/index.js +0 -403
- package/build/components/keyboard-avoiding-view/index.d.ts +0 -79
- package/build/components/keyboard-avoiding-view/index.js +0 -504
- package/build/components/modal/index.d.ts +0 -89
- package/build/components/modal/index.js +0 -529
- package/build/components/pressable/index.d.ts +0 -120
- package/build/components/pressable/index.js +0 -639
- package/build/components/refresh-control/index.d.ts +0 -83
- package/build/components/refresh-control/index.js +0 -509
- package/build/components/safe-area-view/index.d.ts +0 -54
- package/build/components/safe-area-view/index.js +0 -388
- package/build/components/scroll-view/index.android.d.ts +0 -16
- package/build/components/scroll-view/index.android.js +0 -228
- package/build/components/scroll-view/index.d.ts +0 -3
- package/build/components/scroll-view/index.ios.d.ts +0 -6
- package/build/components/scroll-view/index.ios.js +0 -113
- package/build/components/scroll-view/index.js +0 -5
- package/build/components/scroll-view/projection.d.ts +0 -32
- package/build/components/scroll-view/projection.js +0 -311
- package/build/components/scroll-view/shared.d.ts +0 -225
- package/build/components/scroll-view/shared.js +0 -757
- package/build/components/scroll-view/sticky-header.d.ts +0 -38
- package/build/components/scroll-view/sticky-header.js +0 -257
- package/build/components/section-list/index.d.ts +0 -113
- package/build/components/section-list/index.js +0 -768
- package/build/components/switch/index.android.d.ts +0 -17
- package/build/components/switch/index.android.js +0 -107
- package/build/components/switch/index.d.ts +0 -1
- package/build/components/switch/index.ios.d.ts +0 -16
- package/build/components/switch/index.ios.js +0 -106
- package/build/components/switch/index.js +0 -3
- package/build/components/switch/shared.d.ts +0 -37
- package/build/components/switch/shared.js +0 -176
- package/build/components/text-input.d.ts +0 -150
- package/build/components/text-input.js +0 -821
- package/build/components/touchable/index.d.ts +0 -241
- package/build/components/touchable/index.js +0 -1672
- package/build/components/touchable-native-feedback/index.d.ts +0 -80
- package/build/components/touchable-native-feedback/index.js +0 -545
- package/build/components/virtualized-list/directives.d.ts +0 -41
- package/build/components/virtualized-list/directives.js +0 -249
- package/build/components/virtualized-list/index.d.ts +0 -265
- package/build/components/virtualized-list/index.js +0 -1343
- package/build/components/virtualized-section-list/directives.d.ts +0 -28
- package/build/components/virtualized-section-list/directives.js +0 -148
- package/build/components/virtualized-section-list/index.d.ts +0 -175
- package/build/components/virtualized-section-list/index.js +0 -854
- package/build/components.d.ts +0 -39
- package/build/components.js +0 -37
- package/build/create-portal/index.d.ts +0 -17
- package/build/create-portal/index.js +0 -128
- package/build/create-tunnel/index.d.ts +0 -29
- package/build/create-tunnel/index.js +0 -181
- package/build/descriptor-to-angular/index.d.ts +0 -19
- package/build/descriptor-to-angular/index.js +0 -186
- package/build/host-instance/index.d.ts +0 -2
- package/build/host-instance/index.js +0 -36
- package/build/index.d.ts +0 -21
- package/build/index.js +0 -40
- package/build/modules/animated/animated-leaf-binder/index.d.ts +0 -14
- package/build/modules/animated/animated-leaf-binder/index.js +0 -90
- package/build/modules/animated/animated-leaf-binder.d.ts +0 -14
- package/build/modules/animated/animated-leaf-binder.js +0 -90
- package/build/modules/animated/create-animated-component.d.ts +0 -48
- package/build/modules/animated/create-animated-component.js +0 -425
- package/build/modules/animated/index.d.ts +0 -51
- package/build/modules/animated/index.js +0 -58
- package/build/modules/app-registry/index.d.ts +0 -7
- package/build/modules/app-registry/index.js +0 -22
- package/build/modules/status-bar/index.d.ts +0 -17
- package/build/modules/status-bar/index.js +0 -121
- package/build/primitives/index.d.ts +0 -32
- package/build/primitives/index.js +0 -386
- package/build/primitives/shared.d.ts +0 -83
- package/build/primitives/shared.js +0 -230
- package/build/render/index.d.ts +0 -11
- package/build/render/index.js +0 -170
- package/build/renderer/index.d.ts +0 -38
- package/build/renderer/index.js +0 -355
- package/build/services/color-scheme.service.d.ts +0 -13
- package/build/services/color-scheme.service.js +0 -72
- package/build/services/index.d.ts +0 -2
- package/build/services/index.js +0 -2
- package/build/services/window-dimensions.service.d.ts +0 -13
- package/build/services/window-dimensions.service.js +0 -83
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import { AnimatedProps, dlog, isAnchor, reduceProps, routeProp, whenCommitted, createElement, appendChild, insertBefore, removeChild, } from '@symbiote-native/engine';
|
|
2
|
-
import { computeStickyInterpolation, readLayoutNumber, stickyDebounceMs, STICKY_HEADER_Z_INDEX, } from '@symbiote-native/components';
|
|
3
|
-
import { descriptorFor } from '@symbiote-native/components';
|
|
4
|
-
import { Platform } from '@symbiote-native/engine';
|
|
5
|
-
const contentProjection = new WeakMap();
|
|
6
|
-
const projectedWrappers = new WeakMap();
|
|
7
|
-
function createViewNode() {
|
|
8
|
-
const descriptor = descriptorFor('symbiote-view');
|
|
9
|
-
return createElement(descriptor.component, descriptor.isText);
|
|
10
|
-
}
|
|
11
|
-
function directNode(record) {
|
|
12
|
-
return record.wrapper ?? record.child;
|
|
13
|
-
}
|
|
14
|
-
function isProjectedRefreshControl(node) {
|
|
15
|
-
if (node.component === 'PullToRefreshView' || node.component === 'AndroidSwipeRefreshLayout') {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
// Angular public <RefreshControl> is an anchor host whose real native refresh node lives inside
|
|
19
|
-
// its component view. Projection filtering must recognize that anchor, otherwise iOS re-renders
|
|
20
|
-
// a RefreshControl sibling and also leaves the projected one inside the scroll content.
|
|
21
|
-
return isAnchor(node) && node.children.some(isProjectedRefreshControl);
|
|
22
|
-
}
|
|
23
|
-
class StickyProjectionWrapper {
|
|
24
|
-
controller;
|
|
25
|
-
childIndex;
|
|
26
|
-
node;
|
|
27
|
-
measured = false;
|
|
28
|
-
layoutY = 0;
|
|
29
|
-
layoutHeight = 0;
|
|
30
|
-
animatedTranslateY;
|
|
31
|
-
animatedProps;
|
|
32
|
-
cancelBind;
|
|
33
|
-
listenerId;
|
|
34
|
-
debounceTimer;
|
|
35
|
-
translateY = null;
|
|
36
|
-
haveReceivedInitialZeroTranslateY = true;
|
|
37
|
-
constructor(controller, childIndex, node) {
|
|
38
|
-
this.controller = controller;
|
|
39
|
-
this.childIndex = childIndex;
|
|
40
|
-
this.node = node;
|
|
41
|
-
this.animatedTranslateY = this.controller.config.scrollAnimatedValue.interpolate({
|
|
42
|
-
inputRange: [-1, 0],
|
|
43
|
-
outputRange: [0, 0],
|
|
44
|
-
});
|
|
45
|
-
this.rebuild();
|
|
46
|
-
}
|
|
47
|
-
destroy() {
|
|
48
|
-
this.cancelBind?.();
|
|
49
|
-
this.cancelBind = undefined;
|
|
50
|
-
if (this.listenerId !== undefined) {
|
|
51
|
-
this.animatedTranslateY.removeListener(this.listenerId);
|
|
52
|
-
this.listenerId = undefined;
|
|
53
|
-
}
|
|
54
|
-
if (this.debounceTimer !== undefined) {
|
|
55
|
-
clearTimeout(this.debounceTimer);
|
|
56
|
-
this.debounceTimer = undefined;
|
|
57
|
-
}
|
|
58
|
-
if (this.animatedProps !== undefined) {
|
|
59
|
-
this.animatedProps.__detach();
|
|
60
|
-
this.animatedProps = undefined;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
rebuild() {
|
|
64
|
-
if (this.listenerId !== undefined) {
|
|
65
|
-
this.animatedTranslateY.removeListener(this.listenerId);
|
|
66
|
-
this.listenerId = undefined;
|
|
67
|
-
}
|
|
68
|
-
const { inputRange, outputRange } = computeStickyInterpolation({
|
|
69
|
-
measured: this.measured,
|
|
70
|
-
inverted: this.controller.config.invertStickyHeaders,
|
|
71
|
-
scrollViewHeight: this.controller.config.scrollViewHeight,
|
|
72
|
-
layoutY: this.layoutY,
|
|
73
|
-
layoutHeight: this.layoutHeight,
|
|
74
|
-
nextHeaderLayoutY: this.controller.nextStickyHeaderY(this.childIndex),
|
|
75
|
-
});
|
|
76
|
-
this.animatedTranslateY = this.controller.config.scrollAnimatedValue.interpolate({
|
|
77
|
-
inputRange,
|
|
78
|
-
outputRange,
|
|
79
|
-
});
|
|
80
|
-
this.listenerId = this.animatedTranslateY.addListener(this.animatedValueListener);
|
|
81
|
-
this.applyProps();
|
|
82
|
-
dlog(`Angular ScrollView projection sticky index=${this.childIndex} measured=${this.measured} y=${this.layoutY}`);
|
|
83
|
-
}
|
|
84
|
-
onLayout = (event) => {
|
|
85
|
-
const y = readLayoutNumber(event, 'y');
|
|
86
|
-
const height = readLayoutNumber(event, 'height');
|
|
87
|
-
if (y !== undefined)
|
|
88
|
-
this.layoutY = y;
|
|
89
|
-
if (height !== undefined)
|
|
90
|
-
this.layoutHeight = height;
|
|
91
|
-
this.measured = true;
|
|
92
|
-
this.controller.recordHeaderLayoutY(this.childIndex, this.layoutY);
|
|
93
|
-
this.rebuild();
|
|
94
|
-
};
|
|
95
|
-
animatedValueListener = ({ value }) => {
|
|
96
|
-
if (typeof value !== 'number')
|
|
97
|
-
return;
|
|
98
|
-
if (value === 0 && !this.haveReceivedInitialZeroTranslateY) {
|
|
99
|
-
this.haveReceivedInitialZeroTranslateY = true;
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (this.debounceTimer !== undefined)
|
|
103
|
-
clearTimeout(this.debounceTimer);
|
|
104
|
-
this.debounceTimer = setTimeout(() => {
|
|
105
|
-
this.translateY = value;
|
|
106
|
-
if (value !== 0)
|
|
107
|
-
this.haveReceivedInitialZeroTranslateY = false;
|
|
108
|
-
this.applyProps();
|
|
109
|
-
}, stickyDebounceMs(Platform.OS));
|
|
110
|
-
};
|
|
111
|
-
props() {
|
|
112
|
-
const style = {
|
|
113
|
-
transform: [{ translateY: this.animatedTranslateY }],
|
|
114
|
-
zIndex: STICKY_HEADER_Z_INDEX,
|
|
115
|
-
};
|
|
116
|
-
const passthrough = this.translateY === null
|
|
117
|
-
? undefined
|
|
118
|
-
: { transform: [{ translateY: this.translateY }], zIndex: STICKY_HEADER_Z_INDEX };
|
|
119
|
-
return {
|
|
120
|
-
style: passthrough === undefined ? style : [style, passthrough],
|
|
121
|
-
onLayout: this.onLayout,
|
|
122
|
-
collapsable: false,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
applyProps() {
|
|
126
|
-
const props = this.props();
|
|
127
|
-
const reduced = reduceProps(props);
|
|
128
|
-
for (const [key, value] of Object.entries(reduced))
|
|
129
|
-
routeProp(this.node, key, value);
|
|
130
|
-
const next = new AnimatedProps(props);
|
|
131
|
-
next.__attach();
|
|
132
|
-
if (this.animatedProps !== undefined)
|
|
133
|
-
this.animatedProps.__detach();
|
|
134
|
-
this.animatedProps = next;
|
|
135
|
-
this.cancelBind?.();
|
|
136
|
-
this.cancelBind = whenCommitted(this.node, () => next.setNativeView(this.node));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
export class ScrollViewProjectionController {
|
|
140
|
-
config;
|
|
141
|
-
contentNode;
|
|
142
|
-
records = [];
|
|
143
|
-
headerLayoutYs = new Map();
|
|
144
|
-
constructor(config) {
|
|
145
|
-
this.config = config;
|
|
146
|
-
}
|
|
147
|
-
update(config) {
|
|
148
|
-
this.config = config;
|
|
149
|
-
this.reconcileStickyRecords();
|
|
150
|
-
}
|
|
151
|
-
bindContentNode(node) {
|
|
152
|
-
dlog(`Angular ScrollView projection bindContentNode node=${node.component} preExistingChildren=${node.children.length} recordsBefore=${this.records.length}`);
|
|
153
|
-
this.contentNode = node;
|
|
154
|
-
contentProjection.set(node, this);
|
|
155
|
-
if (this.records.length === 0 && node.children.length > 0) {
|
|
156
|
-
for (const child of [...node.children]) {
|
|
157
|
-
this.records.push({ child, wrapper: undefined, sticky: undefined, stickyIndex: undefined });
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
this.reconcileStickyRecords();
|
|
161
|
-
}
|
|
162
|
-
appendProjectedChild(parent, child, insert) {
|
|
163
|
-
dlog(`Angular ScrollView projection appendProjectedChild parent=${parent.component} child=${child.component} recordsBefore=${this.records.length}`);
|
|
164
|
-
const existing = this.records.find(record => record.child === child);
|
|
165
|
-
if (existing !== undefined)
|
|
166
|
-
this.records.splice(this.records.indexOf(existing), 1);
|
|
167
|
-
const record = {
|
|
168
|
-
child,
|
|
169
|
-
wrapper: undefined,
|
|
170
|
-
sticky: undefined,
|
|
171
|
-
stickyIndex: undefined,
|
|
172
|
-
};
|
|
173
|
-
this.records.push(record);
|
|
174
|
-
this.insertRecord(parent, record, undefined, insert);
|
|
175
|
-
this.reconcileStickyRecords();
|
|
176
|
-
}
|
|
177
|
-
insertProjectedChild(parent, child, beforeChild, insert) {
|
|
178
|
-
dlog(`Angular ScrollView projection insertProjectedChild parent=${parent.component} child=${child.component} before=${beforeChild ? `${beforeChild.component}` : 'null'} recordsBefore=${this.records.length}`);
|
|
179
|
-
const existing = this.records.find(record => record.child === child);
|
|
180
|
-
if (existing !== undefined)
|
|
181
|
-
this.records.splice(this.records.indexOf(existing), 1);
|
|
182
|
-
const beforeRecord = beforeChild === null
|
|
183
|
-
? undefined
|
|
184
|
-
: this.records.find(record => record.child === beforeChild || record.wrapper === beforeChild);
|
|
185
|
-
const record = {
|
|
186
|
-
child,
|
|
187
|
-
wrapper: undefined,
|
|
188
|
-
sticky: undefined,
|
|
189
|
-
stickyIndex: undefined,
|
|
190
|
-
};
|
|
191
|
-
const index = beforeRecord === undefined ? this.records.length : this.records.indexOf(beforeRecord);
|
|
192
|
-
this.records.splice(index, 0, record);
|
|
193
|
-
this.insertRecord(parent, record, beforeRecord, insert);
|
|
194
|
-
this.reconcileStickyRecords();
|
|
195
|
-
}
|
|
196
|
-
removeProjectedChild(child, remove) {
|
|
197
|
-
const record = this.records.find(entry => entry.child === child || entry.wrapper === child);
|
|
198
|
-
if (record === undefined || this.contentNode === undefined)
|
|
199
|
-
return false;
|
|
200
|
-
record.sticky?.destroy();
|
|
201
|
-
projectedWrappers.delete(record.child);
|
|
202
|
-
const direct = directNode(record);
|
|
203
|
-
if (direct.parent === this.contentNode)
|
|
204
|
-
remove(this.contentNode, direct);
|
|
205
|
-
this.records.splice(this.records.indexOf(record), 1);
|
|
206
|
-
this.reconcileStickyRecords();
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
nextStickyHeaderY(index) {
|
|
210
|
-
const stickyIndices = this.config.stickyHeaderIndices ?? [];
|
|
211
|
-
const next = stickyIndices.find(entry => entry > index);
|
|
212
|
-
return next === undefined ? undefined : this.headerLayoutYs.get(next);
|
|
213
|
-
}
|
|
214
|
-
recordHeaderLayoutY(index, y) {
|
|
215
|
-
if (this.headerLayoutYs.get(index) === y)
|
|
216
|
-
return;
|
|
217
|
-
this.headerLayoutYs.set(index, y);
|
|
218
|
-
for (const record of this.records)
|
|
219
|
-
record.sticky?.rebuild();
|
|
220
|
-
}
|
|
221
|
-
insertRecord(parent, record, beforeRecord, insert) {
|
|
222
|
-
const before = beforeRecord === undefined ? undefined : directNode(beforeRecord);
|
|
223
|
-
dlog(`Angular ScrollView projection insertRecord physicalParent=${parent.component} child=${record.child.component} before=${before ? before.component : 'undefined(append)'} parentIsContentNode=${parent === this.contentNode}`);
|
|
224
|
-
if (before === undefined)
|
|
225
|
-
insert(parent, record.child);
|
|
226
|
-
else
|
|
227
|
-
insert(parent, record.child, before);
|
|
228
|
-
}
|
|
229
|
-
reconcileStickyRecords() {
|
|
230
|
-
if (this.contentNode === undefined)
|
|
231
|
-
return;
|
|
232
|
-
dlog(`Angular ScrollView projection reconcile contentNode=${this.contentNode.component} records=${this.records.length} contentNodeActualChildren=${this.contentNode.children.length}`);
|
|
233
|
-
const stickyIndices = new Set(this.config.stickyHeaderIndices ?? []);
|
|
234
|
-
if (this.config.customStickyHeaderComponent !== undefined && stickyIndices.size > 0) {
|
|
235
|
-
dlog('Angular ScrollView projection uses built-in sticky wrapper; custom StickyHeaderComponent is explicit-composition only');
|
|
236
|
-
}
|
|
237
|
-
let paintIndex = 0;
|
|
238
|
-
for (const record of [...this.records]) {
|
|
239
|
-
if (this.config.excludeRefreshControl && isProjectedRefreshControl(record.child)) {
|
|
240
|
-
this.removeProjectedChild(record.child, (parent, child) => removeChild(parent, child));
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
const countsAsChild = !isAnchor(record.child) && !isProjectedRefreshControl(record.child);
|
|
244
|
-
const childIndex = paintIndex;
|
|
245
|
-
if (countsAsChild)
|
|
246
|
-
paintIndex += 1;
|
|
247
|
-
const shouldWrap = countsAsChild && stickyIndices.has(childIndex);
|
|
248
|
-
if (shouldWrap && record.wrapper === undefined)
|
|
249
|
-
this.wrapRecord(record, childIndex);
|
|
250
|
-
else if (!shouldWrap && record.wrapper !== undefined)
|
|
251
|
-
this.unwrapRecord(record);
|
|
252
|
-
else if (shouldWrap && record.stickyIndex !== childIndex) {
|
|
253
|
-
record.sticky?.destroy();
|
|
254
|
-
record.sticky = new StickyProjectionWrapper(this, childIndex, directNode(record));
|
|
255
|
-
record.stickyIndex = childIndex;
|
|
256
|
-
}
|
|
257
|
-
else if (shouldWrap)
|
|
258
|
-
record.sticky?.rebuild();
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Auto projection runs after Angular has already created projected child host nodes. At this
|
|
262
|
-
// renderer boundary we can AOT-safely rearrange engine nodes, but we cannot instantiate an
|
|
263
|
-
// arbitrary Angular component class as a wrapper without owning a ViewContainerRef/injector and
|
|
264
|
-
// Angular projectable nodes for its <ng-content>. Therefore the automatic sticky path always uses
|
|
265
|
-
// the built-in engine-node wrapper; custom StickyHeaderComponent wrappers remain supported by
|
|
266
|
-
// explicit Angular composition with <ScrollViewStickyHeader>/<symbiote-sticky-header> or a user
|
|
267
|
-
// component that composes it in the template.
|
|
268
|
-
wrapRecord(record, childIndex) {
|
|
269
|
-
if (this.contentNode === undefined)
|
|
270
|
-
return;
|
|
271
|
-
const wrapper = createViewNode();
|
|
272
|
-
const currentParent = record.child.parent;
|
|
273
|
-
const currentIndex = currentParent?.children.indexOf(record.child) ?? -1;
|
|
274
|
-
if (currentParent === this.contentNode && currentIndex >= 0) {
|
|
275
|
-
insertBefore(this.contentNode, wrapper, record.child);
|
|
276
|
-
removeChild(this.contentNode, record.child);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
appendChild(this.contentNode, wrapper);
|
|
280
|
-
}
|
|
281
|
-
appendChild(wrapper, record.child);
|
|
282
|
-
record.wrapper = wrapper;
|
|
283
|
-
record.sticky = new StickyProjectionWrapper(this, childIndex, wrapper);
|
|
284
|
-
record.stickyIndex = childIndex;
|
|
285
|
-
projectedWrappers.set(record.child, record);
|
|
286
|
-
}
|
|
287
|
-
unwrapRecord(record) {
|
|
288
|
-
if (this.contentNode === undefined || record.wrapper === undefined)
|
|
289
|
-
return;
|
|
290
|
-
record.sticky?.destroy();
|
|
291
|
-
record.sticky = undefined;
|
|
292
|
-
record.stickyIndex = undefined;
|
|
293
|
-
const wrapper = record.wrapper;
|
|
294
|
-
insertBefore(this.contentNode, record.child, wrapper);
|
|
295
|
-
removeChild(this.contentNode, wrapper);
|
|
296
|
-
record.wrapper = undefined;
|
|
297
|
-
projectedWrappers.delete(record.child);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
export function getScrollViewProjection(node) {
|
|
301
|
-
return contentProjection.get(node);
|
|
302
|
-
}
|
|
303
|
-
export function removeScrollViewProjectedChild(child, remove) {
|
|
304
|
-
const record = projectedWrappers.get(child);
|
|
305
|
-
if (record === undefined)
|
|
306
|
-
return false;
|
|
307
|
-
const controller = record.wrapper?.parent
|
|
308
|
-
? contentProjection.get(record.wrapper.parent)
|
|
309
|
-
: undefined;
|
|
310
|
-
return controller?.removeProjectedChild(child, remove) ?? false;
|
|
311
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, type AfterViewInit, type OnDestroy } from '@angular/core';
|
|
2
|
-
import { type IAccessibilityProps, type IAccessibilityStateValue, type IAriaProps, type IContentSize } from '@symbiote-native/components';
|
|
3
|
-
import { AnimatedValue, type IStyleProp, type ISymbioteEvent, type ISymbioteNode, type IViewStyle } from '@symbiote-native/engine';
|
|
4
|
-
import { RefreshControl } from '../refresh-control';
|
|
5
|
-
import { ScrollViewProjectionController } from './projection';
|
|
6
|
-
export type { IScrollViewHandle } from '@symbiote-native/components';
|
|
7
|
-
type IScrollHandler = (event: ISymbioteEvent) => void;
|
|
8
|
-
type IContentSizeHandler = (width: number, height: number) => void;
|
|
9
|
-
export declare const SCROLL_VIEW_INPUTS: string[];
|
|
10
|
-
export interface IAngularScrollViewProps extends IAccessibilityProps, IAriaProps {
|
|
11
|
-
style?: IStyleProp<IViewStyle>;
|
|
12
|
-
contentContainerStyle?: IStyleProp<IViewStyle> | string;
|
|
13
|
-
horizontal?: boolean;
|
|
14
|
-
scrollEnabled?: boolean;
|
|
15
|
-
showsVerticalScrollIndicator?: boolean;
|
|
16
|
-
showsHorizontalScrollIndicator?: boolean;
|
|
17
|
-
pagingEnabled?: boolean;
|
|
18
|
-
bounces?: boolean;
|
|
19
|
-
decelerationRate?: 'normal' | 'fast' | number;
|
|
20
|
-
scrollEventThrottle?: number;
|
|
21
|
-
contentInset?: {
|
|
22
|
-
top?: number;
|
|
23
|
-
left?: number;
|
|
24
|
-
bottom?: number;
|
|
25
|
-
right?: number;
|
|
26
|
-
};
|
|
27
|
-
contentOffset?: {
|
|
28
|
-
x: number;
|
|
29
|
-
y: number;
|
|
30
|
-
};
|
|
31
|
-
removeClippedSubviews?: boolean;
|
|
32
|
-
snapToInterval?: number;
|
|
33
|
-
snapToOffsets?: number[];
|
|
34
|
-
snapToAlignment?: 'start' | 'center' | 'end';
|
|
35
|
-
snapToStart?: boolean;
|
|
36
|
-
snapToEnd?: boolean;
|
|
37
|
-
disableIntervalMomentum?: boolean;
|
|
38
|
-
stickyHeaderIndices?: number[];
|
|
39
|
-
invertStickyHeaders?: boolean;
|
|
40
|
-
StickyHeaderComponent?: unknown;
|
|
41
|
-
keyboardDismissMode?: 'none' | 'on-drag' | 'interactive';
|
|
42
|
-
keyboardShouldPersistTaps?: boolean | 'always' | 'never' | 'handled';
|
|
43
|
-
maintainVisibleContentPosition?: {
|
|
44
|
-
minIndexForVisible: number;
|
|
45
|
-
autoscrollToTopThreshold?: number;
|
|
46
|
-
};
|
|
47
|
-
alwaysBounceHorizontal?: boolean;
|
|
48
|
-
alwaysBounceVertical?: boolean;
|
|
49
|
-
centerContent?: boolean;
|
|
50
|
-
scrollIndicatorInsets?: {
|
|
51
|
-
top?: number;
|
|
52
|
-
left?: number;
|
|
53
|
-
bottom?: number;
|
|
54
|
-
right?: number;
|
|
55
|
-
};
|
|
56
|
-
indicatorStyle?: 'default' | 'black' | 'white';
|
|
57
|
-
directionalLockEnabled?: boolean;
|
|
58
|
-
automaticallyAdjustKeyboardInsets?: boolean;
|
|
59
|
-
contentInsetAdjustmentBehavior?: 'automatic' | 'scrollableAxes' | 'never' | 'always';
|
|
60
|
-
minimumZoomScale?: number;
|
|
61
|
-
maximumZoomScale?: number;
|
|
62
|
-
zoomScale?: number;
|
|
63
|
-
bouncesZoom?: boolean;
|
|
64
|
-
pinchGestureEnabled?: boolean;
|
|
65
|
-
nestedScrollEnabled?: boolean;
|
|
66
|
-
overScrollMode?: 'auto' | 'always' | 'never';
|
|
67
|
-
fadingEdgeLength?: number;
|
|
68
|
-
persistentScrollbar?: boolean;
|
|
69
|
-
endFillColor?: string;
|
|
70
|
-
onLayout?: IScrollHandler;
|
|
71
|
-
onScroll?: IScrollHandler;
|
|
72
|
-
onScrollBeginDrag?: IScrollHandler;
|
|
73
|
-
onScrollEndDrag?: IScrollHandler;
|
|
74
|
-
onMomentumScrollBegin?: IScrollHandler;
|
|
75
|
-
onMomentumScrollEnd?: IScrollHandler;
|
|
76
|
-
onScrollToTop?: IScrollHandler;
|
|
77
|
-
onContentSizeChange?: IContentSizeHandler;
|
|
78
|
-
onAccessibilityAction?: (event: ISymbioteEvent) => void;
|
|
79
|
-
onAccessibilityTap?: (event: ISymbioteEvent) => void;
|
|
80
|
-
onMagicTap?: (event: ISymbioteEvent) => void;
|
|
81
|
-
onAccessibilityEscape?: (event: ISymbioteEvent) => void;
|
|
82
|
-
}
|
|
83
|
-
export type IAngularScrollViewInputs = Omit<IAngularScrollViewProps, 'onLayout' | 'onScrollToTop' | 'onContentSizeChange' | 'onAccessibilityAction' | 'onAccessibilityTap' | 'onMagicTap' | 'onAccessibilityEscape'>;
|
|
84
|
-
export declare class ScrollViewProjectionDirective {
|
|
85
|
-
private readonly elementRef;
|
|
86
|
-
set symbioteScrollViewProjection(controller: ScrollViewProjectionController);
|
|
87
|
-
}
|
|
88
|
-
export declare abstract class ScrollViewBase implements IAngularScrollViewInputs, AfterViewInit, OnDestroy {
|
|
89
|
-
style: IStyleProp<IViewStyle> | undefined;
|
|
90
|
-
contentContainerStyle: IStyleProp<IViewStyle> | string | undefined;
|
|
91
|
-
horizontal: boolean | undefined;
|
|
92
|
-
scrollEnabled: boolean | undefined;
|
|
93
|
-
showsVerticalScrollIndicator: boolean | undefined;
|
|
94
|
-
showsHorizontalScrollIndicator: boolean | undefined;
|
|
95
|
-
pagingEnabled: boolean | undefined;
|
|
96
|
-
bounces: boolean | undefined;
|
|
97
|
-
decelerationRate: 'normal' | 'fast' | number | undefined;
|
|
98
|
-
scrollEventThrottle: number | undefined;
|
|
99
|
-
contentInset: IAngularScrollViewProps['contentInset'];
|
|
100
|
-
contentOffset: IAngularScrollViewProps['contentOffset'];
|
|
101
|
-
removeClippedSubviews: boolean | undefined;
|
|
102
|
-
snapToInterval: number | undefined;
|
|
103
|
-
snapToOffsets: number[] | undefined;
|
|
104
|
-
snapToAlignment: IAngularScrollViewProps['snapToAlignment'];
|
|
105
|
-
snapToStart: boolean | undefined;
|
|
106
|
-
snapToEnd: boolean | undefined;
|
|
107
|
-
disableIntervalMomentum: boolean | undefined;
|
|
108
|
-
stickyHeaderIndices: number[] | undefined;
|
|
109
|
-
invertStickyHeaders: boolean | undefined;
|
|
110
|
-
StickyHeaderComponent: unknown;
|
|
111
|
-
keyboardDismissMode: IAngularScrollViewProps['keyboardDismissMode'];
|
|
112
|
-
keyboardShouldPersistTaps: IAngularScrollViewProps['keyboardShouldPersistTaps'];
|
|
113
|
-
maintainVisibleContentPosition: IAngularScrollViewProps['maintainVisibleContentPosition'];
|
|
114
|
-
alwaysBounceHorizontal: boolean | undefined;
|
|
115
|
-
alwaysBounceVertical: boolean | undefined;
|
|
116
|
-
centerContent: boolean | undefined;
|
|
117
|
-
scrollIndicatorInsets: IAngularScrollViewProps['scrollIndicatorInsets'];
|
|
118
|
-
indicatorStyle: IAngularScrollViewProps['indicatorStyle'];
|
|
119
|
-
directionalLockEnabled: boolean | undefined;
|
|
120
|
-
automaticallyAdjustKeyboardInsets: boolean | undefined;
|
|
121
|
-
contentInsetAdjustmentBehavior: IAngularScrollViewProps['contentInsetAdjustmentBehavior'];
|
|
122
|
-
minimumZoomScale: number | undefined;
|
|
123
|
-
maximumZoomScale: number | undefined;
|
|
124
|
-
zoomScale: number | undefined;
|
|
125
|
-
bouncesZoom: boolean | undefined;
|
|
126
|
-
pinchGestureEnabled: boolean | undefined;
|
|
127
|
-
nestedScrollEnabled: boolean | undefined;
|
|
128
|
-
overScrollMode: IAngularScrollViewProps['overScrollMode'];
|
|
129
|
-
fadingEdgeLength: number | undefined;
|
|
130
|
-
persistentScrollbar: boolean | undefined;
|
|
131
|
-
endFillColor: string | undefined;
|
|
132
|
-
onScroll: IScrollHandler | undefined;
|
|
133
|
-
onScrollBeginDrag: IScrollHandler | undefined;
|
|
134
|
-
onScrollEndDrag: IScrollHandler | undefined;
|
|
135
|
-
onMomentumScrollBegin: IScrollHandler | undefined;
|
|
136
|
-
onMomentumScrollEnd: IScrollHandler | undefined;
|
|
137
|
-
readonly layout: EventEmitter<ISymbioteEvent>;
|
|
138
|
-
readonly scrollToTop: EventEmitter<ISymbioteEvent>;
|
|
139
|
-
readonly contentSizeChange: EventEmitter<IContentSize>;
|
|
140
|
-
readonly accessibilityAction: EventEmitter<ISymbioteEvent>;
|
|
141
|
-
readonly accessibilityTap: EventEmitter<ISymbioteEvent>;
|
|
142
|
-
readonly magicTap: EventEmitter<ISymbioteEvent>;
|
|
143
|
-
readonly accessibilityEscape: EventEmitter<ISymbioteEvent>;
|
|
144
|
-
testID: string | undefined;
|
|
145
|
-
nativeID: string | undefined;
|
|
146
|
-
accessible: boolean | undefined;
|
|
147
|
-
accessibilityLabel: string | undefined;
|
|
148
|
-
accessibilityHint: string | undefined;
|
|
149
|
-
accessibilityRole: IAccessibilityProps['accessibilityRole'];
|
|
150
|
-
accessibilityState: IAccessibilityStateValue | undefined;
|
|
151
|
-
accessibilityValue: IAccessibilityProps['accessibilityValue'];
|
|
152
|
-
accessibilityActions: IAccessibilityProps['accessibilityActions'];
|
|
153
|
-
accessibilityLabelledBy: string | string[] | undefined;
|
|
154
|
-
importantForAccessibility: IAccessibilityProps['importantForAccessibility'];
|
|
155
|
-
accessibilityLiveRegion: IAccessibilityProps['accessibilityLiveRegion'];
|
|
156
|
-
screenReaderFocusable: boolean | undefined;
|
|
157
|
-
accessibilityViewIsModal: boolean | undefined;
|
|
158
|
-
accessibilityElementsHidden: boolean | undefined;
|
|
159
|
-
accessibilityIgnoresInvertColors: boolean | undefined;
|
|
160
|
-
accessibilityLanguage: string | undefined;
|
|
161
|
-
accessibilityRespondsToUserInteraction: boolean | undefined;
|
|
162
|
-
accessibilityShowsLargeContentViewer: boolean | undefined;
|
|
163
|
-
accessibilityLargeContentTitle: string | undefined;
|
|
164
|
-
role: IAriaProps['role'];
|
|
165
|
-
'aria-label': string | undefined;
|
|
166
|
-
'aria-labelledby': string | undefined;
|
|
167
|
-
'aria-live': IAriaProps['aria-live'];
|
|
168
|
-
'aria-hidden': boolean | undefined;
|
|
169
|
-
'aria-busy': boolean | undefined;
|
|
170
|
-
'aria-checked': boolean | 'mixed' | undefined;
|
|
171
|
-
'aria-disabled': boolean | undefined;
|
|
172
|
-
'aria-expanded': boolean | undefined;
|
|
173
|
-
'aria-selected': boolean | undefined;
|
|
174
|
-
'aria-modal': boolean | undefined;
|
|
175
|
-
'aria-valuemax': number | undefined;
|
|
176
|
-
'aria-valuemin': number | undefined;
|
|
177
|
-
'aria-valuenow': number | undefined;
|
|
178
|
-
'aria-valuetext': string | undefined;
|
|
179
|
-
private hostDirective?;
|
|
180
|
-
protected projectedRefreshControl?: RefreshControl;
|
|
181
|
-
protected readonly scrollAnimatedValue: AnimatedValue;
|
|
182
|
-
private lastContentSize;
|
|
183
|
-
private viewportHeight;
|
|
184
|
-
protected readonly projectionController: ScrollViewProjectionController;
|
|
185
|
-
private detachStickyScroll;
|
|
186
|
-
private cancelStickyBind;
|
|
187
|
-
private lastLoggedIsHorizontal;
|
|
188
|
-
private readonly handleInvertedStickyLayout;
|
|
189
|
-
private readonly handleContentLayout;
|
|
190
|
-
private readonly emitterCallbackCache;
|
|
191
|
-
private cachedStickyOnScrollSource;
|
|
192
|
-
private cachedStickyOnScrollHandler;
|
|
193
|
-
get isHorizontal(): boolean;
|
|
194
|
-
private get hasStickyHeaders();
|
|
195
|
-
private get resolvedContentContainerStyle();
|
|
196
|
-
private get scrollViewBaseStyle();
|
|
197
|
-
get scrollProps(): Record<string, unknown>;
|
|
198
|
-
protected get layoutSplitStyle(): IStyleProp<IViewStyle>;
|
|
199
|
-
get androidWrappedScrollProps(): Record<string, unknown>;
|
|
200
|
-
get iosRefreshControlProps(): Record<string, unknown>;
|
|
201
|
-
get androidRefreshControlProps(): Record<string, unknown>;
|
|
202
|
-
protected handleProjectedRefresh(nativeNode: unknown): void;
|
|
203
|
-
private refreshControlProps;
|
|
204
|
-
get hasProjectedRefreshControl(): boolean;
|
|
205
|
-
get contentProps(): Record<string, unknown>;
|
|
206
|
-
private emitterCallback;
|
|
207
|
-
private stickyOnScrollHandler;
|
|
208
|
-
private get hostNode();
|
|
209
|
-
private readonly handle;
|
|
210
|
-
scrollTo(options?: {
|
|
211
|
-
x?: number;
|
|
212
|
-
y?: number;
|
|
213
|
-
animated?: boolean;
|
|
214
|
-
}): void;
|
|
215
|
-
scrollToEnd(options?: {
|
|
216
|
-
animated?: boolean;
|
|
217
|
-
}): void;
|
|
218
|
-
flashScrollIndicators(): void;
|
|
219
|
-
getScrollNode(): ISymbioteNode | null;
|
|
220
|
-
ngAfterViewInit(): void;
|
|
221
|
-
private attachSticky;
|
|
222
|
-
ngOnDestroy(): void;
|
|
223
|
-
private updateProjectionController;
|
|
224
|
-
private accessibilityInputs;
|
|
225
|
-
}
|