@symbiote-native/angular 0.8.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +13 -10
  2. package/babel-register-composed.cjs +58 -18
  3. package/bin/symbiote-angular-dev.cjs +16 -4
  4. package/build/angular/anchor-host-registry.js +1 -15
  5. package/build/angular/anchor-host-registry.js.map +1 -1
  6. package/build/angular/change-detection-flush.d.ts +31 -0
  7. package/build/angular/change-detection-flush.js +110 -0
  8. package/build/angular/change-detection-flush.js.map +1 -0
  9. package/build/angular/components/activity-indicator-props.d.ts +2 -0
  10. package/build/angular/components/activity-indicator-props.js +2 -0
  11. package/build/angular/components/activity-indicator-props.js.map +1 -0
  12. package/build/angular/components/button-props.d.ts +2 -0
  13. package/build/angular/components/button-props.js +2 -0
  14. package/build/angular/components/button-props.js.map +1 -0
  15. package/build/angular/components/flat-list/index.d.ts +2 -1
  16. package/build/angular/components/flat-list/index.js +22 -10
  17. package/build/angular/components/flat-list/index.js.map +1 -1
  18. package/build/angular/components/image-background-props.d.ts +6 -0
  19. package/build/angular/components/image-background-props.js +2 -0
  20. package/build/angular/components/image-background-props.js.map +1 -0
  21. package/build/angular/components/{image/shared.d.ts → image-shared.d.ts} +4 -4
  22. package/build/angular/components/{image/shared.js → image-shared.js} +39 -28
  23. package/build/angular/components/image-shared.js.map +1 -0
  24. package/build/angular/components/input-accessory-view-props.d.ts +7 -0
  25. package/build/angular/components/input-accessory-view-props.js +9 -0
  26. package/build/angular/components/input-accessory-view-props.js.map +1 -0
  27. package/build/angular/components/keyboard-avoiding-view/index.d.ts +2 -1
  28. package/build/angular/components/keyboard-avoiding-view/index.js +28 -27
  29. package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
  30. package/build/angular/components/modal/index.d.ts +2 -0
  31. package/build/angular/components/modal/index.js +33 -20
  32. package/build/angular/components/modal/index.js.map +1 -1
  33. package/build/angular/components/pressable-props.d.ts +32 -0
  34. package/build/angular/components/pressable-props.js +11 -0
  35. package/build/angular/components/pressable-props.js.map +1 -0
  36. package/build/angular/components/refresh-control-props.d.ts +16 -0
  37. package/build/angular/components/refresh-control-props.js +14 -0
  38. package/build/angular/components/refresh-control-props.js.map +1 -0
  39. package/build/angular/components/safe-area-view-props.d.ts +7 -0
  40. package/build/angular/components/safe-area-view-props.js +11 -0
  41. package/build/angular/components/safe-area-view-props.js.map +1 -0
  42. package/build/angular/components/scroll-view-props.d.ts +76 -0
  43. package/build/angular/components/scroll-view-props.js +18 -0
  44. package/build/angular/components/scroll-view-props.js.map +1 -0
  45. package/build/angular/components/section-list/index.d.ts +3 -0
  46. package/build/angular/components/section-list/index.js +10 -1
  47. package/build/angular/components/section-list/index.js.map +1 -1
  48. package/build/angular/components/text-input-props.d.ts +45 -0
  49. package/build/angular/components/text-input-props.js +18 -0
  50. package/build/angular/components/text-input-props.js.map +1 -0
  51. package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.d.ts +6 -0
  52. package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.js +2 -0
  53. package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.js.map +1 -0
  54. package/build/angular/components/touchable-props.d.ts +14 -0
  55. package/build/angular/components/touchable-props.js +13 -0
  56. package/build/angular/components/touchable-props.js.map +1 -0
  57. package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.d.ts +3 -0
  58. package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.js +2 -0
  59. package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.js.map +1 -0
  60. package/build/angular/components/virtualized-list/index.d.ts +8 -1
  61. package/build/angular/components/virtualized-list/index.js +373 -278
  62. package/build/angular/components/virtualized-list/index.js.map +1 -1
  63. package/build/angular/components/virtualized-section-list/index.d.ts +3 -0
  64. package/build/angular/components/virtualized-section-list/index.js +10 -1
  65. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  66. package/build/angular/components.d.ts +21 -27
  67. package/build/angular/components.js +13 -15
  68. package/build/angular/components.js.map +1 -1
  69. package/build/angular/create-portal/index.d.ts +11 -2
  70. package/build/angular/create-portal/index.js +37 -11
  71. package/build/angular/create-portal/index.js.map +1 -1
  72. package/build/angular/create-tunnel/index.js +1 -1
  73. package/build/angular/element-props.d.ts +53 -0
  74. package/build/angular/element-props.js +2 -0
  75. package/build/angular/element-props.js.map +1 -0
  76. package/build/angular/elements.d.ts +528 -0
  77. package/build/angular/elements.js +1444 -0
  78. package/build/angular/elements.js.map +1 -0
  79. package/build/angular/gate-demand.d.ts +37 -0
  80. package/build/angular/gate-demand.js +84 -0
  81. package/build/angular/gate-demand.js.map +1 -0
  82. package/build/angular/host-instance/index.js +1 -1
  83. package/build/angular/index.d.ts +5 -2
  84. package/build/angular/index.js +16 -1
  85. package/build/angular/index.js.map +1 -1
  86. package/build/angular/modules/animated/create-animated-component.d.ts +6 -6
  87. package/build/angular/modules/animated/create-animated-component.js +73 -81
  88. package/build/angular/modules/animated/create-animated-component.js.map +1 -1
  89. package/build/angular/modules/animated/index.js +1 -1
  90. package/build/angular/modules/animated/index.js.map +1 -1
  91. package/build/angular/modules/image/index.d.ts +3 -0
  92. package/build/angular/modules/image/index.js +16 -0
  93. package/build/angular/modules/image/index.js.map +1 -0
  94. package/build/angular/primitives/index.d.ts +28 -16
  95. package/build/angular/primitives/index.js +77 -31
  96. package/build/angular/primitives/index.js.map +1 -1
  97. package/build/angular/primitives/shared.d.ts +2 -3
  98. package/build/angular/primitives/shared.js +8 -53
  99. package/build/angular/primitives/shared.js.map +1 -1
  100. package/build/angular/register.d.ts +1 -0
  101. package/build/angular/register.js +16 -0
  102. package/build/angular/register.js.map +1 -0
  103. package/build/angular/render/index.js +4 -2
  104. package/build/angular/render/index.js.map +1 -1
  105. package/build/angular/renderer/index.js +207 -60
  106. package/build/angular/renderer/index.js.map +1 -1
  107. package/build/angular/renderer/value-change.d.ts +2 -0
  108. package/build/angular/renderer/value-change.js +9 -0
  109. package/build/angular/renderer/value-change.js.map +1 -0
  110. package/metro-config.cjs +23 -5
  111. package/metro-css-parser.cjs +2 -1
  112. package/package.json +17 -7
  113. package/src/anchor-host-registry.ts +1 -15
  114. package/src/change-detection-flush.ts +120 -0
  115. package/src/components/activity-indicator-props.ts +21 -0
  116. package/src/components/button-props.ts +26 -0
  117. package/src/components/flat-list/index.ts +12 -4
  118. package/src/components/image-background-props.ts +24 -0
  119. package/src/components/{image/shared.ts → image-shared.ts} +57 -26
  120. package/src/components/input-accessory-view-props.ts +21 -0
  121. package/src/components/keyboard-avoiding-view/index.ts +27 -16
  122. package/src/components/modal/index.ts +32 -11
  123. package/src/components/pressable-props.ts +73 -0
  124. package/src/components/refresh-control-props.ts +43 -0
  125. package/src/components/safe-area-view-props.ts +28 -0
  126. package/src/components/scroll-view-props.ts +109 -0
  127. package/src/components/section-list/index.ts +18 -0
  128. package/src/components/text-input-props.ts +72 -0
  129. package/src/components/touchable-native-feedback/touchable-native-feedback-props.ts +23 -0
  130. package/src/components/touchable-props.ts +30 -0
  131. package/src/components/touchable-without-feedback/touchable-without-feedback-props.ts +21 -0
  132. package/src/components/virtualized-list/index.ts +254 -153
  133. package/src/components/virtualized-section-list/index.ts +18 -0
  134. package/src/components.ts +86 -35
  135. package/src/create-portal/index.ts +39 -9
  136. package/src/create-tunnel/index.ts +1 -1
  137. package/src/diagnostics.ts +1 -1
  138. package/src/element-props.ts +90 -0
  139. package/src/elements.ts +919 -0
  140. package/src/gate-demand.ts +109 -0
  141. package/src/host-instance/index.ts +1 -1
  142. package/src/index.ts +54 -15
  143. package/src/modules/animated/create-animated-component.ts +73 -59
  144. package/src/modules/animated/index.ts +1 -1
  145. package/src/modules/image/index.ts +18 -0
  146. package/src/primitives/index.ts +47 -16
  147. package/src/primitives/shared.ts +11 -44
  148. package/src/register.ts +15 -0
  149. package/src/render/index.ts +4 -2
  150. package/src/renderer/index.ts +239 -80
  151. package/src/renderer/value-change.ts +8 -0
  152. package/build/angular/components/activity-indicator/index.android.d.ts +0 -13
  153. package/build/angular/components/activity-indicator/index.android.js +0 -29
  154. package/build/angular/components/activity-indicator/index.android.js.map +0 -1
  155. package/build/angular/components/activity-indicator/index.d.ts +0 -1
  156. package/build/angular/components/activity-indicator/index.ios.d.ts +0 -9
  157. package/build/angular/components/activity-indicator/index.ios.js +0 -26
  158. package/build/angular/components/activity-indicator/index.ios.js.map +0 -1
  159. package/build/angular/components/activity-indicator/index.js +0 -4
  160. package/build/angular/components/activity-indicator/index.js.map +0 -1
  161. package/build/angular/components/activity-indicator/shared.d.ts +0 -67
  162. package/build/angular/components/activity-indicator/shared.js +0 -260
  163. package/build/angular/components/activity-indicator/shared.js.map +0 -1
  164. package/build/angular/components/button.d.ts +0 -65
  165. package/build/angular/components/button.js +0 -351
  166. package/build/angular/components/button.js.map +0 -1
  167. package/build/angular/components/image/index.android.d.ts +0 -15
  168. package/build/angular/components/image/index.android.js +0 -91
  169. package/build/angular/components/image/index.android.js.map +0 -1
  170. package/build/angular/components/image/index.d.ts +0 -1
  171. package/build/angular/components/image/index.ios.d.ts +0 -15
  172. package/build/angular/components/image/index.ios.js +0 -91
  173. package/build/angular/components/image/index.ios.js.map +0 -1
  174. package/build/angular/components/image/index.js +0 -3
  175. package/build/angular/components/image/index.js.map +0 -1
  176. package/build/angular/components/image/shared.js.map +0 -1
  177. package/build/angular/components/image-background.d.ts +0 -82
  178. package/build/angular/components/image-background.js +0 -434
  179. package/build/angular/components/image-background.js.map +0 -1
  180. package/build/angular/components/input-accessory-view/index.d.ts +0 -65
  181. package/build/angular/components/input-accessory-view/index.js +0 -290
  182. package/build/angular/components/input-accessory-view/index.js.map +0 -1
  183. package/build/angular/components/pressable/index.d.ts +0 -129
  184. package/build/angular/components/pressable/index.js +0 -473
  185. package/build/angular/components/pressable/index.js.map +0 -1
  186. package/build/angular/components/refresh-control/index.d.ts +0 -90
  187. package/build/angular/components/refresh-control/index.js +0 -380
  188. package/build/angular/components/refresh-control/index.js.map +0 -1
  189. package/build/angular/components/safe-area-view/index.d.ts +0 -62
  190. package/build/angular/components/safe-area-view/index.js +0 -287
  191. package/build/angular/components/safe-area-view/index.js.map +0 -1
  192. package/build/angular/components/scroll-view/index.android.d.ts +0 -20
  193. package/build/angular/components/scroll-view/index.android.js +0 -262
  194. package/build/angular/components/scroll-view/index.android.js.map +0 -1
  195. package/build/angular/components/scroll-view/index.d.ts +0 -3
  196. package/build/angular/components/scroll-view/index.ios.d.ts +0 -8
  197. package/build/angular/components/scroll-view/index.ios.js +0 -92
  198. package/build/angular/components/scroll-view/index.ios.js.map +0 -1
  199. package/build/angular/components/scroll-view/index.js +0 -6
  200. package/build/angular/components/scroll-view/index.js.map +0 -1
  201. package/build/angular/components/scroll-view/projection.d.ts +0 -67
  202. package/build/angular/components/scroll-view/projection.js +0 -560
  203. package/build/angular/components/scroll-view/projection.js.map +0 -1
  204. package/build/angular/components/scroll-view/shared.d.ts +0 -239
  205. package/build/angular/components/scroll-view/shared.js +0 -832
  206. package/build/angular/components/scroll-view/shared.js.map +0 -1
  207. package/build/angular/components/scroll-view/sticky-header.d.ts +0 -40
  208. package/build/angular/components/scroll-view/sticky-header.js +0 -224
  209. package/build/angular/components/scroll-view/sticky-header.js.map +0 -1
  210. package/build/angular/components/switch/index.android.d.ts +0 -24
  211. package/build/angular/components/switch/index.android.js +0 -112
  212. package/build/angular/components/switch/index.android.js.map +0 -1
  213. package/build/angular/components/switch/index.d.ts +0 -1
  214. package/build/angular/components/switch/index.ios.d.ts +0 -23
  215. package/build/angular/components/switch/index.ios.js +0 -111
  216. package/build/angular/components/switch/index.ios.js.map +0 -1
  217. package/build/angular/components/switch/index.js +0 -4
  218. package/build/angular/components/switch/index.js.map +0 -1
  219. package/build/angular/components/switch/shared.d.ts +0 -49
  220. package/build/angular/components/switch/shared.js +0 -191
  221. package/build/angular/components/switch/shared.js.map +0 -1
  222. package/build/angular/components/text-input.d.ts +0 -161
  223. package/build/angular/components/text-input.js +0 -659
  224. package/build/angular/components/text-input.js.map +0 -1
  225. package/build/angular/components/touchable/index.d.ts +0 -276
  226. package/build/angular/components/touchable/index.js +0 -1422
  227. package/build/angular/components/touchable/index.js.map +0 -1
  228. package/build/angular/components/touchable-native-feedback/index.d.ts +0 -86
  229. package/build/angular/components/touchable-native-feedback/index.js +0 -407
  230. package/build/angular/components/touchable-native-feedback/index.js.map +0 -1
  231. package/src/components/activity-indicator/index.android.ts +0 -23
  232. package/src/components/activity-indicator/index.ios.ts +0 -21
  233. package/src/components/activity-indicator/index.ts +0 -4
  234. package/src/components/activity-indicator/shared.ts +0 -225
  235. package/src/components/button.ts +0 -220
  236. package/src/components/image/index.android.ts +0 -99
  237. package/src/components/image/index.ios.ts +0 -99
  238. package/src/components/image/index.ts +0 -3
  239. package/src/components/image-background.ts +0 -290
  240. package/src/components/input-accessory-view/index.ts +0 -240
  241. package/src/components/pressable/index.ts +0 -462
  242. package/src/components/refresh-control/index.ts +0 -340
  243. package/src/components/safe-area-view/index.ts +0 -231
  244. package/src/components/scroll-view/index.android.ts +0 -205
  245. package/src/components/scroll-view/index.ios.ts +0 -81
  246. package/src/components/scroll-view/index.ts +0 -7
  247. package/src/components/scroll-view/projection.ts +0 -713
  248. package/src/components/scroll-view/shared.ts +0 -1066
  249. package/src/components/scroll-view/sticky-header.ts +0 -267
  250. package/src/components/switch/index.android.ts +0 -113
  251. package/src/components/switch/index.ios.ts +0 -112
  252. package/src/components/switch/index.ts +0 -4
  253. package/src/components/switch/shared.ts +0 -284
  254. package/src/components/text-input.ts +0 -613
  255. package/src/components/touchable/index.ts +0 -913
  256. package/src/components/touchable-native-feedback/index.ts +0 -317
