@symbiote-native/angular 3.3.0 → 3.4.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 (179) hide show
  1. package/babel-register-composed.cjs +1 -0
  2. package/build/angular/accessibility-inputs.d.ts +2 -1
  3. package/build/angular/accessibility-inputs.js +4 -1
  4. package/build/angular/accessibility-inputs.js.map +1 -1
  5. package/build/angular/callback-host.d.ts +1 -1
  6. package/build/angular/callback-host.js +57 -9
  7. package/build/angular/callback-host.js.map +1 -1
  8. package/build/angular/components/flat-list/flat-list-handle.d.ts +35 -0
  9. package/build/angular/components/flat-list/flat-list-handle.js +48 -0
  10. package/build/angular/components/flat-list/flat-list-handle.js.map +1 -0
  11. package/build/angular/components/flat-list/flat-list-template.d.ts +1 -1
  12. package/build/angular/components/flat-list/flat-list-template.js +16 -0
  13. package/build/angular/components/flat-list/flat-list-template.js.map +1 -1
  14. package/build/angular/components/flat-list/index.d.ts +6 -30
  15. package/build/angular/components/flat-list/index.js +6 -36
  16. package/build/angular/components/flat-list/index.js.map +1 -1
  17. package/build/angular/components/image-inputs.d.ts +4 -0
  18. package/build/angular/components/image-inputs.js +81 -0
  19. package/build/angular/components/image-inputs.js.map +1 -0
  20. package/build/angular/components/image-props-resolve.d.ts +3 -0
  21. package/build/angular/components/image-props-resolve.js +133 -0
  22. package/build/angular/components/image-props-resolve.js.map +1 -0
  23. package/build/angular/components/image-shared.d.ts +8 -6
  24. package/build/angular/components/image-shared.js +23 -212
  25. package/build/angular/components/image-shared.js.map +1 -1
  26. package/build/angular/components/input-accessory-view-props.d.ts +4 -4
  27. package/build/angular/components/keyboard-avoiding-view/index.d.ts +3 -6
  28. package/build/angular/components/keyboard-avoiding-view/index.js +29 -56
  29. package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
  30. package/build/angular/components/layout-conformance-props.d.ts +4 -0
  31. package/build/angular/components/layout-conformance-props.js +2 -0
  32. package/build/angular/components/layout-conformance-props.js.map +1 -0
  33. package/build/angular/components/modal/index.d.ts +6 -5
  34. package/build/angular/components/modal/index.js +17 -2
  35. package/build/angular/components/modal/index.js.map +1 -1
  36. package/build/angular/components/refresh-control-props.d.ts +7 -7
  37. package/build/angular/components/scroll-view-props.d.ts +8 -5
  38. package/build/angular/components/section-list/index.d.ts +17 -8
  39. package/build/angular/components/section-list/index.js +37 -28
  40. package/build/angular/components/section-list/index.js.map +1 -1
  41. package/build/angular/components/touchable-props.d.ts +2 -2
  42. package/build/angular/components/virtualized-list/cell-renderer-context.d.ts +12 -0
  43. package/build/angular/components/virtualized-list/cell-renderer-context.js +16 -0
  44. package/build/angular/components/virtualized-list/cell-renderer-context.js.map +1 -0
  45. package/build/angular/components/virtualized-list/directives.d.ts +26 -6
  46. package/build/angular/components/virtualized-list/directives.js +59 -5
  47. package/build/angular/components/virtualized-list/directives.js.map +1 -1
  48. package/build/angular/components/virtualized-list/index.d.ts +19 -15
  49. package/build/angular/components/virtualized-list/index.js +91 -61
  50. package/build/angular/components/virtualized-list/index.js.map +1 -1
  51. package/build/angular/components/virtualized-list/list-bags.d.ts +5 -1
  52. package/build/angular/components/virtualized-list/list-bags.js +31 -19
  53. package/build/angular/components/virtualized-list/list-bags.js.map +1 -1
  54. package/build/angular/components/virtualized-list/list-effects.d.ts +2 -2
  55. package/build/angular/components/virtualized-list/list-effects.js +17 -27
  56. package/build/angular/components/virtualized-list/list-effects.js.map +1 -1
  57. package/build/angular/components/virtualized-list/list-handle.d.ts +4 -1
  58. package/build/angular/components/virtualized-list/list-handle.js +13 -3
  59. package/build/angular/components/virtualized-list/list-handle.js.map +1 -1
  60. package/build/angular/components/virtualized-list/list-inputs.d.ts +19 -5
  61. package/build/angular/components/virtualized-list/list-inputs.js +47 -4
  62. package/build/angular/components/virtualized-list/list-inputs.js.map +1 -1
  63. package/build/angular/components/virtualized-list/list-props.d.ts +9 -3
  64. package/build/angular/components/virtualized-list/list-rows.d.ts +25 -0
  65. package/build/angular/components/virtualized-list/list-rows.js +25 -0
  66. package/build/angular/components/virtualized-list/list-rows.js.map +1 -0
  67. package/build/angular/components/virtualized-list/list-styles.d.ts +4 -0
  68. package/build/angular/components/virtualized-list/list-styles.js +10 -2
  69. package/build/angular/components/virtualized-list/list-styles.js.map +1 -1
  70. package/build/angular/components/virtualized-list/list-template.d.ts +1 -1
  71. package/build/angular/components/virtualized-list/list-template.js +159 -73
  72. package/build/angular/components/virtualized-list/list-template.js.map +1 -1
  73. package/build/angular/components/virtualized-list/nested-scope.d.ts +6 -0
  74. package/build/angular/components/virtualized-list/nested-scope.js +17 -0
  75. package/build/angular/components/virtualized-list/nested-scope.js.map +1 -0
  76. package/build/angular/components/virtualized-section-list/directives.d.ts +21 -9
  77. package/build/angular/components/virtualized-section-list/directives.js +8 -28
  78. package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
  79. package/build/angular/components/virtualized-section-list/index.d.ts +39 -60
  80. package/build/angular/components/virtualized-section-list/index.js +67 -33
  81. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  82. package/build/angular/components/virtualized-section-list/section-cell.d.ts +29 -0
  83. package/build/angular/components/virtualized-section-list/section-cell.js +82 -0
  84. package/build/angular/components/virtualized-section-list/section-cell.js.map +1 -0
  85. package/build/angular/components/virtualized-section-list/section-list-props.d.ts +56 -0
  86. package/build/angular/components/virtualized-section-list/section-list-props.js +3 -0
  87. package/build/angular/components/virtualized-section-list/section-list-props.js.map +1 -0
  88. package/build/angular/components/virtualized-section-list/section-list-template.d.ts +1 -1
  89. package/build/angular/components/virtualized-section-list/section-list-template.js +34 -26
  90. package/build/angular/components/virtualized-section-list/section-list-template.js.map +1 -1
  91. package/build/angular/components.d.ts +7 -3
  92. package/build/angular/components.js +2 -1
  93. package/build/angular/components.js.map +1 -1
  94. package/build/angular/element-base.d.ts +17 -1
  95. package/build/angular/element-base.js +33 -1
  96. package/build/angular/element-base.js.map +1 -1
  97. package/build/angular/element-props.d.ts +7 -7
  98. package/build/angular/element-text-input-native.d.ts +27 -0
  99. package/build/angular/element-text-input-native.js +52 -0
  100. package/build/angular/element-text-input-native.js.map +1 -0
  101. package/build/angular/elements-controls.d.ts +8 -2
  102. package/build/angular/elements-controls.js +13 -1
  103. package/build/angular/elements-controls.js.map +1 -1
  104. package/build/angular/elements-layout.d.ts +20 -3
  105. package/build/angular/elements-layout.js +37 -3
  106. package/build/angular/elements-layout.js.map +1 -1
  107. package/build/angular/elements-press.d.ts +10 -3
  108. package/build/angular/elements-press.js +13 -1
  109. package/build/angular/elements-press.js.map +1 -1
  110. package/build/angular/elements.d.ts +3 -3
  111. package/build/angular/elements.js +3 -2
  112. package/build/angular/elements.js.map +1 -1
  113. package/build/angular/index.d.ts +14 -7
  114. package/build/angular/index.js +21 -25
  115. package/build/angular/index.js.map +1 -1
  116. package/build/angular/modules/animated/create-animated-component.d.ts +1 -1
  117. package/build/angular/modules/animated/create-animated-component.js +1 -1
  118. package/build/angular/modules/animated/create-animated-component.js.map +1 -1
  119. package/build/angular/modules/animated/index.d.ts +54 -41
  120. package/build/angular/modules/animated/index.js +2 -26
  121. package/build/angular/modules/animated/index.js.map +1 -1
  122. package/build/angular/modules/app-registry/index.d.ts +3 -3
  123. package/build/angular/modules/app-registry/index.js +2 -2
  124. package/build/angular/modules/app-registry/index.js.map +1 -1
  125. package/build/angular/modules/status-bar/index.d.ts +9 -5
  126. package/build/angular/modules/status-bar/index.js +21 -10
  127. package/build/angular/modules/status-bar/index.js.map +1 -1
  128. package/build/angular/primitives/index.d.ts +4 -0
  129. package/build/angular/primitives/index.js +12 -0
  130. package/build/angular/primitives/index.js.map +1 -1
  131. package/build/angular/services/color-scheme.service.d.ts +1 -1
  132. package/package.json +6 -6
  133. package/src/accessibility-inputs.ts +3 -0
  134. package/src/callback-host.ts +56 -8
  135. package/src/components/flat-list/flat-list-handle.ts +64 -0
  136. package/src/components/flat-list/flat-list-template.ts +16 -0
  137. package/src/components/flat-list/index.ts +6 -48
  138. package/src/components/image-inputs.ts +94 -0
  139. package/src/components/image-props-resolve.ts +172 -0
  140. package/src/components/image-shared.ts +26 -291
  141. package/src/components/input-accessory-view-props.ts +12 -8
  142. package/src/components/keyboard-avoiding-view/index.ts +39 -79
  143. package/src/components/layout-conformance-props.ts +8 -0
  144. package/src/components/modal/index.ts +42 -20
  145. package/src/components/refresh-control-props.ts +29 -25
  146. package/src/components/scroll-view-props.ts +84 -76
  147. package/src/components/section-list/index.ts +34 -37
  148. package/src/components/touchable-props.ts +6 -2
  149. package/src/components/virtualized-list/cell-renderer-context.ts +36 -0
  150. package/src/components/virtualized-list/directives.ts +84 -8
  151. package/src/components/virtualized-list/index.ts +118 -85
  152. package/src/components/virtualized-list/list-bags.ts +38 -19
  153. package/src/components/virtualized-list/list-effects.ts +20 -32
  154. package/src/components/virtualized-list/list-handle.ts +17 -4
  155. package/src/components/virtualized-list/list-inputs.ts +47 -0
  156. package/src/components/virtualized-list/list-props.ts +57 -50
  157. package/src/components/virtualized-list/list-rows.ts +66 -0
  158. package/src/components/virtualized-list/list-styles.ts +30 -1
  159. package/src/components/virtualized-list/list-template.ts +159 -73
  160. package/src/components/virtualized-list/nested-scope.ts +22 -0
  161. package/src/components/virtualized-section-list/directives.ts +41 -40
  162. package/src/components/virtualized-section-list/index.ts +114 -118
  163. package/src/components/virtualized-section-list/section-cell.ts +109 -0
  164. package/src/components/virtualized-section-list/section-list-props.ts +79 -0
  165. package/src/components/virtualized-section-list/section-list-template.ts +34 -26
  166. package/src/components.ts +8 -0
  167. package/src/element-base.ts +17 -0
  168. package/src/element-props.ts +35 -33
  169. package/src/element-text-input-native.ts +31 -0
  170. package/src/elements-controls.ts +9 -1
  171. package/src/elements-layout.ts +27 -0
  172. package/src/elements-press.ts +10 -2
  173. package/src/elements.ts +3 -0
  174. package/src/index.ts +72 -22
  175. package/src/modules/animated/index.ts +2 -47
  176. package/src/modules/app-registry/index.ts +3 -1
  177. package/src/modules/status-bar/index.ts +24 -11
  178. package/src/primitives/index.ts +7 -0
  179. package/src/services/color-scheme.service.ts +1 -1
