@symbiote-native/angular 0.6.0 → 0.6.2

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 (193) hide show
  1. package/README.md +1 -1
  2. package/babel-register-composed.cjs +11 -3
  3. package/build/angular/anchor-host-registry.d.ts +2 -0
  4. package/build/angular/anchor-host-registry.js +84 -0
  5. package/build/angular/anchor-host-registry.js.map +1 -0
  6. package/build/angular/components/input-accessory-view/index.d.ts +2 -1
  7. package/build/angular/components/input-accessory-view/index.js +28 -39
  8. package/build/angular/components/input-accessory-view/index.js.map +1 -1
  9. package/build/angular/components/scroll-view/projection.js +70 -48
  10. package/build/angular/components/scroll-view/projection.js.map +1 -1
  11. package/build/angular/components/scroll-view/shared.js +28 -25
  12. package/build/angular/components/scroll-view/shared.js.map +1 -1
  13. package/build/angular/components/scroll-view/sticky-header.d.ts +6 -7
  14. package/build/angular/components/scroll-view/sticky-header.js +82 -65
  15. package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
  16. package/build/angular/components/touchable/index.d.ts +2 -5
  17. package/build/angular/components/touchable/index.js +36 -56
  18. package/build/angular/components/touchable/index.js.map +1 -1
  19. package/build/angular/components/virtualized-list/index.d.ts +5 -20
  20. package/build/angular/components/virtualized-list/index.js +145 -275
  21. package/build/angular/components/virtualized-list/index.js.map +1 -1
  22. package/build/angular/components/virtualized-section-list/index.js +2 -4
  23. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  24. package/build/angular/index.d.ts +2 -1
  25. package/build/angular/index.js +6 -1
  26. package/build/angular/index.js.map +1 -1
  27. package/build/angular/renderer/index.d.ts +0 -1
  28. package/build/angular/renderer/index.js +5 -60
  29. package/build/angular/renderer/index.js.map +1 -1
  30. package/package.json +8 -4
  31. package/src/anchor-host-registry.ts +88 -0
  32. package/src/components/input-accessory-view/index.ts +30 -39
  33. package/src/components/scroll-view/projection.ts +76 -46
  34. package/src/components/scroll-view/shared.ts +27 -19
  35. package/src/components/scroll-view/sticky-header.ts +89 -64
  36. package/src/components/touchable/index.ts +52 -66
  37. package/src/components/virtualized-list/index.ts +157 -368
  38. package/src/components/virtualized-section-list/index.ts +6 -3
  39. package/src/index.ts +6 -1
  40. package/src/renderer/index.ts +5 -63
  41. package/build/bootstrap.d.ts +0 -7
  42. package/build/bootstrap.js +0 -14
  43. package/build/components/activity-indicator/index.android.d.ts +0 -9
  44. package/build/components/activity-indicator/index.android.js +0 -64
  45. package/build/components/activity-indicator/index.d.ts +0 -1
  46. package/build/components/activity-indicator/index.ios.d.ts +0 -5
  47. package/build/components/activity-indicator/index.ios.js +0 -64
  48. package/build/components/activity-indicator/index.js +0 -3
  49. package/build/components/activity-indicator/shared.d.ts +0 -64
  50. package/build/components/activity-indicator/shared.js +0 -424
  51. package/build/components/button.d.ts +0 -60
  52. package/build/components/button.js +0 -456
  53. package/build/components/flat-list/index.d.ts +0 -119
  54. package/build/components/flat-list/index.js +0 -691
  55. package/build/components/image/index.android.d.ts +0 -7
  56. package/build/components/image/index.android.js +0 -88
  57. package/build/components/image/index.d.ts +0 -1
  58. package/build/components/image/index.ios.d.ts +0 -7
  59. package/build/components/image/index.ios.js +0 -88
  60. package/build/components/image/index.js +0 -2
  61. package/build/components/image/shared.d.ts +0 -101
  62. package/build/components/image/shared.js +0 -405
  63. package/build/components/image-background.d.ts +0 -78
  64. package/build/components/image-background.js +0 -583
  65. package/build/components/input-accessory-view/index.d.ts +0 -56
  66. package/build/components/input-accessory-view/index.js +0 -403
  67. package/build/components/keyboard-avoiding-view/index.d.ts +0 -79
  68. package/build/components/keyboard-avoiding-view/index.js +0 -504
  69. package/build/components/modal/index.d.ts +0 -89
  70. package/build/components/modal/index.js +0 -529
  71. package/build/components/pressable/index.d.ts +0 -120
  72. package/build/components/pressable/index.js +0 -639
  73. package/build/components/refresh-control/index.d.ts +0 -83
  74. package/build/components/refresh-control/index.js +0 -509
  75. package/build/components/safe-area-view/index.d.ts +0 -54
  76. package/build/components/safe-area-view/index.js +0 -388
  77. package/build/components/scroll-view/index.android.d.ts +0 -16
  78. package/build/components/scroll-view/index.android.js +0 -228
  79. package/build/components/scroll-view/index.d.ts +0 -3
  80. package/build/components/scroll-view/index.ios.d.ts +0 -6
  81. package/build/components/scroll-view/index.ios.js +0 -113
  82. package/build/components/scroll-view/index.js +0 -5
  83. package/build/components/scroll-view/projection.d.ts +0 -32
  84. package/build/components/scroll-view/projection.js +0 -311
  85. package/build/components/scroll-view/shared.d.ts +0 -225
  86. package/build/components/scroll-view/shared.js +0 -757
  87. package/build/components/scroll-view/sticky-header.d.ts +0 -38
  88. package/build/components/scroll-view/sticky-header.js +0 -257
  89. package/build/components/section-list/index.d.ts +0 -113
  90. package/build/components/section-list/index.js +0 -768
  91. package/build/components/switch/index.android.d.ts +0 -17
  92. package/build/components/switch/index.android.js +0 -107
  93. package/build/components/switch/index.d.ts +0 -1
  94. package/build/components/switch/index.ios.d.ts +0 -16
  95. package/build/components/switch/index.ios.js +0 -106
  96. package/build/components/switch/index.js +0 -3
  97. package/build/components/switch/shared.d.ts +0 -37
  98. package/build/components/switch/shared.js +0 -176
  99. package/build/components/text-input.d.ts +0 -150
  100. package/build/components/text-input.js +0 -821
  101. package/build/components/touchable/index.d.ts +0 -241
  102. package/build/components/touchable/index.js +0 -1672
  103. package/build/components/touchable-native-feedback/index.d.ts +0 -80
  104. package/build/components/touchable-native-feedback/index.js +0 -545
  105. package/build/components/virtualized-list/directives.d.ts +0 -41
  106. package/build/components/virtualized-list/directives.js +0 -249
  107. package/build/components/virtualized-list/index.d.ts +0 -265
  108. package/build/components/virtualized-list/index.js +0 -1343
  109. package/build/components/virtualized-section-list/directives.d.ts +0 -28
  110. package/build/components/virtualized-section-list/directives.js +0 -148
  111. package/build/components/virtualized-section-list/index.d.ts +0 -175
  112. package/build/components/virtualized-section-list/index.js +0 -854
  113. package/build/components.d.ts +0 -39
  114. package/build/components.js +0 -37
  115. package/build/create-portal/index.d.ts +0 -17
  116. package/build/create-portal/index.js +0 -128
  117. package/build/create-tunnel/index.d.ts +0 -29
  118. package/build/create-tunnel/index.js +0 -181
  119. package/build/descriptor-to-angular/index.d.ts +0 -19
  120. package/build/descriptor-to-angular/index.js +0 -186
  121. package/build/host-instance/index.d.ts +0 -2
  122. package/build/host-instance/index.js +0 -36
  123. package/build/index.d.ts +0 -21
  124. package/build/index.js +0 -40
  125. package/build/modules/animated/animated-leaf-binder/index.d.ts +0 -14
  126. package/build/modules/animated/animated-leaf-binder/index.js +0 -90
  127. package/build/modules/animated/animated-leaf-binder.d.ts +0 -14
  128. package/build/modules/animated/animated-leaf-binder.js +0 -90
  129. package/build/modules/animated/create-animated-component.d.ts +0 -48
  130. package/build/modules/animated/create-animated-component.js +0 -425
  131. package/build/modules/animated/index.d.ts +0 -51
  132. package/build/modules/animated/index.js +0 -58
  133. package/build/modules/app-registry/index.d.ts +0 -7
  134. package/build/modules/app-registry/index.js +0 -22
  135. package/build/modules/status-bar/index.d.ts +0 -17
  136. package/build/modules/status-bar/index.js +0 -121
  137. package/build/primitives/index.d.ts +0 -32
  138. package/build/primitives/index.js +0 -386
  139. package/build/primitives/shared.d.ts +0 -83
  140. package/build/primitives/shared.js +0 -230
  141. package/build/render/index.d.ts +0 -11
  142. package/build/render/index.js +0 -170
  143. package/build/renderer/index.d.ts +0 -38
  144. package/build/renderer/index.js +0 -355
  145. package/build/services/color-scheme.service.d.ts +0 -13
  146. package/build/services/color-scheme.service.js +0 -72
  147. package/build/services/index.d.ts +0 -2
  148. package/build/services/index.js +0 -2
  149. package/build/services/window-dimensions.service.d.ts +0 -13
  150. package/build/services/window-dimensions.service.js +0 -83
  151. package/src/__tests__/responder-change-detection.test.ts +0 -102
  152. package/src/__tests__/responder-nested-cd.test.ts +0 -113
  153. package/src/angular-gaps.test.ts +0 -142
  154. package/src/angular-imports.test.ts +0 -100
  155. package/src/components/activity-indicator/activity-indicator-class-style.test.ts +0 -44
  156. package/src/components/activity-indicator/activity-indicator.test.ts +0 -131
  157. package/src/components/flat-list/column-wrapper-style-class.test.ts +0 -116
  158. package/src/components/flat-list/flat-list-array-style.test.ts +0 -131
  159. package/src/components/flat-list/flat-list-class-style.test.ts +0 -74
  160. package/src/components/flat-list/flat-list-scroll-containment.test.ts +0 -107
  161. package/src/components/flat-list/flat-list.test.ts +0 -99
  162. package/src/components/image/image-class-style.test.ts +0 -46
  163. package/src/components/image-background-class-style.test.ts +0 -48
  164. package/src/components/image-background-style-class.test.ts +0 -79
  165. package/src/components/input-accessory-view/input-accessory-view.test.ts +0 -43
  166. package/src/components/keyboard-avoiding-view/keyboard-avoiding-view.test.ts +0 -54
  167. package/src/components/modal/modal.test.ts +0 -43
  168. package/src/components/pressable/pressable.test.ts +0 -85
  169. package/src/components/refresh-control/refresh-control.test.ts +0 -41
  170. package/src/components/safe-area-view/safe-area-view.test.ts +0 -43
  171. package/src/components/scroll-view/android-scroll-view-axis-projection.test.ts +0 -123
  172. package/src/components/scroll-view/content-container-style-class.test.ts +0 -75
  173. package/src/components/scroll-view/scroll-view-class-style.test.ts +0 -134
  174. package/src/components/scroll-view/scroll-view-projection.test.ts +0 -194
  175. package/src/components/switch/android-switch-class.test.ts +0 -42
  176. package/src/components/switch/switch.test.ts +0 -92
  177. package/src/components/text-input-class-style.test.ts +0 -54
  178. package/src/components/touchable/touchable.test.ts +0 -102
  179. package/src/components/touchable-native-feedback/touchable-native-feedback.test.ts +0 -49
  180. package/src/components/virtualized-list/virtualized-list-class-style.test.ts +0 -76
  181. package/src/components/virtualized-section-list/virtualized-section-list-class-style.test.ts +0 -60
  182. package/src/create-portal/create-portal.test.ts +0 -90
  183. package/src/create-tunnel/create-tunnel.test.ts +0 -120
  184. package/src/descriptor-to-angular/descriptor-outlet.test.ts +0 -94
  185. package/src/host-instance/host-instance.test.ts +0 -49
  186. package/src/modules/animated/animated-leaf-binder/animated-leaf-binder.test.ts +0 -116
  187. package/src/modules/animated/animated-leaf-binder.test.ts +0 -116
  188. package/src/modules/animated/animated-scroll-view.test.ts +0 -102
  189. package/src/modules/app-registry/app-registry.test.ts +0 -106
  190. package/src/modules/status-bar/status-bar.test.ts +0 -50
  191. package/src/render/render.test.ts +0 -147
  192. package/src/renderer/renderer.test.ts +0 -202
  193. package/src/services/services.test.ts +0 -163
@@ -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
- }