@@ -1,205 +0,0 @@
1
- // ScrollView on Android. An Android ScrollView accepts only ONE child, so a RefreshControl can't
2
- // be a sibling of the content the way iOS allows ("addViewAt: failed to insert view ... at index
3
- // 1"). RN solves this by having the RefreshControl (AndroidSwipeRefreshLayout) WRAP the scroll
4
- // view (cloneElement(refreshControl, {style}, scrollView)). Angular mirrors that shape by querying
5
- // a projected <RefreshControl>, re-rendering its native prop surface as the outer wrapper, and
6
- // projecting every non-RefreshControl child into the inner scroll content.
7
- //
8
- // Android needs a different Fabric view per axis for both the outer scroll container
9
- // (RCTScrollView is vertical-only; AndroidHorizontalScrollView is a dedicated ViewManager) and the
10
- // inner content view (horizontal content is AndroidHorizontalScrollContentView, with its own
11
- // ShadowNode::layout() override) — but Angular only reliably projects into a component's
12
- // LAST-declared <ng-content> when 2+ DISTINCT declarations exist (angular/angular#22972), which an
13
- // earlier 4-call-site template (one <ng-content> per axis x refresh-control branch) tripped. Fix:
14
- // exactly ONE `<ng-content>` textually, inside a single top-level `<ng-template>`, re-instantiated
15
- // into whichever branch is active via a local template-outlet directive
16
- // (SymbioteTemplateOutletDirective below, `@angular/common`-free per this adapter's dependency
17
- // policy — see package.json). Only one branch is ever live, so the declaration count stays at one
18
- // and the "last one wins" limitation never triggers. Covered by
19
- // `android-scroll-view-axis-projection.test.ts` and `flat-list-scroll-containment.test.ts`.
20
- //
21
- // Metro picks this on an Android host; no Platform.OS read.
22
-
23
- import {
24
- CUSTOM_ELEMENTS_SCHEMA,
25
- ChangeDetectionStrategy,
26
- Component,
27
- Directive,
28
- Input,
29
- TemplateRef,
30
- ViewContainerRef,
31
- inject,
32
- type EmbeddedViewRef,
33
- type OnChanges,
34
- type OnDestroy,
35
- } from '@angular/core';
36
- import type { IStyleProp, IViewStyle } from '@symbiote-native/engine';
37
- import {
38
- HorizontalScrollContentView,
39
- HorizontalScrollView,
40
- RefreshControlHost,
41
- ScrollContentView,
42
- ScrollViewHost,
43
- SymbioteHostPropsDirective,
44
- SymbioteStyleInputDirective,
45
- } from '../../primitives';
46
- import {
47
- ScrollViewBase,
48
- ScrollViewProjectionDirective,
49
- SCROLL_VIEW_INPUTS,
50
- } from './shared';
51
- export type { IAngularScrollViewProps, IScrollViewHandle } from './shared';
52
-
53
- // Minimal local twin of `@angular/common`'s NgTemplateOutlet (this adapter deliberately has no
54
- // @angular/common dependency — see package.json): re-instantiates the SAME TemplateRef into
55
- // whichever structural branch below is currently active, so the component's compiled template
56
- // keeps exactly ONE <ng-content> declaration regardless of how many places reference it.
57
- @Directive({
58
- selector: '[symbioteTemplateOutlet]',
59
- standalone: true,
60
- })
61
- export class SymbioteTemplateOutletDirective implements OnChanges, OnDestroy {
62
- @Input() symbioteTemplateOutlet: TemplateRef<unknown> | null = null;
63
-
64
- private readonly viewContainerRef = inject(ViewContainerRef);
65
- private viewRef: EmbeddedViewRef<unknown> | undefined;
66
-
67
- ngOnChanges(): void {
68
- if (this.viewRef !== undefined) {
69
- this.viewRef.destroy();
70
- this.viewRef = undefined;
71
- }
72
- if (this.symbioteTemplateOutlet !== null) {
73
- this.viewRef = this.viewContainerRef.createEmbeddedView(
74
- this.symbioteTemplateOutlet,
75
- );
76
- }
77
- }
78
-
79
- ngOnDestroy(): void {
80
- this.viewRef?.destroy();
81
- }
82
- }
83
-
84
- // anchorHostStyle returns `unknown` (the anchor's already-resolved style, any shape); narrowed
85
- // here (mirrors the identical `asStyle` in image/shared.ts) rather than `as`-cast to satisfy
86
- // `IStyleProp<IViewStyle>`'s stricter array-element union.
87
- function asStyle(value: unknown): IStyleProp<IViewStyle> | undefined {
88
- return typeof value === 'object' && value !== null ? value : undefined;
89
- }
90
-
91
- // The symbiote-* host elements are imported as standalone components; the props directive is
92
- // applied as a template directive and the projection directive manages sticky-header wrapping.
93
- @Component({
94
- selector: 'ScrollView',
95
- standalone: true,
96
- hostDirectives: [
97
- { directive: SymbioteStyleInputDirective, inputs: ['style'] },
98
- ],
99
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
100
- imports: [
101
- ScrollViewHost,
102
- ScrollContentView,
103
- HorizontalScrollView,
104
- HorizontalScrollContentView,
105
- RefreshControlHost,
106
- SymbioteHostPropsDirective,
107
- ScrollViewProjectionDirective,
108
- SymbioteTemplateOutletDirective,
109
- ],
110
- changeDetection: ChangeDetectionStrategy.OnPush,
111
- inputs: SCROLL_VIEW_INPUTS,
112
- template: `
113
- <ng-template #sharedContent>
114
- <ng-content></ng-content>
115
- </ng-template>
116
- @if (isHorizontal) {
117
- @if (hasProjectedRefreshControl) {
118
- <symbiote-refresh-control
119
- #refreshHost="symbioteHost"
120
- [symbioteHostProps]="androidRefreshControlProps"
121
- (refresh)="handleProjectedRefresh(refreshHost.node)"
122
- >
123
- <symbiote-horizontal-scroll-view
124
- #host="symbioteHost"
125
- [symbioteHostProps]="androidWrappedScrollProps()"
126
- >
127
- <symbiote-horizontal-scroll-content
128
- [symbioteHostProps]="contentProps()"
129
- [symbioteScrollViewProjection]="projectionController"
130
- >
131
- <ng-container
132
- [symbioteTemplateOutlet]="sharedContent"
133
- ></ng-container>
134
- </symbiote-horizontal-scroll-content>
135
- </symbiote-horizontal-scroll-view>
136
- </symbiote-refresh-control>
137
- } @else {
138
- <symbiote-horizontal-scroll-view
139
- #host="symbioteHost"
140
- [symbioteHostProps]="scrollProps()"
141
- >
142
- <symbiote-horizontal-scroll-content
143
- [symbioteHostProps]="contentProps()"
144
- [symbioteScrollViewProjection]="projectionController"
145
- >
146
- <ng-container
147
- [symbioteTemplateOutlet]="sharedContent"
148
- ></ng-container>
149
- </symbiote-horizontal-scroll-content>
150
- </symbiote-horizontal-scroll-view>
151
- }
152
- } @else {
153
- @if (hasProjectedRefreshControl) {
154
- <symbiote-refresh-control
155
- #refreshHost="symbioteHost"
156
- [symbioteHostProps]="androidRefreshControlProps"
157
- (refresh)="handleProjectedRefresh(refreshHost.node)"
158
- >
159
- <symbiote-scroll-view
160
- #host="symbioteHost"
161
- [symbioteHostProps]="androidWrappedScrollProps()"
162
- >
163
- <symbiote-scroll-content
164
- [symbioteHostProps]="contentProps()"
165
- [symbioteScrollViewProjection]="projectionController"
166
- >
167
- <ng-container
168
- [symbioteTemplateOutlet]="sharedContent"
169
- ></ng-container>
170
- </symbiote-scroll-content>
171
- </symbiote-scroll-view>
172
- </symbiote-refresh-control>
173
- } @else {
174
- <symbiote-scroll-view
175
- #host="symbioteHost"
176
- [symbioteHostProps]="scrollProps()"
177
- >
178
- <symbiote-scroll-content
179
- [symbioteHostProps]="contentProps()"
180
- [symbioteScrollViewProjection]="projectionController"
181
- >
182
- <ng-container
183
- [symbioteTemplateOutlet]="sharedContent"
184
- ></ng-container>
185
- </symbiote-scroll-content>
186
- </symbiote-scroll-view>
187
- }
188
- }
189
- `,
190
- })
191
- export class ScrollView extends ScrollViewBase {
192
- // Feeds the anchor's class-derived style INTO the base class's own `splitLayoutProps` call
193
- // (shared.ts's `androidWrappedScrollProps`/`androidRefreshControlProps`), not tacked on after —
194
- // a class-only layout style (flex/height/gap/…) must be visible to the split itself, or the
195
- // Android outer refresh-control wrapper never receives its share and collapses to zero size
196
- // (a real device bug: the whole ScrollView renders nothing). See layoutSplitStyle's doc comment
197
- // in shared.ts and the identical fix already shipped in the Vue adapter's scroll-view.
198
- //
199
- // Reads the base's `anchorStyle` SIGNAL rather than calling anchorHostStyle() directly: this
200
- // getter is evaluated inside the `androidWrappedScrollProps` computed, where a plain read would
201
- // be untracked and leave the memoized bag holding a stale class.
202
- protected override get layoutSplitStyle(): IStyleProp<IViewStyle> {
203
- return [asStyle(this.anchorStyle()), this.style];
204
- }
205
- }
@@ -1,81 +0,0 @@
1
- // ScrollView on iOS. The RefreshControl is a CHILD of the scroll view, rendered
2
- // as a SIBLING BEFORE the content container (RN ScrollView.js: {refreshControl}{contentContainer}).
3
- // The developer composes it as a projected child of <ScrollView>; this template selects it into the
4
- // sibling slot before the scroll-content. Also the base (index.ts re-exports it) for headless /
5
- // web. Metro picks this on an iOS host; no Platform.OS read. Mirrors the React/Vue iOS binding.
6
- //
7
- // UNLIKE Android, iOS has only ONE host intrinsic pair regardless of axis (both horizontal and
8
- // vertical map to RCTScrollView / RCTScrollContentView) — `shared.ts`'s `scrollProps` already
9
- // forwards `horizontal` as a plain prop ("iOS needs `horizontal` to flip RCTScrollView's axis").
10
- // So, unlike `index.android.ts`, this file does NOT branch the host tag on `isHorizontal` — doing
11
- // so anyway (mirroring Android's shape for symmetry) used to declare `<ng-content>` once per
12
- // `@if`/`@else` branch, which trips a documented Angular limitation: content projected into the
13
- // FIRST (`@if`) branch never receives Angular's native catch-up placement, only the SECOND
14
- // (`@else`) branch does (angular/angular#53310, #54840 — Angular's own docs: "You should not
15
- // conditionally include <ng-content> with @if, @for, or @switch"). Symptom here was axis-specific:
16
- // a horizontal FlatList's cells landed outside the ScrollView entirely. Fix: single unconditional
17
- // `<ng-content>` call site.
18
-
19
- import {
20
- CUSTOM_ELEMENTS_SCHEMA,
21
- ChangeDetectionStrategy,
22
- Component,
23
- } from '@angular/core';
24
- import {
25
- RefreshControlHost,
26
- ScrollContentView,
27
- ScrollViewHost,
28
- SymbioteHostPropsDirective,
29
- SymbioteStyleInputDirective,
30
- } from '../../primitives';
31
- import {
32
- ScrollViewBase,
33
- ScrollViewProjectionDirective,
34
- SCROLL_VIEW_INPUTS,
35
- } from './shared';
36
- export type { IAngularScrollViewProps, IScrollViewHandle } from './shared';
37
-
38
- // The symbiote-* host elements are imported as standalone components; the props directive is
39
- // applied as a template directive and the projection directive manages sticky-header wrapping.
40
- @Component({
41
- selector: 'ScrollView',
42
- standalone: true,
43
- hostDirectives: [
44
- { directive: SymbioteStyleInputDirective, inputs: ['style'] },
45
- ],
46
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
47
- imports: [
48
- ScrollViewHost,
49
- ScrollContentView,
50
- RefreshControlHost,
51
- SymbioteHostPropsDirective,
52
- ScrollViewProjectionDirective,
53
- ],
54
- changeDetection: ChangeDetectionStrategy.OnPush,
55
- inputs: SCROLL_VIEW_INPUTS,
56
- template: `
57
- <symbiote-scroll-view
58
- #host="symbioteHost"
59
- [symbioteHostProps]="scrollProps()"
60
- >
61
- @if (hasProjectedRefreshControl) {
62
- <symbiote-refresh-control
63
- #refreshHost="symbioteHost"
64
- [symbioteHostProps]="iosRefreshControlProps"
65
- (refresh)="handleProjectedRefresh(refreshHost.node)"
66
- ></symbiote-refresh-control>
67
- }
68
- <symbiote-scroll-content
69
- [symbioteHostProps]="contentProps()"
70
- [symbioteScrollViewProjection]="projectionController"
71
- >
72
- <ng-content></ng-content>
73
- </symbiote-scroll-content>
74
- </symbiote-scroll-view>
75
- `,
76
- })
77
- // Behavior lives entirely in ScrollViewBase; this class exists for the decorator + iOS template.
78
- // The anchor-style merge that used to be a `scrollProps` override here moved into the base's
79
- // `scrollProps` computed - a subclass getter cannot override a field, and both platforms merged it
80
- // identically anyway (see that computed's comment).
81
- export class ScrollView extends ScrollViewBase {}
@@ -1,7 +0,0 @@
1
- // Base / default ScrollView. Re-exports the iOS build. Metro overrides this with index.ios.ts /
2
- // index.android.ts on a real host; under tsx / tsc / web the host resolves here. Filename is the
3
- // selector, no Platform.OS read.
4
-
5
- export * from './index.ios';
6
- export { ScrollViewStickyHeader } from './sticky-header';
7
- export type { IStickyHeaderComponentType } from './sticky-header';