@@ -13,6 +13,7 @@ export const VIRTUALIZED_SECTION_LIST_TEMPLATE = `
13
13
  [stickyHeaderIndices]="stickyHeaderIndices"
14
14
  [extraData]="extraData"
15
15
  [inverted]="inverted"
16
+ [horizontal]="horizontal"
16
17
  [refreshing]="refreshing"
17
18
  [progressViewOffset]="progressViewOffset"
18
19
  [refreshRequested]="refreshRequested ?? refresh.observed"
@@ -26,25 +27,32 @@ export const VIRTUALIZED_SECTION_LIST_TEMPLATE = `
26
27
  [maxToRenderPerBatch]="maxToRenderPerBatch"
27
28
  [updateCellsBatchingPeriod]="updateCellsBatchingPeriod"
28
29
  [windowSize]="windowSize"
30
+ [disableVirtualization]="disableVirtualization"
29
31
  [maintainVisibleContentPosition]="maintainVisibleContentPosition"
30
32
  [onScroll]="onScroll"
31
33
  [onScrollBeginDrag]="onScrollBeginDrag"
32
34
  [onScrollEndDrag]="onScrollEndDrag"
33
35
  [onMomentumScrollBegin]="onMomentumScrollBegin"
34
36
  [onMomentumScrollEnd]="onMomentumScrollEnd"
37
+ [onContentSizeChange]="onContentSizeChange"
35
38
  [scrollEventThrottle]="scrollEventThrottle"
36
39
  [keyboardShouldPersistTaps]="keyboardShouldPersistTaps"
37
40
  [keyboardDismissMode]="keyboardDismissMode"
38
41
  [removeClippedSubviews]="removeClippedSubviews"
39
42
  [nestedScrollEnabled]="nestedScrollEnabled"
43
+ [stickyHeaderHiddenOnScroll]="stickyHeaderHiddenOnScroll"
44
+ [innerViewRef]="innerViewRef"
40
45
  [style]="resolvedStyle"
41
46
  [contentContainerStyle]="contentContainerStyle"
47
+ [listHeaderComponentStyle]="listHeaderComponentStyle"
48
+ [listFooterComponentStyle]="listFooterComponentStyle"
49
+ [cellRendererTemplate]="cellRendererTpl"
42
50
  [testID]="testID"
43
51
  [nativeID]="nativeID"
44
52
  ${LIST_ACCESSIBILITY_FORWARD}
45
53
  >
46
54
  <!-- The single synthesized cell template: dispatch per flattened entry tag -->
47
- <ng-template vListItem let-entry let-separators="separators">
55
+ <ng-template vListItem let-entry let-index="index">
48
56
  @switch (entryKind(entry)) {
49
57
  @case ('header') {
50
58
  <ng-container
@@ -58,16 +66,32 @@ export const VIRTUALIZED_SECTION_LIST_TEMPLATE = `
58
66
  [vListOutletContext]="sectionContextOf(entry)"
59
67
  ></ng-container>
60
68
  }
61
- @case ('section-separator') {
62
- <ng-container
63
- [vListOutlet]="sectionSeparatorDir?.templateRef"
64
- ></ng-container>
65
- }
66
69
  @case ('item') {
67
- <ng-container
68
- [vListOutlet]="sectionItemDir?.templateRef"
69
- [vListOutletContext]="itemContextOf(entry, separators)"
70
- ></ng-container>
70
+ @let plan = cellPlanOf(entry, index);
71
+ @if (plan !== undefined) {
72
+ <ng-container
73
+ vSectionCell
74
+ #cell="vSectionCell"
75
+ [board]="board"
76
+ [cellKey]="plan.cellKey"
77
+ [prevCellKey]="plan.prevCellKey"
78
+ [hasLeading]="plan.hasLeading"
79
+ [hasTrailing]="plan.hasTrailing"
80
+ >
81
+ <ng-container
82
+ [vListOutlet]="plan.first.template"
83
+ [vListOutletContext]="cell.contextOf(plan.first)"
84
+ ></ng-container>
85
+ <ng-container
86
+ [vListOutlet]="plan.itemTemplate"
87
+ [vListOutletContext]="itemContextOf(entry, cell.separators)"
88
+ ></ng-container>
89
+ <ng-container
90
+ [vListOutlet]="plan.second.template"
91
+ [vListOutletContext]="cell.contextOf(plan.second)"
92
+ ></ng-container>
93
+ </ng-container>
94
+ }
71
95
  }
72
96
  }
73
97
  </ng-template>
@@ -88,21 +112,5 @@ export const VIRTUALIZED_SECTION_LIST_TEMPLATE = `
88
112
  <ng-container [vListOutlet]="listEmptyDir.templateRef"></ng-container>
89
113
  </ng-template>
90
114
  }
91
- <!-- Item separator: unwrap each flattened entry back to its item -->
92
- @if (itemSeparatorDir !== undefined) {
93
- <ng-template
94
- vListSeparator
95
- let-highlighted
96
- let-leadingItem="leadingItem"
97
- let-trailingItem="trailingItem"
98
- >
99
- <ng-container
100
- [vListOutlet]="itemSeparatorDir.templateRef"
101
- [vListOutletContext]="
102
- itemSeparatorContextOf(highlighted, leadingItem, trailingItem)
103
- "
104
- ></ng-container>
105
- </ng-template>
106
- }
107
115
  </VirtualizedList>
108
116
  `;
package/src/components.ts CHANGED
@@ -48,6 +48,8 @@ export type {
48
48
  // an app's `imports: [SafeAreaView]` becomes `imports: [SafeAreaViewElement]`. Only the prop type
49
49
  // stays.
50
50
  export type { IAngularSafeAreaViewProps } from './components/safe-area-view-props';
51
+ export type { IAngularLayoutConformanceProps } from './components/layout-conformance-props';
52
+ export type { ILayoutConformanceMode } from '@symbiote-native/components';
51
53
  // `Switch` is a TAG — `<switch>`, matched by `SwitchElement` — and there is nothing to import in
52
54
  // its place. RN gives it no statics, so the name exports nothing at all now; `[(value)]` is handled
53
55
  // by the renderer and `[(ngModel)]` by `SwitchValueAccessor` (`../elements`), which is where the
@@ -126,12 +128,16 @@ export type { IButtonProps } from './components/button-props';
126
128
  export type { ICheckboxProps } from './components/checkbox-props';
127
129
  export {
128
130
  VirtualizedList,
131
+ VListCellDirective,
129
132
  VListEmptyDirective,
130
133
  VListFooterDirective,
131
134
  VListHeaderDirective,
132
135
  VListItemDirective,
136
+ VListOutletDirective,
133
137
  VListSeparatorDirective,
134
138
  } from './components/virtualized-list';
139
+ export { injectVirtualizedListScope } from './components/virtualized-list/nested-scope';
140
+ export type { IListScope } from '@symbiote-native/components';
135
141
  export type {
136
142
  ICellLayout,
137
143
  ISeparatorProps,
@@ -142,6 +148,7 @@ export type {
142
148
  IViewToken,
143
149
  IVirtualizedListHandle,
144
150
  IVirtualizedListProps,
151
+ IVListCellContext,
145
152
  IVListItemContext,
146
153
  IVListSeparatorContext,
147
154
  } from './components/virtualized-list';
@@ -160,6 +167,7 @@ export type {
160
167
  IVirtualizedSectionListProps,
161
168
  IVSectionContext,
162
169
  IVSectionItemContext,
170
+ IVSectionSeparatorContext,
163
171
  } from './components/virtualized-section-list';
164
172
  export { SectionList } from './components/section-list';
165
173
  export type {
@@ -57,6 +57,8 @@ export abstract class SymbioteElement implements OnChanges {
57
57
  @Input() accessibilityState?: IElementProps['accessibilityState'];
58
58
  @Input() accessibilityValue?: IElementProps['accessibilityValue'];
59
59
  @Input() accessibilityActions?: IElementProps['accessibilityActions'];
60
+ @Input()
61
+ experimental_accessibilityOrder?: IElementProps['experimental_accessibilityOrder'];
60
62
  @Input() accessibilityLabelledBy?: IElementProps['accessibilityLabelledBy'];
61
63
  @Input()
62
64
  importantForAccessibility?: IElementProps['importantForAccessibility'];
@@ -114,6 +116,21 @@ export abstract class SymbioteElement implements OnChanges {
114
116
  @Input() onResponderTerminate?: IElementProps['onResponderTerminate'];
115
117
  @Input()
116
118
  onResponderTerminationRequest?: IElementProps['onResponderTerminationRequest'];
119
+ @Input() onTouchStart?: IElementProps['onTouchStart'];
120
+ @Input() onTouchStartCapture?: IElementProps['onTouchStartCapture'];
121
+ @Input() onTouchMove?: IElementProps['onTouchMove'];
122
+ @Input() onTouchMoveCapture?: IElementProps['onTouchMoveCapture'];
123
+ @Input() onTouchEnd?: IElementProps['onTouchEnd'];
124
+ @Input() onTouchEndCapture?: IElementProps['onTouchEndCapture'];
125
+ @Input() onTouchCancel?: IElementProps['onTouchCancel'];
126
+ @Input() onTouchCancelCapture?: IElementProps['onTouchCancelCapture'];
127
+ @Input() onFocusCapture?: IElementProps['onFocusCapture'];
128
+ @Input() onBlurCapture?: IElementProps['onBlurCapture'];
129
+ @Input() onClickCapture?: IElementProps['onClickCapture'];
130
+ @Input() onKeyDown?: IElementProps['onKeyDown'];
131
+ @Input() onKeyDownCapture?: IElementProps['onKeyDownCapture'];
132
+ @Input() onKeyUp?: IElementProps['onKeyUp'];
133
+ @Input() onKeyUpCapture?: IElementProps['onKeyUpCapture'];
117
134
 
118
135
  @Input() pointerEvents?: IElementProps['pointerEvents'];
119
136
  @Input() hitSlop?: IElementProps['hitSlop'];
@@ -17,6 +17,7 @@ import type {
17
17
  IPressState,
18
18
  IRectOffset,
19
19
  IResponderProps,
20
+ ITextNativeOnlyProps,
20
21
  } from '@symbiote-native/components';
21
22
  import type {
22
23
  ISymbioteEvent,
@@ -38,38 +39,39 @@ export type IAngularStyleBinding<TStyle> = TStyle | string | null | undefined;
38
39
  export type IElementStyleProp =
39
40
  IStyleProp<IViewStyle> | ((state: IPressState) => IStyleProp<IViewStyle>);
40
41
 
41
- export interface IElementProps
42
- extends IAccessibilityProps, IAriaProps, IResponderProps {
43
- /** RN's modern W3C-named alias for `nativeID`; the renderer folds it (`PROP_ALIASES`). */
44
- id?: string;
45
- pointerEvents?: 'auto' | 'none' | 'box-none' | 'box-only';
46
- hitSlop?: IRectOffset | number;
47
- focusable?: boolean;
48
- collapsable?: boolean;
49
- removeClippedSubviews?: boolean;
50
- renderToHardwareTextureAndroid?: boolean;
51
- shouldRasterizeIOS?: boolean;
52
- needsOffscreenAlphaCompositing?: boolean;
53
- style?: IAngularStyleBinding<IViewStyle>;
54
- /**
55
- * An RN StyleProp as ONE property binding: arrays, falsy entries, and the press-state callback.
56
- * The callback is in the union because a subclass cannot widen an inherited property and
57
- * `<pressable>`/`<touchable-*>` are the tags that take one; on every other tag the engine resolves
58
- * it at `pressed: false`.
59
- */
60
- styleProp?: IElementStyleProp;
61
- onPress?: IEventHandler;
62
- onPressIn?: IEventHandler;
63
- onPressOut?: IEventHandler;
64
- onPressMove?: IEventHandler;
65
- onLongPress?: IEventHandler;
66
- onLayout?: IEventHandler;
67
- onFocus?: IEventHandler;
68
- onBlur?: IEventHandler;
69
- }
42
+ export type IElementProps = IAccessibilityProps &
43
+ IAriaProps &
44
+ IResponderProps & {
45
+ /** RN's modern W3C-named alias for `nativeID`; the renderer folds it (`PROP_ALIASES`). */
46
+ id?: string;
47
+ pointerEvents?: 'auto' | 'none' | 'box-none' | 'box-only';
48
+ hitSlop?: IRectOffset | number;
49
+ focusable?: boolean;
50
+ collapsable?: boolean;
51
+ removeClippedSubviews?: boolean;
52
+ renderToHardwareTextureAndroid?: boolean;
53
+ shouldRasterizeIOS?: boolean;
54
+ needsOffscreenAlphaCompositing?: boolean;
55
+ style?: IAngularStyleBinding<IViewStyle>;
56
+ /**
57
+ * An RN StyleProp as ONE property binding: arrays, falsy entries, and the press-state callback.
58
+ * The callback is in the union because a subclass cannot widen an inherited property and
59
+ * `<pressable>`/`<touchable-*>` are the tags that take one; on every other tag the engine resolves
60
+ * it at `pressed: false`.
61
+ */
62
+ styleProp?: IElementStyleProp;
63
+ onPress?: IEventHandler;
64
+ onPressIn?: IEventHandler;
65
+ onPressOut?: IEventHandler;
66
+ onPressMove?: IEventHandler;
67
+ onLongPress?: IEventHandler;
68
+ onLayout?: IEventHandler;
69
+ onFocus?: IEventHandler;
70
+ onBlur?: IEventHandler;
71
+ };
70
72
 
71
73
  /** Text's own surface on top of the shared one. `onTextLayout` is an event, so it is not here. */
72
- export interface ITextElementProps {
74
+ export type ITextElementProps = ITextNativeOnlyProps & {
73
75
  /** Narrows the shared `style` so `fontSize` / `fontWeight` type-check on a `<text>`. */
74
76
  style?: IAngularStyleBinding<ITextStyle>;
75
77
  styleProp?: IStyleProp<ITextStyle>;
@@ -84,12 +86,12 @@ export interface ITextElementProps {
84
86
  // RN's Text carries it (Text.js) and Button hands it to the label so a screen reader announces
85
87
  // the text as disabled along with the button holding it (Button.js:388).
86
88
  disabled?: boolean;
87
- }
89
+ };
88
90
 
89
91
  /** The sticky-header wrapper RN builds in JS (ScrollViewStickyHeader.js). */
90
- export interface IStickyHeaderElementProps {
92
+ export type IStickyHeaderElementProps = {
91
93
  inverted?: boolean;
92
94
  nextHeaderLayoutY?: number | null;
93
95
  scrollAnimatedValue?: unknown;
94
96
  scrollViewHeight?: number | null;
95
- }
97
+ };
@@ -0,0 +1,31 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import type { ITextInputProps } from '@symbiote-native/components';
3
+ import { ValueChangeElement } from './element-base';
4
+
5
+ // The inputs only one platform's native view reads, split from `TextInputElement` for file size
6
+ @Directive()
7
+ export abstract class TextInputNativeInputs extends ValueChangeElement {
8
+ @Input() caretHidden?: ITextInputProps['caretHidden'];
9
+ @Input() clearButtonMode?: ITextInputProps['clearButtonMode'];
10
+ @Input() clearTextOnFocus?: ITextInputProps['clearTextOnFocus'];
11
+ @Input() contextMenuHidden?: ITextInputProps['contextMenuHidden'];
12
+ @Input() dataDetectorTypes?: ITextInputProps['dataDetectorTypes'];
13
+ @Input() disableFullscreenUI?: ITextInputProps['disableFullscreenUI'];
14
+ @Input()
15
+ disableKeyboardShortcuts?: ITextInputProps['disableKeyboardShortcuts'];
16
+ @Input()
17
+ enablesReturnKeyAutomatically?: ITextInputProps['enablesReturnKeyAutomatically'];
18
+ @Input() importantForAutofill?: ITextInputProps['importantForAutofill'];
19
+ @Input() inlineImageLeft?: ITextInputProps['inlineImageLeft'];
20
+ @Input() inlineImagePadding?: ITextInputProps['inlineImagePadding'];
21
+ @Input()
22
+ inputAccessoryViewButtonLabel?: ITextInputProps['inputAccessoryViewButtonLabel'];
23
+ @Input() keyboardAppearance?: ITextInputProps['keyboardAppearance'];
24
+ @Input() lineBreakModeIOS?: ITextInputProps['lineBreakModeIOS'];
25
+ @Input() lineBreakStrategyIOS?: ITextInputProps['lineBreakStrategyIOS'];
26
+ @Input() passwordRules?: ITextInputProps['passwordRules'];
27
+ @Input() returnKeyLabel?: ITextInputProps['returnKeyLabel'];
28
+ @Input() smartInsertDelete?: ITextInputProps['smartInsertDelete'];
29
+ @Input() spellCheck?: ITextInputProps['spellCheck'];
30
+ @Input() textBreakStrategy?: ITextInputProps['textBreakStrategy'];
31
+ }
@@ -14,12 +14,14 @@ import { VALUE_CHANGE_EVENT } from './renderer/value-change';
14
14
  import type {
15
15
  IActivityIndicatorProps,
16
16
  IInputAccessoryViewViewProps,
17
+ ILayoutConformanceMode,
17
18
  IModalViewProps,
18
19
  ISwitchProps,
19
20
  ITextInputProps,
20
21
  } from '@symbiote-native/components';
21
22
  import type { IStickyHeaderElementProps } from './element-props';
22
23
  import type { IAngularRefreshControlProps } from './components/refresh-control-props';
24
+ import { TextInputNativeInputs } from './element-text-input-native';
23
25
  import {
24
26
  ReadBackElement,
25
27
  SymbioteElement,
@@ -27,7 +29,7 @@ import {
27
29
  } from './element-base';
28
30
 
29
31
  @Directive({ selector: 'text-input', standalone: true })
30
- export class TextInputElement extends ValueChangeElement {
32
+ export class TextInputElement extends TextInputNativeInputs {
31
33
  @Input() value?: ITextInputProps['value'];
32
34
  @Input() defaultValue?: ITextInputProps['defaultValue'];
33
35
  @Input() placeholder?: ITextInputProps['placeholder'];
@@ -236,6 +238,12 @@ export class ActivityIndicatorSpinnerElement extends ActivityIndicatorElement {}
236
238
  @Directive({ selector: 'safe-area-view', standalone: true })
237
239
  export class SafeAreaViewElement extends SymbioteElement {}
238
240
 
241
+ // RN's `experimental_LayoutConformance`: the tag paints as `display: contents` through its fold
242
+ @Directive({ selector: 'layout-conformance', standalone: true })
243
+ export class LayoutConformanceElement extends SymbioteElement {
244
+ @Input() mode?: ILayoutConformanceMode;
245
+ }
246
+
239
247
  @Directive({ selector: 'modal, symbiote-modal', standalone: true })
240
248
  export class ModalElement extends SymbioteElement {
241
249
  @Input() visible?: IModalViewProps['visible'];
@@ -14,6 +14,7 @@ export class ImageElement extends SymbioteElement {
14
14
  @Input() height?: IImageProps['height'];
15
15
  @Input() resizeMode?: IImageProps['resizeMode'];
16
16
  @Input() resizeMethod?: IImageProps['resizeMethod'];
17
+ @Input() resizeMultiplier?: IImageProps['resizeMultiplier'];
17
18
  @Input() defaultSource?: IImageProps['defaultSource'];
18
19
  @Input() loadingIndicatorSource?: IImageProps['loadingIndicatorSource'];
19
20
  @Input() blurRadius?: IImageProps['blurRadius'];
@@ -47,6 +48,7 @@ export class ImageBackgroundElement extends SymbioteElement {
47
48
  @Input() height?: IImageProps['height'];
48
49
  @Input() resizeMode?: IImageProps['resizeMode'];
49
50
  @Input() resizeMethod?: IImageProps['resizeMethod'];
51
+ @Input() resizeMultiplier?: IImageProps['resizeMultiplier'];
50
52
  @Input() defaultSource?: IImageProps['defaultSource'];
51
53
  @Input() loadingIndicatorSource?: IImageProps['loadingIndicatorSource'];
52
54
  @Input() blurRadius?: IImageProps['blurRadius'];
@@ -129,6 +131,31 @@ export class ScrollViewElement extends SymbioteElement {
129
131
  @Input() onMomentumScrollEnd?: IAngularScrollViewProps['onMomentumScrollEnd'];
130
132
  @Input() onScrollToTop?: IAngularScrollViewProps['onScrollToTop'];
131
133
  @Input() onContentSizeChange?: IAngularScrollViewProps['onContentSizeChange'];
134
+ @Input()
135
+ onKeyboardWillShow?: IAngularScrollViewProps['onKeyboardWillShow'];
136
+ @Input()
137
+ onKeyboardWillHide?: IAngularScrollViewProps['onKeyboardWillHide'];
138
+ @Input() onKeyboardDidShow?: IAngularScrollViewProps['onKeyboardDidShow'];
139
+ @Input() onKeyboardDidHide?: IAngularScrollViewProps['onKeyboardDidHide'];
140
+ @Input()
141
+ automaticallyAdjustContentInsets?: IAngularScrollViewProps['automaticallyAdjustContentInsets'];
142
+ @Input()
143
+ automaticallyAdjustsScrollIndicatorInsets?: IAngularScrollViewProps['automaticallyAdjustsScrollIndicatorInsets'];
144
+ @Input()
145
+ canCancelContentTouches?: IAngularScrollViewProps['canCancelContentTouches'];
146
+ @Input()
147
+ experimental_endDraggingSensitivityMultiplier?: IAngularScrollViewProps['experimental_endDraggingSensitivityMultiplier'];
148
+ @Input() innerViewRef?: IAngularScrollViewProps['innerViewRef'];
149
+ @Input()
150
+ onScrollAnimationEnd?: IAngularScrollViewProps['onScrollAnimationEnd'];
151
+ @Input() scrollPerfTag?: IAngularScrollViewProps['scrollPerfTag'];
152
+ @Input()
153
+ scrollToOverflowEnabled?: IAngularScrollViewProps['scrollToOverflowEnabled'];
154
+ @Input()
155
+ scrollsChildToFocus?: IAngularScrollViewProps['scrollsChildToFocus'];
156
+ @Input() scrollsToTop?: IAngularScrollViewProps['scrollsToTop'];
157
+ @Input()
158
+ stickyHeaderHiddenOnScroll?: IAngularScrollViewProps['stickyHeaderHiddenOnScroll'];
132
159
  }
133
160
 
134
161
  @Directive({ selector: 'horizontal-scroll-view', standalone: true })
@@ -1,5 +1,6 @@
1
1
  import { Directive, Input } from '@angular/core';
2
2
  import type { INativeFeedbackBackground } from '@symbiote-native/components';
3
+ import type { IColorValue } from '@symbiote-native/engine';
3
4
  import type { ITextElementProps } from './element-props';
4
5
  import type { ICheckboxProps } from './components/checkbox-props';
5
6
  import type { IAngularPressableProps } from './components/pressable-props';
@@ -73,7 +74,7 @@ export class TouchableOpacityElement extends PressableElement {
73
74
  @Directive({ selector: 'touchable-highlight', standalone: true })
74
75
  export class TouchableHighlightElement extends PressableElement {
75
76
  @Input() activeOpacity?: number;
76
- @Input() underlayColor?: string;
77
+ @Input() underlayColor?: IColorValue;
77
78
  @Input() delayPressIn?: number;
78
79
  @Input() delayPressOut?: number;
79
80
  @Input() minPressDuration?: number;
@@ -112,7 +113,7 @@ export class TouchableWithoutFeedbackElement extends PressableElement {
112
113
  @Directive({ selector: 'button, symbiote-button', standalone: true })
113
114
  export class ButtonElement extends TouchableOpacityElement {
114
115
  @Input() title?: string;
115
- @Input() color?: string;
116
+ @Input() color?: IColorValue;
116
117
  @Input() touchSoundDisabled?: boolean;
117
118
  }
118
119
 
@@ -142,4 +143,11 @@ export class TextElement extends SymbioteElement {
142
143
  @Input() maxFontSizeMultiplier?: ITextElementProps['maxFontSizeMultiplier'];
143
144
  @Input() selectionColor?: ITextElementProps['selectionColor'];
144
145
  @Input() disabled?: ITextElementProps['disabled'];
146
+ @Input()
147
+ android_hyphenationFrequency?: ITextElementProps['android_hyphenationFrequency'];
148
+ @Input() dataDetectorType?: ITextElementProps['dataDetectorType'];
149
+ @Input() dynamicTypeRamp?: ITextElementProps['dynamicTypeRamp'];
150
+ @Input() lineBreakMode?: ITextElementProps['lineBreakMode'];
151
+ @Input() lineBreakStrategyIOS?: ITextElementProps['lineBreakStrategyIOS'];
152
+ @Input() textBreakStrategy?: ITextElementProps['textBreakStrategy'];
145
153
  }
package/src/elements.ts CHANGED
@@ -81,6 +81,7 @@ import {
81
81
  ActivityIndicatorElement,
82
82
  ActivityIndicatorSpinnerElement,
83
83
  InputAccessoryViewElement,
84
+ LayoutConformanceElement,
84
85
  ModalElement,
85
86
  MultilineTextInputElement,
86
87
  RefreshControlElement,
@@ -103,6 +104,7 @@ export {
103
104
  ImageBackgroundElement,
104
105
  ImageElement,
105
106
  InputAccessoryViewElement,
107
+ LayoutConformanceElement,
106
108
  ModalElement,
107
109
  MultilineTextInputElement,
108
110
  PressableElement,
@@ -155,6 +157,7 @@ export const SYMBIOTE_ELEMENTS = [
155
157
  ActivityIndicatorElement,
156
158
  ActivityIndicatorSpinnerElement,
157
159
  SafeAreaViewElement,
160
+ LayoutConformanceElement,
158
161
  ModalElement,
159
162
  RefreshControlElement,
160
163
  StickyHeaderElement,
package/src/index.ts CHANGED
@@ -36,24 +36,27 @@ export {
36
36
  Text,
37
37
  TouchableNativeFeedback,
38
38
  View,
39
+ injectVirtualizedListScope,
39
40
  VirtualizedList,
40
41
  VirtualizedSectionList,
42
+ VListCellDirective,
41
43
  VListEmptyDirective,
42
44
  VListFooterDirective,
43
45
  VListHeaderDirective,
44
46
  VListItemDirective,
47
+ VListOutletDirective,
45
48
  VListSeparatorDirective,
46
49
  VSectionFooterDirective,
47
50
  VSectionHeaderDirective,
48
51
  VSectionItemDirective,
49
52
  VSectionSeparatorDirective,
50
53
  } from './components';
54
+ // What a list built on `FlatList` needs to keep its template and its accessibility gate
55
+ export { FLAT_LIST_TEMPLATE } from './components/flat-list/flat-list-template';
56
+ export { provideGateDemand } from './gate-demand';
51
57
  export { Animated } from './modules/animated';
52
- // Also exposed as named top-level symbols (not just Animated.View/.Text/...): ngtsc's partial-mode
53
- // static evaluator can't trace a component class through property access on an external
54
- // namespace object, only through a direct named import binding —
55
- // so `<AnimatedView>` in a template requires `import { AnimatedView } from '@symbiote-native/angular'`,
56
- // not `const AnimatedView = Animated.View`. Plain tsc/vitest don't catch this; only a real ngc run does.
58
+ // Named top-level too, as the ngtsc static evaluator cannot trace `Animated.View` property access
59
+ // A template tag like `<AnimatedView>` needs a direct import, only a real ngc run catches it
57
60
  export {
58
61
  AnimatedFlatList,
59
62
  AnimatedImage,
@@ -62,15 +65,9 @@ export {
62
65
  AnimatedText,
63
66
  AnimatedView,
64
67
  } from './modules/animated';
65
- // Exported even though Angular's version maps only the four primitives (View/Text/Image/
66
- // ScrollView) onto the pre-authored wrappers above and THROWS on anything else — there is no JIT
67
- // under AOT/Metro, so it cannot synthesize a wrapper at runtime the way the other four adapters
68
- // do. It ships anyway because portable code (`createAnimatedComponent(View)`) then compiles and
69
- // runs identically on all five adapters, and the one case Angular cannot serve fails with a
70
- // message naming the fix (author a standalone @Component over AnimatedComponentBase) instead of
71
- // failing as a missing export, which names nothing. Found by the barrel audit in
72
- // `.claude/rules/adapter-parity-audit.md`: it was implemented and tested here all along and simply
73
- // never reached this file, so `@symbiote-native/angular` consumers could not reach it at all.
68
+ // Maps only View/Text/Image/ScrollView onto the wrappers above and throws on anything else (no JIT)
69
+ // Portable `createAnimatedComponent(View)` still runs on all five adapters, and the error names
70
+ // the fix: a standalone `@Component` over `AnimatedComponentBase`
74
71
  export { createAnimatedComponent } from './modules/animated';
75
72
  export type {
76
73
  IActivityIndicatorProps,
@@ -78,6 +75,7 @@ export type {
78
75
  IAngularImageBackgroundProps,
79
76
  IAngularInputAccessoryViewProps,
80
77
  IAngularKeyboardAvoidingViewProps,
78
+ IAngularLayoutConformanceProps,
81
79
  IAngularModalProps,
82
80
  IAngularPressableProps,
83
81
  IAngularRefreshControlProps,
@@ -101,6 +99,7 @@ export type {
101
99
  IImageSourceProp,
102
100
  IInputMode,
103
101
  IKeyboardAvoidingBehavior,
102
+ ILayoutConformanceMode,
104
103
  IModalAnimationType,
105
104
  IModalOrientation,
106
105
  IModalOrientationChangeEvent,
@@ -119,14 +118,17 @@ export type {
119
118
  IViewabilityConfigCallbackPair,
120
119
  IViewableItemsChangedInfo,
121
120
  IViewToken,
121
+ IListScope,
122
122
  IVirtualizedListHandle,
123
123
  IVirtualizedListProps,
124
124
  IVirtualizedSectionListHandle,
125
125
  IVirtualizedSectionListProps,
126
+ IVListCellContext,
126
127
  IVListItemContext,
127
128
  IVListSeparatorContext,
128
129
  IVSectionContext,
129
130
  IVSectionItemContext,
131
+ IVSectionSeparatorContext,
130
132
  ISection,
131
133
  ISwitchProps,
132
134
  ISwitchTrackColor,
@@ -156,6 +158,7 @@ export {
156
158
  PressableElement,
157
159
  RefreshControlElement,
158
160
  SafeAreaViewElement,
161
+ LayoutConformanceElement,
159
162
  ScrollContentElement,
160
163
  ScrollViewElement,
161
164
  StickyHeaderElement,
@@ -190,12 +193,8 @@ export { mount, unmount } from './render';
190
193
  // without hand-writing its own Renderer2 walker.
191
194
  export { DescriptorOutlet } from './descriptor-to-angular';
192
195
  export { DescriptorHost } from './descriptor-to-angular/descriptor-host';
193
- // createPortal (same-surface only — see the file header) and createTunnel (cross-surface,
194
- // see its file header) are the Angular twins of the React/Vue portal/tunnel primitives.
195
- // Angular can't synthesize components at runtime (no JIT under Metro/Hermes), so both are
196
- // static, pre-authored structural directives (`*portal`/`*tunnelIn`, the `*ngIf`/`*ngFor`
197
- // idiom) parameterized by an `@Input()`, rather than a factory returning fresh components per
198
- // call.
196
+ // Twins of the React/Vue portal and tunnel: same-surface portal, cross-surface tunnel
197
+ // No JIT under Metro/Hermes, so both are pre-authored structural directives (`*portal`/`*tunnelIn`)
199
198
  export { PortalDirective, PortalOutletDirective } from './create-portal';
200
199
  export {
201
200
  createTunnel,
@@ -215,9 +214,14 @@ export { StatusBar } from './modules/status-bar';
215
214
  export type { IStatusBarProps, IStatusBarStyle } from './modules/status-bar';
216
215
  // AppRegistry: RN's app entry point over `mount`. setHostRegistrar wires RN's own
217
216
  // registrar so the native Fabric host finds our runnable by app key.
218
- export { AppRegistry, setHostRegistrar } from './modules/app-registry';
217
+ export {
218
+ AppRegistry,
219
+ HeadlessJsTaskError,
220
+ setHostRegistrar,
221
+ } from './modules/app-registry';
219
222
  export type {
220
223
  IComponentProvider,
224
+ IAppConfig,
221
225
  IAppParameters,
222
226
  IRunnable,
223
227
  IHostRegistrar,
@@ -238,6 +242,11 @@ export {
238
242
  connectWatchedSignal,
239
243
  PermissionsServiceBase,
240
244
  } from './services';
245
+ export {
246
+ createAnimatedColor as injectAnimatedColor,
247
+ createAnimatedValue as injectAnimatedValue,
248
+ createAnimatedValueXY as injectAnimatedValueXY,
249
+ } from '@symbiote-native/engine';
241
250
  export { AccessibilityInputsBase } from './accessibility-inputs';
242
251
  export { NativeViewBase } from './native-view-base';
243
252
  export { anchorStyleProp } from './primitives/shared';
@@ -258,6 +267,7 @@ export {
258
267
  AppState,
259
268
  Keyboard,
260
269
  KEYBOARD_EVENT,
270
+ TextInputState,
261
271
  BackHandler,
262
272
  PermissionsAndroid,
263
273
  PERMISSIONS,
@@ -333,7 +343,6 @@ export {
333
343
  Platform,
334
344
  processColor,
335
345
  setColorProcessor,
336
- setDeviceEventSource,
337
346
  setNativeViewConfigSource,
338
347
  StyleSheet,
339
348
  } from '@symbiote-native/engine';
@@ -381,3 +390,44 @@ export {
381
390
  setAngularProfileDetail,
382
391
  } from './diagnostics';
383
392
  export type { IAngularProfile, IAngularProfileDetail } from './diagnostics';
393
+
394
+ // The device event bus and the easing curves, shared verbatim from the engine
395
+ export {
396
+ DeviceEventEmitter,
397
+ Easing,
398
+ EventEmitter,
399
+ NativeAppEventEmitter,
400
+ NativeEventEmitter,
401
+ } from '@symbiote-native/engine';
402
+ export type {
403
+ IEasing,
404
+ IEasingFunction,
405
+ IEmitterSubscription,
406
+ IEventEmitter,
407
+ IEventEmitterModule,
408
+ IEventSubscription,
409
+ INativeEventListener,
410
+ } from '@symbiote-native/engine';
411
+
412
+ // RN's dev and native-module utilities, shared verbatim from the engine. The ones RN owns forward
413
+ // to its own module, which `registerApp` hands over
414
+ export {
415
+ codegenNativeCommands,
416
+ codegenNativeComponent,
417
+ DevMenu,
418
+ DevSettings,
419
+ LogBox,
420
+ NativeComponentRegistry,
421
+ NativeModules,
422
+ Networking,
423
+ PushNotificationIOS,
424
+ ReactNativeVersion,
425
+ registerCallableModule,
426
+ requireNativeComponent,
427
+ Systrace,
428
+ Touchable,
429
+ TurboModuleRegistry,
430
+ UIManager,
431
+ UTFSequence,
432
+ } from '@symbiote-native/engine';
433
+ export type { IDevSettings } from '@symbiote-native/engine';