@symbiote-native/angular 2.0.1 → 3.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 (96) hide show
  1. package/README.md +5 -4
  2. package/babel-register-composed.cjs +0 -8
  3. package/build/angular/callback-host.d.ts +25 -0
  4. package/build/angular/callback-host.js +211 -0
  5. package/build/angular/callback-host.js.map +1 -0
  6. package/build/angular/change-detection-flush.d.ts +14 -2
  7. package/build/angular/change-detection-flush.js +54 -6
  8. package/build/angular/change-detection-flush.js.map +1 -1
  9. package/build/angular/components/flat-list/index.js +39 -86
  10. package/build/angular/components/flat-list/index.js.map +1 -1
  11. package/build/angular/components/image-shared.js +49 -110
  12. package/build/angular/components/image-shared.js.map +1 -1
  13. package/build/angular/components/keyboard-avoiding-view/index.js +33 -72
  14. package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
  15. package/build/angular/components/modal/index.js +58 -103
  16. package/build/angular/components/modal/index.js.map +1 -1
  17. package/build/angular/components/pressable-props.d.ts +2 -0
  18. package/build/angular/components/section-list/index.js +20 -103
  19. package/build/angular/components/section-list/index.js.map +1 -1
  20. package/build/angular/components/touchable-props.d.ts +1 -0
  21. package/build/angular/components/virtualized-list/directives.js +32 -22
  22. package/build/angular/components/virtualized-list/directives.js.map +1 -1
  23. package/build/angular/components/virtualized-list/index.d.ts +7 -1
  24. package/build/angular/components/virtualized-list/index.js +350 -359
  25. package/build/angular/components/virtualized-list/index.js.map +1 -1
  26. package/build/angular/components/virtualized-section-list/directives.js +20 -12
  27. package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
  28. package/build/angular/components/virtualized-section-list/index.js +36 -142
  29. package/build/angular/components/virtualized-section-list/index.js.map +1 -1
  30. package/build/angular/components.d.ts +1 -1
  31. package/build/angular/components.js +1 -1
  32. package/build/angular/components.js.map +1 -1
  33. package/build/angular/create-portal/index.js +9 -8
  34. package/build/angular/create-portal/index.js.map +1 -1
  35. package/build/angular/create-tunnel/index.js +13 -12
  36. package/build/angular/create-tunnel/index.js.map +1 -1
  37. package/build/angular/descriptor-to-angular/index.js +6 -6
  38. package/build/angular/descriptor-to-angular/index.js.map +1 -1
  39. package/build/angular/diagnostics.d.ts +13 -0
  40. package/build/angular/diagnostics.js +18 -0
  41. package/build/angular/diagnostics.js.map +1 -1
  42. package/build/angular/element-props.d.ts +1 -3
  43. package/build/angular/elements.d.ts +46 -32
  44. package/build/angular/elements.js +217 -434
  45. package/build/angular/elements.js.map +1 -1
  46. package/build/angular/index.d.ts +3 -1
  47. package/build/angular/index.js +44 -13
  48. package/build/angular/index.js.map +1 -1
  49. package/build/angular/modules/animated/animated-leaf-binder.js +0 -2
  50. package/build/angular/modules/animated/animated-leaf-binder.js.map +1 -1
  51. package/build/angular/modules/animated/create-animated-component.js +69 -74
  52. package/build/angular/modules/animated/create-animated-component.js.map +1 -1
  53. package/build/angular/modules/animated/index.d.ts +30 -19
  54. package/build/angular/modules/status-bar/index.js +2 -8
  55. package/build/angular/modules/status-bar/index.js.map +1 -1
  56. package/build/angular/primitives/index.d.ts +14 -28
  57. package/build/angular/primitives/index.js +44 -107
  58. package/build/angular/primitives/index.js.map +1 -1
  59. package/build/angular/primitives/shared.d.ts +1 -0
  60. package/build/angular/primitives/shared.js +47 -32
  61. package/build/angular/primitives/shared.js.map +1 -1
  62. package/build/angular/render/index.js +34 -1
  63. package/build/angular/render/index.js.map +1 -1
  64. package/build/angular/renderer/index.d.ts +56 -0
  65. package/build/angular/renderer/index.js +295 -114
  66. package/build/angular/renderer/index.js.map +1 -1
  67. package/build/angular/runtime-matching.d.ts +9 -0
  68. package/build/angular/runtime-matching.js +82 -0
  69. package/build/angular/runtime-matching.js.map +1 -0
  70. package/build/angular/services/color-scheme.service.js +4 -4
  71. package/build/angular/services/color-scheme.service.js.map +1 -1
  72. package/build/angular/services/window-dimensions.service.js +4 -4
  73. package/build/angular/services/window-dimensions.service.js.map +1 -1
  74. package/build/angular/style-host.d.ts +11 -0
  75. package/build/angular/style-host.js +86 -0
  76. package/build/angular/style-host.js.map +1 -0
  77. package/package.json +5 -5
  78. package/src/callback-host.ts +229 -0
  79. package/src/change-detection-flush.ts +62 -9
  80. package/src/components/flat-list/index.ts +2 -1
  81. package/src/components/keyboard-avoiding-view/index.ts +8 -0
  82. package/src/components/pressable-props.ts +8 -0
  83. package/src/components/touchable-props.ts +4 -0
  84. package/src/components/virtualized-list/index.ts +98 -45
  85. package/src/components.ts +0 -2
  86. package/src/diagnostics.ts +18 -0
  87. package/src/element-props.ts +1 -5
  88. package/src/elements.ts +159 -38
  89. package/src/index.ts +47 -14
  90. package/src/primitives/index.ts +14 -70
  91. package/src/primitives/shared.ts +21 -6
  92. package/src/render/index.ts +44 -0
  93. package/src/renderer/index.ts +347 -104
  94. package/src/runtime-matching.ts +80 -0
  95. package/src/style-host.ts +94 -0
  96. package/tsconfig.angular.base.json +11 -0
@@ -32,10 +32,13 @@
32
32
  // (`[onPressMove]="fn"`, where `fn` keeps its `ISymbioteEvent` parameter).
33
33
  //
34
34
  // `valueChange` is the ONE exception, and it is forced rather than chosen: see ValueChangeElement.
35
- import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, Renderer2, forwardRef, inject, } from '@angular/core';
35
+ import { ChangeDetectorRef, Directive, ElementRef, ErrorHandler, EventEmitter, Input, Output, Renderer2, forwardRef, inject, } from '@angular/core';
36
36
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
37
37
  import { VALUE_CHANGE_EVENT } from './renderer/value-change';
38
- import { createCallbackWrapper, registerViewFlush, unregisterViewFlush, } from './change-detection-flush';
38
+ import { registerViewFlush, unregisterViewFlush, } from './change-detection-flush';
39
+ import { SymbioteCallbackHost } from './callback-host';
40
+ import { withholdFromRuntimeMatching } from './runtime-matching';
41
+ import { SymbioteStyleHost } from './style-host';
39
42
  import * as i0 from "@angular/core";
40
43
  /**
41
44
  * The shared half of every element directive: the prop surface all tags accept, and the ONE
@@ -46,117 +49,23 @@ import * as i0 from "@angular/core";
46
49
  * — so without this loop a bare tag commits nothing at all. It stays generic on purpose: per-prop
47
50
  * forwarding code is a component wrapper by another name, which is what this migration removes.
48
51
  * `renderer.setProperty` lands in the adapter's own renderer, which routes the value through the
49
- * engine's `routeProp` and applies the `id` -> `nativeID` and `symbioteStyle` -> `style` aliases.
52
+ * engine's `routeProp` and applies the `id` -> `nativeID` alias.
50
53
  */
51
54
  export class SymbioteElement {
52
- renderer = inject(Renderer2);
53
- host = inject(ElementRef);
54
- detector = inject(ChangeDetectorRef);
55
- // An `onX` PROP is called by the engine, so Angular is never told it fired. Shared with the
56
- // component path's `SymbioteHostPropsDirective`, which has the identical deficit — see
57
- // `createCallbackWrapper`.
58
- wrapCallback = createCallbackWrapper(this.detector, this.host.nativeElement);
59
- testID;
60
- nativeID;
61
- id;
62
- accessible;
63
- accessibilityLabel;
64
- accessibilityHint;
65
- accessibilityRole;
66
- accessibilityState;
67
- accessibilityValue;
68
- accessibilityActions;
69
- accessibilityLabelledBy;
70
- importantForAccessibility;
71
- accessibilityLiveRegion;
72
- screenReaderFocusable;
73
- accessibilityViewIsModal;
74
- accessibilityElementsHidden;
75
- accessibilityIgnoresInvertColors;
76
- accessibilityLanguage;
77
- accessibilityRespondsToUserInteraction;
78
- accessibilityShowsLargeContentViewer;
79
- accessibilityLargeContentTitle;
80
- onAccessibilityAction;
81
- onAccessibilityTap;
82
- onMagicTap;
83
- onAccessibilityEscape;
84
- // The web aliases. Native reads only `accessibility*`; the engine folds these on the way in.
85
- role;
86
- 'aria-label';
87
- 'aria-labelledby';
88
- 'aria-live';
89
- 'aria-hidden';
90
- 'aria-busy';
91
- 'aria-checked';
92
- 'aria-disabled';
93
- 'aria-expanded';
94
- 'aria-selected';
95
- 'aria-modal';
96
- 'aria-valuemax';
97
- 'aria-valuemin';
98
- 'aria-valuenow';
99
- 'aria-valuetext';
100
- // The responder gates return a boolean, which an Angular `(event)` binding cannot carry back to
101
- // the caller — so the whole family is inputs, never outputs.
102
- onStartShouldSetResponder;
103
- onStartShouldSetResponderCapture;
104
- onMoveShouldSetResponder;
105
- onMoveShouldSetResponderCapture;
106
- onResponderGrant;
107
- onResponderReject;
108
- onResponderStart;
109
- onResponderMove;
110
- onResponderEnd;
111
- onResponderRelease;
112
- onResponderTerminate;
113
- onResponderTerminationRequest;
114
- pointerEvents;
115
- hitSlop;
116
- focusable;
117
- collapsable;
118
- removeClippedSubviews;
119
- renderToHardwareTextureAndroid;
120
- shouldRasterizeIOS;
121
- needsOffscreenAlphaCompositing;
122
- symbioteStyle;
123
- // Declared, and the reason is the one `element-props.ts` used to give for NOT declaring it —
124
- // reversed by measurement. `[style]` on an element with no directive input reaches Angular's own
125
- // CSS styling engine (`ɵɵstyleMap`), which cannot represent an RN StyleProp: an ARRAY decomposes
126
- // into numeric-index keys and a FUNCTION — the press-state callback this ecosystem writes — dies
127
- // in `toStylingKeyValueArray` as "ASSERTION ERROR: Unsupported styling type: function", taking
128
- // the whole enclosing template update with it. Device-reported 2026-09-11: every `ActionButton`
129
- // in examples/angular painted as an empty bordered box, because the throw aborted the update
130
- // before its `<text>` child was ever reached.
131
- //
132
- // A declared input CLAIMS the binding at compile time, so it never reaches the styling engine —
133
- // the same mechanism the primitive host COMPONENTS have always relied on
134
- // (`primitives/shared.ts`), which is why `<Pressable [style]>` worked and its replacement tag did
135
- // not. `[style.borderWidth.px]` is a different instruction (`ɵɵstyleProp`) and is untouched: it
136
- // still reaches `Renderer2.setStyle`, which merges per key.
137
- //
138
- // The press-state callback rides the BASE type rather than `PressableElement` alone: a subclass
139
- // cannot widen an inherited property, and only the pressables have a `pressed` to read — so on
140
- // any other tag the engine resolves it at `pressed: false` and the looseness is in the type, not
141
- // in what commits.
142
- style;
143
- // The flat-bag spelling of the events below. `(press)` and `[onPress]` are both supported and
144
- // land in the same place; an app that already holds a handler bag binds the props.
145
- onPress;
146
- onPressIn;
147
- onPressOut;
148
- onPressMove;
149
- onLongPress;
150
- onLayout;
151
- onFocus;
152
- onBlur;
55
+ constructor() {
56
+ this.renderer = inject(Renderer2);
57
+ this.host = inject(ElementRef);
58
+ }
153
59
  ngOnChanges(changes) {
154
60
  for (const name of Object.keys(changes)) {
155
- this.renderer.setProperty(this.host.nativeElement, name, this.wrapCallback(name, changes[name]?.currentValue));
61
+ this.renderer.setProperty(this.host.nativeElement, name,
62
+ // Unwrapped on purpose: `SymbioteRenderer.setProperty` is where an `on*` value is wrapped
63
+ // now, and it is the call this line makes.
64
+ changes[name]?.currentValue);
156
65
  }
157
66
  }
158
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteElement, deps: [], target: i0.ɵɵFactoryTarget.Directive });
159
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteElement, isStandalone: true, inputs: { testID: "testID", nativeID: "nativeID", id: "id", accessible: "accessible", accessibilityLabel: "accessibilityLabel", accessibilityHint: "accessibilityHint", accessibilityRole: "accessibilityRole", accessibilityState: "accessibilityState", accessibilityValue: "accessibilityValue", accessibilityActions: "accessibilityActions", accessibilityLabelledBy: "accessibilityLabelledBy", importantForAccessibility: "importantForAccessibility", accessibilityLiveRegion: "accessibilityLiveRegion", screenReaderFocusable: "screenReaderFocusable", accessibilityViewIsModal: "accessibilityViewIsModal", accessibilityElementsHidden: "accessibilityElementsHidden", accessibilityIgnoresInvertColors: "accessibilityIgnoresInvertColors", accessibilityLanguage: "accessibilityLanguage", accessibilityRespondsToUserInteraction: "accessibilityRespondsToUserInteraction", accessibilityShowsLargeContentViewer: "accessibilityShowsLargeContentViewer", accessibilityLargeContentTitle: "accessibilityLargeContentTitle", onAccessibilityAction: "onAccessibilityAction", onAccessibilityTap: "onAccessibilityTap", onMagicTap: "onMagicTap", onAccessibilityEscape: "onAccessibilityEscape", role: "role", "aria-label": "aria-label", "aria-labelledby": "aria-labelledby", "aria-live": "aria-live", "aria-hidden": "aria-hidden", "aria-busy": "aria-busy", "aria-checked": "aria-checked", "aria-disabled": "aria-disabled", "aria-expanded": "aria-expanded", "aria-selected": "aria-selected", "aria-modal": "aria-modal", "aria-valuemax": "aria-valuemax", "aria-valuemin": "aria-valuemin", "aria-valuenow": "aria-valuenow", "aria-valuetext": "aria-valuetext", onStartShouldSetResponder: "onStartShouldSetResponder", onStartShouldSetResponderCapture: "onStartShouldSetResponderCapture", onMoveShouldSetResponder: "onMoveShouldSetResponder", onMoveShouldSetResponderCapture: "onMoveShouldSetResponderCapture", onResponderGrant: "onResponderGrant", onResponderReject: "onResponderReject", onResponderStart: "onResponderStart", onResponderMove: "onResponderMove", onResponderEnd: "onResponderEnd", onResponderRelease: "onResponderRelease", onResponderTerminate: "onResponderTerminate", onResponderTerminationRequest: "onResponderTerminationRequest", pointerEvents: "pointerEvents", hitSlop: "hitSlop", focusable: "focusable", collapsable: "collapsable", removeClippedSubviews: "removeClippedSubviews", renderToHardwareTextureAndroid: "renderToHardwareTextureAndroid", shouldRasterizeIOS: "shouldRasterizeIOS", needsOffscreenAlphaCompositing: "needsOffscreenAlphaCompositing", symbioteStyle: "symbioteStyle", style: "style", onPress: "onPress", onPressIn: "onPressIn", onPressOut: "onPressOut", onPressMove: "onPressMove", onLongPress: "onLongPress", onLayout: "onLayout", onFocus: "onFocus", onBlur: "onBlur" }, usesOnChanges: true, ngImport: i0 });
67
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
68
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteElement, isStandalone: true, inputs: { testID: "testID", nativeID: "nativeID", id: "id", accessible: "accessible", accessibilityLabel: "accessibilityLabel", accessibilityHint: "accessibilityHint", accessibilityRole: "accessibilityRole", accessibilityState: "accessibilityState", accessibilityValue: "accessibilityValue", accessibilityActions: "accessibilityActions", accessibilityLabelledBy: "accessibilityLabelledBy", importantForAccessibility: "importantForAccessibility", accessibilityLiveRegion: "accessibilityLiveRegion", screenReaderFocusable: "screenReaderFocusable", accessibilityViewIsModal: "accessibilityViewIsModal", accessibilityElementsHidden: "accessibilityElementsHidden", accessibilityIgnoresInvertColors: "accessibilityIgnoresInvertColors", accessibilityLanguage: "accessibilityLanguage", accessibilityRespondsToUserInteraction: "accessibilityRespondsToUserInteraction", accessibilityShowsLargeContentViewer: "accessibilityShowsLargeContentViewer", accessibilityLargeContentTitle: "accessibilityLargeContentTitle", onAccessibilityAction: "onAccessibilityAction", onAccessibilityTap: "onAccessibilityTap", onMagicTap: "onMagicTap", onAccessibilityEscape: "onAccessibilityEscape", role: "role", "aria-label": "aria-label", "aria-labelledby": "aria-labelledby", "aria-live": "aria-live", "aria-hidden": "aria-hidden", "aria-busy": "aria-busy", "aria-checked": "aria-checked", "aria-disabled": "aria-disabled", "aria-expanded": "aria-expanded", "aria-selected": "aria-selected", "aria-modal": "aria-modal", "aria-valuemax": "aria-valuemax", "aria-valuemin": "aria-valuemin", "aria-valuenow": "aria-valuenow", "aria-valuetext": "aria-valuetext", onStartShouldSetResponder: "onStartShouldSetResponder", onStartShouldSetResponderCapture: "onStartShouldSetResponderCapture", onMoveShouldSetResponder: "onMoveShouldSetResponder", onMoveShouldSetResponderCapture: "onMoveShouldSetResponderCapture", onResponderGrant: "onResponderGrant", onResponderReject: "onResponderReject", onResponderStart: "onResponderStart", onResponderMove: "onResponderMove", onResponderEnd: "onResponderEnd", onResponderRelease: "onResponderRelease", onResponderTerminate: "onResponderTerminate", onResponderTerminationRequest: "onResponderTerminationRequest", pointerEvents: "pointerEvents", hitSlop: "hitSlop", focusable: "focusable", collapsable: "collapsable", removeClippedSubviews: "removeClippedSubviews", renderToHardwareTextureAndroid: "renderToHardwareTextureAndroid", shouldRasterizeIOS: "shouldRasterizeIOS", needsOffscreenAlphaCompositing: "needsOffscreenAlphaCompositing", style: "style", class: "class", onPress: "onPress", onPressIn: "onPressIn", onPressOut: "onPressOut", onPressMove: "onPressMove", onLongPress: "onLongPress", onLayout: "onLayout", onFocus: "onFocus", onBlur: "onBlur" }, usesOnChanges: true, ngImport: i0 }); }
160
69
  }
161
70
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteElement, decorators: [{
162
71
  type: Directive
@@ -280,10 +189,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
280
189
  type: Input
281
190
  }], needsOffscreenAlphaCompositing: [{
282
191
  type: Input
283
- }], symbioteStyle: [{
284
- type: Input
285
192
  }], style: [{
286
193
  type: Input
194
+ }], class: [{
195
+ type: Input
287
196
  }], onPress: [{
288
197
  type: Input
289
198
  }], onPressIn: [{
@@ -314,9 +223,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
314
223
  class ReadBackElement extends SymbioteElement {
315
224
  constructor() {
316
225
  super();
226
+ // ITS OWN, now that the base has none. Three tags reach this class, so the injection is paid where
227
+ // it is read instead of on every element of a screen.
228
+ this.detector = inject(ChangeDetectorRef);
229
+ this.errorHandler = inject(ErrorHandler);
317
230
  const node = this.host.nativeElement;
318
231
  if (typeof node === 'object' && node !== null) {
319
- registerViewFlush(node, () => this.detector.detectChanges());
232
+ registerViewFlush(node, () => this.flush());
233
+ }
234
+ }
235
+ // REPORTED, NOT RETHROWN, and it is Angular's own contract rather than a swallow. Every other
236
+ // change detection in an app runs inside `ApplicationRef.tick()`, which catches and hands the
237
+ // error to `ErrorHandler` — `render/index.ts` provides `SymbioteErrorHandler` for exactly that,
238
+ // after an unprovided token once turned every async tick exception into a hard crash. This flush
239
+ // is the ONE change detection that runs outside that boundary: the engine calls it from inside a
240
+ // native event dispatch, where a throw has nowhere to go but `RCTFatal`.
241
+ //
242
+ // Device-diagnosed 2026-09-20 on ApiPlaygroundScreen. `PlaygroundLifecycleLogger` emits from
243
+ // `ngDoCheck`/`ngAfterContentChecked`/`ngAfterViewChecked` and the screen's handler writes a
244
+ // signal its own template reads, so the view re-dirties itself on every pass and
245
+ // `detectChangesInViewWhileDirty` throws NG0103 after MAXIMUM_REFRESH_RERUNS. The scheduler's own
246
+ // ticks were already hitting it and reporting it quietly; the first KEYSTROKE took the same throw
247
+ // through here and killed the app — `Terminating app due to uncaught exception
248
+ // 'RCTFatalException: Unhandled JS Exception: Error: NG0103'`, with no redbox because Release has
249
+ // none. So the app bug is the app's, and a flush that turns a reported error into a fatal one is
250
+ // ours: a keystroke must not be stricter than a tick.
251
+ flush() {
252
+ try {
253
+ this.detector.detectChanges();
254
+ }
255
+ catch (error) {
256
+ this.errorHandler.handleError(error);
320
257
  }
321
258
  }
322
259
  ngOnDestroy() {
@@ -324,48 +261,49 @@ class ReadBackElement extends SymbioteElement {
324
261
  if (typeof node === 'object' && node !== null)
325
262
  unregisterViewFlush(node);
326
263
  }
327
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadBackElement, deps: [], target: i0.ɵɵFactoryTarget.Directive });
328
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ReadBackElement, isStandalone: true, usesInheritance: true, ngImport: i0 });
264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadBackElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
265
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ReadBackElement, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
329
266
  }
330
267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadBackElement, decorators: [{
331
268
  type: Directive
332
269
  }], ctorParameters: () => [] });
270
+ // BOTH SPELLINGS ON THE SEVEN DASHLESS TAGS, and it is a correctness fix rather than a convenience.
271
+ //
272
+ // The renderer has always mapped `symbiote-view` onto `view` (`PRIMITIVE_SELECTOR_ALIAS`), because
273
+ // `CUSTOM_ELEMENTS_SCHEMA` admits an unknown element only when the name carries a hyphen — so the
274
+ // hyphenated form is the spelling an app WITHOUT these directives has to use. It is the same tag and
275
+ // commits the same node.
276
+ //
277
+ // It was not the same tag HERE. A selector of `view` alone meant an app that imports
278
+ // `SYMBIOTE_ELEMENTS` and writes `<symbiote-view>` matched nothing: no type check on its props, no
279
+ // declared inputs, none of `SymbioteElement`'s forwarding or callback wrapping — silently, with the
280
+ // tree still looking right. Measured, that shape also ran ~8.6 us per element FASTER, which is what
281
+ // made it look like an optimization instead of a hole (`angular-directive-cost.itest.ts`).
282
+ //
283
+ // Only the seven dashless tags need it: `hyphenatedIntrinsicAliases` skips any tag that already
284
+ // carries a dash, so `symbiote-scroll-view` resolves nowhere on either side and the two halves agree
285
+ // already.
333
286
  export class ViewElement extends SymbioteElement {
334
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
335
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ViewElement, isStandalone: true, selector: "view", usesInheritance: true, ngImport: i0 });
287
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
288
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ViewElement, isStandalone: true, selector: "view, symbiote-view", usesInheritance: true, ngImport: i0 }); }
336
289
  }
337
290
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewElement, decorators: [{
338
291
  type: Directive,
339
- args: [{ selector: 'view', standalone: true }]
292
+ args: [{ selector: 'view, symbiote-view', standalone: true }]
340
293
  }] });
341
294
  export class PressableElement extends SymbioteElement {
342
- disabled;
343
- cancelable;
344
- delayLongPress;
345
- delayHoverIn;
346
- delayHoverOut;
347
- onHoverIn;
348
- onHoverOut;
349
- pressRetentionOffset;
350
- unstable_pressDelay;
351
- android_ripple;
352
- android_disableSound;
353
- hasTVPreferredFocus;
354
- nextFocusDown;
355
- nextFocusForward;
356
- nextFocusLeft;
357
- nextFocusRight;
358
- nextFocusUp;
359
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PressableElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
360
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PressableElement, isStandalone: true, selector: "pressable", inputs: { disabled: "disabled", cancelable: "cancelable", delayLongPress: "delayLongPress", delayHoverIn: "delayHoverIn", delayHoverOut: "delayHoverOut", onHoverIn: "onHoverIn", onHoverOut: "onHoverOut", pressRetentionOffset: "pressRetentionOffset", unstable_pressDelay: "unstable_pressDelay", android_ripple: "android_ripple", android_disableSound: "android_disableSound", hasTVPreferredFocus: "hasTVPreferredFocus", nextFocusDown: "nextFocusDown", nextFocusForward: "nextFocusForward", nextFocusLeft: "nextFocusLeft", nextFocusRight: "nextFocusRight", nextFocusUp: "nextFocusUp" }, usesInheritance: true, ngImport: i0 });
295
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PressableElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
296
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PressableElement, isStandalone: true, selector: "pressable, symbiote-pressable", inputs: { disabled: "disabled", cancelable: "cancelable", blockNativeResponder: "blockNativeResponder", delayLongPress: "delayLongPress", delayHoverIn: "delayHoverIn", delayHoverOut: "delayHoverOut", onHoverIn: "onHoverIn", onHoverOut: "onHoverOut", pressRetentionOffset: "pressRetentionOffset", unstable_pressDelay: "unstable_pressDelay", android_ripple: "android_ripple", testOnly_pressed: "testOnly_pressed", android_disableSound: "android_disableSound", hasTVPreferredFocus: "hasTVPreferredFocus", nextFocusDown: "nextFocusDown", nextFocusForward: "nextFocusForward", nextFocusLeft: "nextFocusLeft", nextFocusRight: "nextFocusRight", nextFocusUp: "nextFocusUp" }, usesInheritance: true, ngImport: i0 }); }
361
297
  }
362
298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PressableElement, decorators: [{
363
299
  type: Directive,
364
- args: [{ selector: 'pressable', standalone: true }]
300
+ args: [{ selector: 'pressable, symbiote-pressable', standalone: true }]
365
301
  }], propDecorators: { disabled: [{
366
302
  type: Input
367
303
  }], cancelable: [{
368
304
  type: Input
305
+ }], blockNativeResponder: [{
306
+ type: Input
369
307
  }], delayLongPress: [{
370
308
  type: Input
371
309
  }], delayHoverIn: [{
@@ -382,6 +320,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
382
320
  type: Input
383
321
  }], android_ripple: [{
384
322
  type: Input
323
+ }], testOnly_pressed: [{
324
+ type: Input
385
325
  }], android_disableSound: [{
386
326
  type: Input
387
327
  }], hasTVPreferredFocus: [{
@@ -400,12 +340,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
400
340
  // RN's TouchableOpacity is a Pressable that also fades, and both halves are on the engine node —
401
341
  // so it takes the same inputs and adds only the fade's own knob.
402
342
  export class TouchableOpacityElement extends PressableElement {
403
- activeOpacity;
404
- delayPressIn;
405
- delayPressOut;
406
- minPressDuration;
407
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableOpacityElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
408
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableOpacityElement, isStandalone: true, selector: "touchable-opacity", inputs: { activeOpacity: "activeOpacity", delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration" }, usesInheritance: true, ngImport: i0 });
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableOpacityElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
344
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableOpacityElement, isStandalone: true, selector: "touchable-opacity", inputs: { activeOpacity: "activeOpacity", delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration" }, usesInheritance: true, ngImport: i0 }); }
409
345
  }
410
346
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableOpacityElement, decorators: [{
411
347
  type: Directive,
@@ -424,13 +360,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
424
360
  // press surface plus the two knobs that describe the underlay. `onShowUnderlay`/`onHideUnderlay`
425
361
  // need no @Input: they are events, bound as `(showUnderlay)` through the renderer's own listen.
426
362
  export class TouchableHighlightElement extends PressableElement {
427
- activeOpacity;
428
- underlayColor;
429
- delayPressIn;
430
- delayPressOut;
431
- minPressDuration;
432
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableHighlightElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
433
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableHighlightElement, isStandalone: true, selector: "touchable-highlight", inputs: { activeOpacity: "activeOpacity", underlayColor: "underlayColor", delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration" }, usesInheritance: true, ngImport: i0 });
363
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableHighlightElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
364
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableHighlightElement, isStandalone: true, selector: "touchable-highlight", inputs: { activeOpacity: "activeOpacity", underlayColor: "underlayColor", delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration", touchSoundDisabled: "touchSoundDisabled" }, usesInheritance: true, ngImport: i0 }); }
434
365
  }
435
366
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableHighlightElement, decorators: [{
436
367
  type: Directive,
@@ -445,16 +376,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
445
376
  type: Input
446
377
  }], minPressDuration: [{
447
378
  type: Input
379
+ }], touchSoundDisabled: [{
380
+ type: Input
448
381
  }] } });
449
382
  // RN's TouchableNativeFeedback is a Pressable that CLONES onto its single child instead of
450
383
  // rendering anything (TouchableNativeFeedback.js:339) — so the tag takes the press surface plus the
451
384
  // two props that pick the Android ripple drawable. The tag itself commits no native view; the
452
385
  // behavior configures the child, which is why `elements.test.ts` reads it as an anchor.
453
386
  export class TouchableNativeFeedbackElement extends PressableElement {
454
- background;
455
- useForeground;
456
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableNativeFeedbackElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
457
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableNativeFeedbackElement, isStandalone: true, selector: "touchable-native-feedback", inputs: { background: "background", useForeground: "useForeground" }, usesInheritance: true, ngImport: i0 });
387
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableNativeFeedbackElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
388
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableNativeFeedbackElement, isStandalone: true, selector: "touchable-native-feedback", inputs: { background: "background", useForeground: "useForeground", touchSoundDisabled: "touchSoundDisabled" }, usesInheritance: true, ngImport: i0 }); }
458
389
  }
459
390
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableNativeFeedbackElement, decorators: [{
460
391
  type: Directive,
@@ -463,17 +394,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
463
394
  type: Input
464
395
  }], useForeground: [{
465
396
  type: Input
397
+ }], touchSoundDisabled: [{
398
+ type: Input
466
399
  }] } });
467
400
  // RN's TouchableWithoutFeedback clones onto its single child the same way
468
401
  // (TouchableWithoutFeedback.js:286) and installs no drawable, so it takes the press surface plus the
469
402
  // three timing knobs it forwards to Pressability (:186-190) and nothing else. Like the tag above it
470
403
  // commits no native view; `elements.test.ts` reads it as an anchor.
471
404
  export class TouchableWithoutFeedbackElement extends PressableElement {
472
- delayPressIn;
473
- delayPressOut;
474
- minPressDuration;
475
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableWithoutFeedbackElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
476
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableWithoutFeedbackElement, isStandalone: true, selector: "touchable-without-feedback", inputs: { delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration" }, usesInheritance: true, ngImport: i0 });
405
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableWithoutFeedbackElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
406
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TouchableWithoutFeedbackElement, isStandalone: true, selector: "touchable-without-feedback", inputs: { delayPressIn: "delayPressIn", delayPressOut: "delayPressOut", minPressDuration: "minPressDuration", touchSoundDisabled: "touchSoundDisabled" }, usesInheritance: true, ngImport: i0 }); }
477
407
  }
478
408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TouchableWithoutFeedbackElement, decorators: [{
479
409
  type: Directive,
@@ -484,20 +414,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
484
414
  type: Input
485
415
  }], minPressDuration: [{
486
416
  type: Input
417
+ }], touchSoundDisabled: [{
418
+ type: Input
487
419
  }] } });
488
420
  // RN's Button IS a TouchableOpacity (Button.js:384), and the behavior builds the view and the
489
421
  // label under it — so the tag takes the touchable's surface plus the four props Button owns. There
490
422
  // is no `style`: RN's Button has no such prop, and the label/background come from `color`.
491
423
  export class ButtonElement extends TouchableOpacityElement {
492
- title;
493
- color;
494
- touchSoundDisabled;
495
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ButtonElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
496
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ButtonElement, isStandalone: true, selector: "button", inputs: { title: "title", color: "color", touchSoundDisabled: "touchSoundDisabled" }, usesInheritance: true, ngImport: i0 });
424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ButtonElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
425
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ButtonElement, isStandalone: true, selector: "button, symbiote-button", inputs: { title: "title", color: "color", touchSoundDisabled: "touchSoundDisabled" }, usesInheritance: true, ngImport: i0 }); }
497
426
  }
498
427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ButtonElement, decorators: [{
499
428
  type: Directive,
500
- args: [{ selector: 'button', standalone: true }]
429
+ args: [{ selector: 'button, symbiote-button', standalone: true }]
501
430
  }], propDecorators: { title: [{
502
431
  type: Input
503
432
  }], color: [{
@@ -506,25 +435,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
506
435
  type: Input
507
436
  }] } });
508
437
  export class TextElement extends SymbioteElement {
509
- // Narrows the inherited input to a TEXT style so `fontSize`/`fontWeight` type-check here. The
510
- // initializer is what TS2612 asks for to accept a redeclaration as deliberate; `declare` would
511
- // be the other answer and cannot carry a decorator.
512
- style = undefined;
513
- numberOfLines;
514
- ellipsizeMode;
515
- selectable;
516
- adjustsFontSizeToFit;
517
- minimumFontScale;
518
- allowFontScaling;
519
- maxFontSizeMultiplier;
520
- selectionColor;
521
- disabled;
522
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
523
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextElement, isStandalone: true, selector: "text", inputs: { style: "style", numberOfLines: "numberOfLines", ellipsizeMode: "ellipsizeMode", selectable: "selectable", adjustsFontSizeToFit: "adjustsFontSizeToFit", minimumFontScale: "minimumFontScale", allowFontScaling: "allowFontScaling", maxFontSizeMultiplier: "maxFontSizeMultiplier", selectionColor: "selectionColor", disabled: "disabled" }, usesInheritance: true, ngImport: i0 });
438
+ constructor() {
439
+ super(...arguments);
440
+ // Narrows the inherited input to a TEXT style so `fontSize`/`fontWeight` type-check here. The
441
+ // initializer is what TS2612 asks for to accept a redeclaration as deliberate; `declare` would
442
+ // be the other answer and cannot carry a decorator.
443
+ this.style = undefined;
444
+ }
445
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
446
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextElement, isStandalone: true, selector: "text, symbiote-text", inputs: { style: "style", numberOfLines: "numberOfLines", ellipsizeMode: "ellipsizeMode", selectable: "selectable", adjustsFontSizeToFit: "adjustsFontSizeToFit", minimumFontScale: "minimumFontScale", allowFontScaling: "allowFontScaling", maxFontSizeMultiplier: "maxFontSizeMultiplier", selectionColor: "selectionColor", disabled: "disabled" }, usesInheritance: true, ngImport: i0 }); }
524
447
  }
525
448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextElement, decorators: [{
526
449
  type: Directive,
527
- args: [{ selector: 'text', standalone: true }]
450
+ args: [{ selector: 'text, symbiote-text', standalone: true }]
528
451
  }], propDecorators: { style: [{
529
452
  type: Input
530
453
  }], numberOfLines: [{
@@ -547,35 +470,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
547
470
  type: Input
548
471
  }] } });
549
472
  export class ImageElement extends SymbioteElement {
550
- source;
551
- src;
552
- srcSet;
553
- alt;
554
- width;
555
- height;
556
- resizeMode;
557
- resizeMethod;
558
- defaultSource;
559
- loadingIndicatorSource;
560
- blurRadius;
561
- capInsets;
562
- crossOrigin;
563
- referrerPolicy;
564
- fadeDuration;
565
- progressiveRenderingEnabled;
566
- tintColor;
567
- onLoad;
568
- onLoadStart;
569
- onLoadEnd;
570
- onError;
571
- onProgress;
572
- onPartialLoad;
573
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
574
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageElement, isStandalone: true, selector: "image", inputs: { source: "source", src: "src", srcSet: "srcSet", alt: "alt", width: "width", height: "height", resizeMode: "resizeMode", resizeMethod: "resizeMethod", defaultSource: "defaultSource", loadingIndicatorSource: "loadingIndicatorSource", blurRadius: "blurRadius", capInsets: "capInsets", crossOrigin: "crossOrigin", referrerPolicy: "referrerPolicy", fadeDuration: "fadeDuration", progressiveRenderingEnabled: "progressiveRenderingEnabled", tintColor: "tintColor", onLoad: "onLoad", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd", onError: "onError", onProgress: "onProgress", onPartialLoad: "onPartialLoad" }, usesInheritance: true, ngImport: i0 });
473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
474
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageElement, isStandalone: true, selector: "image, symbiote-image", inputs: { source: "source", src: "src", srcSet: "srcSet", alt: "alt", width: "width", height: "height", resizeMode: "resizeMode", resizeMethod: "resizeMethod", defaultSource: "defaultSource", loadingIndicatorSource: "loadingIndicatorSource", blurRadius: "blurRadius", capInsets: "capInsets", crossOrigin: "crossOrigin", referrerPolicy: "referrerPolicy", fadeDuration: "fadeDuration", progressiveRenderingEnabled: "progressiveRenderingEnabled", tintColor: "tintColor", onLoad: "onLoad", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd", onError: "onError", onProgress: "onProgress", onPartialLoad: "onPartialLoad" }, usesInheritance: true, ngImport: i0 }); }
575
475
  }
576
476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageElement, decorators: [{
577
477
  type: Directive,
578
- args: [{ selector: 'image', standalone: true }]
478
+ args: [{ selector: 'image, symbiote-image', standalone: true }]
579
479
  }], propDecorators: { source: [{
580
480
  type: Input
581
481
  }], src: [{
@@ -628,32 +528,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
628
528
  // (ImageBackground.js:81) — so this directive declares them to make the BINDING legal, and the
629
529
  // engine decides which node each lands on.
630
530
  export class ImageBackgroundElement extends SymbioteElement {
631
- imageStyle;
632
- source;
633
- src;
634
- srcSet;
635
- alt;
636
- width;
637
- height;
638
- resizeMode;
639
- resizeMethod;
640
- defaultSource;
641
- loadingIndicatorSource;
642
- blurRadius;
643
- capInsets;
644
- crossOrigin;
645
- referrerPolicy;
646
- fadeDuration;
647
- progressiveRenderingEnabled;
648
- tintColor;
649
- onLoad;
650
- onLoadStart;
651
- onLoadEnd;
652
- onError;
653
- onProgress;
654
- onPartialLoad;
655
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageBackgroundElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
656
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageBackgroundElement, isStandalone: true, selector: "image-background", inputs: { imageStyle: "imageStyle", source: "source", src: "src", srcSet: "srcSet", alt: "alt", width: "width", height: "height", resizeMode: "resizeMode", resizeMethod: "resizeMethod", defaultSource: "defaultSource", loadingIndicatorSource: "loadingIndicatorSource", blurRadius: "blurRadius", capInsets: "capInsets", crossOrigin: "crossOrigin", referrerPolicy: "referrerPolicy", fadeDuration: "fadeDuration", progressiveRenderingEnabled: "progressiveRenderingEnabled", tintColor: "tintColor", onLoad: "onLoad", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd", onError: "onError", onProgress: "onProgress", onPartialLoad: "onPartialLoad" }, usesInheritance: true, ngImport: i0 });
531
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageBackgroundElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
532
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageBackgroundElement, isStandalone: true, selector: "image-background", inputs: { imageStyle: "imageStyle", source: "source", src: "src", srcSet: "srcSet", alt: "alt", width: "width", height: "height", resizeMode: "resizeMode", resizeMethod: "resizeMethod", defaultSource: "defaultSource", loadingIndicatorSource: "loadingIndicatorSource", blurRadius: "blurRadius", capInsets: "capInsets", crossOrigin: "crossOrigin", referrerPolicy: "referrerPolicy", fadeDuration: "fadeDuration", progressiveRenderingEnabled: "progressiveRenderingEnabled", tintColor: "tintColor", onLoad: "onLoad", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd", onError: "onError", onProgress: "onProgress", onPartialLoad: "onPartialLoad" }, usesInheritance: true, ngImport: i0 }); }
657
533
  }
658
534
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageBackgroundElement, decorators: [{
659
535
  type: Directive,
@@ -708,57 +584,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
708
584
  type: Input
709
585
  }] } });
710
586
  export class ScrollViewElement extends SymbioteElement {
711
- // No `horizontal` @Input: the axis is the TAG you write, never a prop see
712
- // `../components/scroll-view-props.ts`'s header. `HorizontalScrollViewElement` below is the
713
- // other spelling, not a variant of this one.
714
- scrollEnabled;
715
- scrollEventThrottle;
716
- contentContainerStyle;
717
- contentInset;
718
- contentInsetAdjustmentBehavior;
719
- contentOffset;
720
- scrollIndicatorInsets;
721
- showsHorizontalScrollIndicator;
722
- showsVerticalScrollIndicator;
723
- alwaysBounceHorizontal;
724
- alwaysBounceVertical;
725
- bounces;
726
- bouncesZoom;
727
- centerContent;
728
- decelerationRate;
729
- directionalLockEnabled;
730
- disableIntervalMomentum;
731
- endFillColor;
732
- fadingEdgeLength;
733
- indicatorStyle;
734
- invertStickyHeaders;
735
- keyboardDismissMode;
736
- keyboardShouldPersistTaps;
737
- automaticallyAdjustKeyboardInsets;
738
- maintainVisibleContentPosition;
739
- maximumZoomScale;
740
- minimumZoomScale;
741
- zoomScale;
742
- nestedScrollEnabled;
743
- overScrollMode;
744
- pagingEnabled;
745
- persistentScrollbar;
746
- pinchGestureEnabled;
747
- snapToAlignment;
748
- snapToEnd;
749
- snapToInterval;
750
- snapToOffsets;
751
- snapToStart;
752
- stickyHeaderIndices;
753
- onScroll;
754
- onScrollBeginDrag;
755
- onScrollEndDrag;
756
- onMomentumScrollBegin;
757
- onMomentumScrollEnd;
758
- onScrollToTop;
759
- onContentSizeChange;
760
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
761
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ScrollViewElement, isStandalone: true, selector: "scroll-view", inputs: { scrollEnabled: "scrollEnabled", scrollEventThrottle: "scrollEventThrottle", contentContainerStyle: "contentContainerStyle", contentInset: "contentInset", contentInsetAdjustmentBehavior: "contentInsetAdjustmentBehavior", contentOffset: "contentOffset", scrollIndicatorInsets: "scrollIndicatorInsets", showsHorizontalScrollIndicator: "showsHorizontalScrollIndicator", showsVerticalScrollIndicator: "showsVerticalScrollIndicator", alwaysBounceHorizontal: "alwaysBounceHorizontal", alwaysBounceVertical: "alwaysBounceVertical", bounces: "bounces", bouncesZoom: "bouncesZoom", centerContent: "centerContent", decelerationRate: "decelerationRate", directionalLockEnabled: "directionalLockEnabled", disableIntervalMomentum: "disableIntervalMomentum", endFillColor: "endFillColor", fadingEdgeLength: "fadingEdgeLength", indicatorStyle: "indicatorStyle", invertStickyHeaders: "invertStickyHeaders", keyboardDismissMode: "keyboardDismissMode", keyboardShouldPersistTaps: "keyboardShouldPersistTaps", automaticallyAdjustKeyboardInsets: "automaticallyAdjustKeyboardInsets", maintainVisibleContentPosition: "maintainVisibleContentPosition", maximumZoomScale: "maximumZoomScale", minimumZoomScale: "minimumZoomScale", zoomScale: "zoomScale", nestedScrollEnabled: "nestedScrollEnabled", overScrollMode: "overScrollMode", pagingEnabled: "pagingEnabled", persistentScrollbar: "persistentScrollbar", pinchGestureEnabled: "pinchGestureEnabled", snapToAlignment: "snapToAlignment", snapToEnd: "snapToEnd", snapToInterval: "snapToInterval", snapToOffsets: "snapToOffsets", snapToStart: "snapToStart", stickyHeaderIndices: "stickyHeaderIndices", onScroll: "onScroll", onScrollBeginDrag: "onScrollBeginDrag", onScrollEndDrag: "onScrollEndDrag", onMomentumScrollBegin: "onMomentumScrollBegin", onMomentumScrollEnd: "onMomentumScrollEnd", onScrollToTop: "onScrollToTop", onContentSizeChange: "onContentSizeChange" }, usesInheritance: true, ngImport: i0 });
587
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
588
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ScrollViewElement, isStandalone: true, selector: "scroll-view", inputs: { scrollEnabled: "scrollEnabled", scrollEventThrottle: "scrollEventThrottle", contentContainerStyle: "contentContainerStyle", contentInset: "contentInset", contentInsetAdjustmentBehavior: "contentInsetAdjustmentBehavior", contentOffset: "contentOffset", scrollIndicatorInsets: "scrollIndicatorInsets", showsHorizontalScrollIndicator: "showsHorizontalScrollIndicator", showsVerticalScrollIndicator: "showsVerticalScrollIndicator", alwaysBounceHorizontal: "alwaysBounceHorizontal", alwaysBounceVertical: "alwaysBounceVertical", bounces: "bounces", bouncesZoom: "bouncesZoom", centerContent: "centerContent", decelerationRate: "decelerationRate", directionalLockEnabled: "directionalLockEnabled", disableIntervalMomentum: "disableIntervalMomentum", endFillColor: "endFillColor", fadingEdgeLength: "fadingEdgeLength", indicatorStyle: "indicatorStyle", invertStickyHeaders: "invertStickyHeaders", keyboardDismissMode: "keyboardDismissMode", keyboardShouldPersistTaps: "keyboardShouldPersistTaps", automaticallyAdjustKeyboardInsets: "automaticallyAdjustKeyboardInsets", maintainVisibleContentPosition: "maintainVisibleContentPosition", maximumZoomScale: "maximumZoomScale", minimumZoomScale: "minimumZoomScale", zoomScale: "zoomScale", nestedScrollEnabled: "nestedScrollEnabled", overScrollMode: "overScrollMode", pagingEnabled: "pagingEnabled", persistentScrollbar: "persistentScrollbar", pinchGestureEnabled: "pinchGestureEnabled", snapToAlignment: "snapToAlignment", snapToEnd: "snapToEnd", snapToInterval: "snapToInterval", snapToOffsets: "snapToOffsets", snapToStart: "snapToStart", stickyHeaderIndices: "stickyHeaderIndices", onScroll: "onScroll", onScrollBeginDrag: "onScrollBeginDrag", onScrollEndDrag: "onScrollEndDrag", onMomentumScrollBegin: "onMomentumScrollBegin", onMomentumScrollEnd: "onMomentumScrollEnd", onScrollToTop: "onScrollToTop", onContentSizeChange: "onContentSizeChange" }, usesInheritance: true, ngImport: i0 }); }
762
589
  }
763
590
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollViewElement, decorators: [{
764
591
  type: Directive,
@@ -857,24 +684,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
857
684
  type: Input
858
685
  }] } });
859
686
  export class HorizontalScrollViewElement extends ScrollViewElement {
860
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
861
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: HorizontalScrollViewElement, isStandalone: true, selector: "horizontal-scroll-view", usesInheritance: true, ngImport: i0 });
687
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
688
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: HorizontalScrollViewElement, isStandalone: true, selector: "horizontal-scroll-view", usesInheritance: true, ngImport: i0 }); }
862
689
  }
863
690
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollViewElement, decorators: [{
864
691
  type: Directive,
865
692
  args: [{ selector: 'horizontal-scroll-view', standalone: true }]
866
693
  }] });
867
694
  export class ScrollContentElement extends SymbioteElement {
868
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollContentElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
869
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ScrollContentElement, isStandalone: true, selector: "scroll-content", usesInheritance: true, ngImport: i0 });
695
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollContentElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
696
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ScrollContentElement, isStandalone: true, selector: "scroll-content", usesInheritance: true, ngImport: i0 }); }
870
697
  }
871
698
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScrollContentElement, decorators: [{
872
699
  type: Directive,
873
700
  args: [{ selector: 'scroll-content', standalone: true }]
874
701
  }] });
875
702
  export class HorizontalScrollContentElement extends SymbioteElement {
876
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollContentElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
877
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: HorizontalScrollContentElement, isStandalone: true, selector: "horizontal-scroll-content", usesInheritance: true, ngImport: i0 });
703
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollContentElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
704
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: HorizontalScrollContentElement, isStandalone: true, selector: "horizontal-scroll-content", usesInheritance: true, ngImport: i0 }); }
878
705
  }
879
706
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HorizontalScrollContentElement, decorators: [{
880
707
  type: Directive,
@@ -893,7 +720,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
893
720
  * obvious reading is wrong: the file header's "an `@Output` CONSUMES the binding" holds for a
894
721
  * COMPONENT, and an element is the other case — Angular attaches the renderer listener for the
895
722
  * event as well, so `Renderer2.listen` still runs and the engine still hears the change. Measured
896
- * under JIT by deleting this whole hook: every case in `lowered-two-way-value.test.ts` stayed
723
+ * under JIT by deleting this whole hook: every case in `renderer/two-way-value.test.ts` stayed
897
724
  * green, delivery included, and exactly ONCE (nothing double-fires when both paths exist).
898
725
  *
899
726
  * It is kept because the measurement is JIT-only and this adapter has a recorded case of JIT and
@@ -909,9 +736,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
909
736
  * an unbound one), not assumed.
910
737
  */
911
738
  class ValueChangeElement extends ReadBackElement {
912
- valueRenderer = inject(Renderer2);
913
- valueHost = inject(ElementRef);
914
- unlistenValue;
739
+ constructor() {
740
+ super(...arguments);
741
+ this.valueRenderer = inject(Renderer2);
742
+ this.valueHost = inject(ElementRef);
743
+ }
915
744
  ngOnInit() {
916
745
  if (!this.hasValueSubscriber())
917
746
  return;
@@ -923,53 +752,19 @@ class ValueChangeElement extends ReadBackElement {
923
752
  super.ngOnDestroy();
924
753
  this.unlistenValue?.();
925
754
  }
926
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValueChangeElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
927
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ValueChangeElement, isStandalone: true, usesInheritance: true, ngImport: i0 });
755
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValueChangeElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
756
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ValueChangeElement, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
928
757
  }
929
758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValueChangeElement, decorators: [{
930
759
  type: Directive
931
760
  }] });
932
761
  export class TextInputElement extends ValueChangeElement {
933
- value;
934
- defaultValue;
935
- placeholder;
936
- placeholderTextColor;
937
- multiline;
938
- numberOfLines;
939
- maxLength;
940
- editable;
941
- readOnly;
942
- autoFocus;
943
- autoCapitalize;
944
- autoComplete;
945
- autoCorrect;
946
- blurOnSubmit;
947
- submitBehavior;
948
- cursorColor;
949
- enterKeyHint;
950
- returnKeyType;
951
- inputMode;
952
- keyboardType;
953
- inputAccessoryViewID;
954
- scrollEnabled;
955
- secureTextEntry;
956
- selectTextOnFocus;
957
- selection;
958
- selectionColor;
959
- selectionHandleColor;
960
- showSoftInputOnFocus;
961
- textAlign;
962
- textContentType;
963
- underlineColorAndroid;
964
- onValueChange;
965
- onContentSizeChange;
966
- onEndEditing;
967
- onKeyPress;
968
- onSelectionChange;
969
- onSubmitEditing;
970
- // NonNullable, not the prop type: `[(value)]="name"` binds a `string`, and an emitter that can
971
- // also emit `undefined` fails the two-way assignability check ngtsc runs on the event half.
972
- valueChange = new EventEmitter();
762
+ constructor() {
763
+ super(...arguments);
764
+ // NonNullable, not the prop type: `[(value)]="name"` binds a `string`, and an emitter that can
765
+ // also emit `undefined` fails the two-way assignability check ngtsc runs on the event half.
766
+ this.valueChange = new EventEmitter();
767
+ }
973
768
  hasValueSubscriber() {
974
769
  return this.valueChange.observed;
975
770
  }
@@ -977,8 +772,8 @@ export class TextInputElement extends ValueChangeElement {
977
772
  if (typeof value === 'string')
978
773
  this.valueChange.emit(value);
979
774
  }
980
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
981
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextInputElement, isStandalone: true, selector: "text-input", inputs: { value: "value", defaultValue: "defaultValue", placeholder: "placeholder", placeholderTextColor: "placeholderTextColor", multiline: "multiline", numberOfLines: "numberOfLines", maxLength: "maxLength", editable: "editable", readOnly: "readOnly", autoFocus: "autoFocus", autoCapitalize: "autoCapitalize", autoComplete: "autoComplete", autoCorrect: "autoCorrect", blurOnSubmit: "blurOnSubmit", submitBehavior: "submitBehavior", cursorColor: "cursorColor", enterKeyHint: "enterKeyHint", returnKeyType: "returnKeyType", inputMode: "inputMode", keyboardType: "keyboardType", inputAccessoryViewID: "inputAccessoryViewID", scrollEnabled: "scrollEnabled", secureTextEntry: "secureTextEntry", selectTextOnFocus: "selectTextOnFocus", selection: "selection", selectionColor: "selectionColor", selectionHandleColor: "selectionHandleColor", showSoftInputOnFocus: "showSoftInputOnFocus", textAlign: "textAlign", textContentType: "textContentType", underlineColorAndroid: "underlineColorAndroid", onValueChange: "onValueChange", onContentSizeChange: "onContentSizeChange", onEndEditing: "onEndEditing", onKeyPress: "onKeyPress", onSelectionChange: "onSelectionChange", onSubmitEditing: "onSubmitEditing" }, outputs: { valueChange: "valueChange" }, usesInheritance: true, ngImport: i0 });
775
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
776
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextInputElement, isStandalone: true, selector: "text-input", inputs: { value: "value", defaultValue: "defaultValue", placeholder: "placeholder", placeholderTextColor: "placeholderTextColor", multiline: "multiline", numberOfLines: "numberOfLines", maxLength: "maxLength", editable: "editable", readOnly: "readOnly", autoFocus: "autoFocus", autoCapitalize: "autoCapitalize", autoComplete: "autoComplete", autoCorrect: "autoCorrect", blurOnSubmit: "blurOnSubmit", submitBehavior: "submitBehavior", cursorColor: "cursorColor", enterKeyHint: "enterKeyHint", returnKeyType: "returnKeyType", inputMode: "inputMode", keyboardType: "keyboardType", inputAccessoryViewID: "inputAccessoryViewID", scrollEnabled: "scrollEnabled", secureTextEntry: "secureTextEntry", selectTextOnFocus: "selectTextOnFocus", selection: "selection", selectionColor: "selectionColor", selectionHandleColor: "selectionHandleColor", showSoftInputOnFocus: "showSoftInputOnFocus", textAlign: "textAlign", textContentType: "textContentType", underlineColorAndroid: "underlineColorAndroid", onValueChange: "onValueChange", onChangeText: "onChangeText", onContentSizeChange: "onContentSizeChange", onEndEditing: "onEndEditing", onKeyPress: "onKeyPress", onSelectionChange: "onSelectionChange", onSubmitEditing: "onSubmitEditing" }, outputs: { valueChange: "valueChange" }, usesInheritance: true, ngImport: i0 }); }
982
777
  }
983
778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputElement, decorators: [{
984
779
  type: Directive,
@@ -1047,6 +842,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1047
842
  type: Input
1048
843
  }], onValueChange: [{
1049
844
  type: Input
845
+ }], onChangeText: [{
846
+ type: Input
1050
847
  }], onContentSizeChange: [{
1051
848
  type: Input
1052
849
  }], onEndEditing: [{
@@ -1061,40 +858,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1061
858
  type: Output
1062
859
  }] } });
1063
860
  export class MultilineTextInputElement extends TextInputElement {
1064
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MultilineTextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1065
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: MultilineTextInputElement, isStandalone: true, selector: "text-input-multiline", usesInheritance: true, ngImport: i0 });
861
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MultilineTextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
862
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: MultilineTextInputElement, isStandalone: true, selector: "text-input-multiline", usesInheritance: true, ngImport: i0 }); }
1066
863
  }
1067
864
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MultilineTextInputElement, decorators: [{
1068
865
  type: Directive,
1069
866
  args: [{ selector: 'text-input-multiline', standalone: true }]
1070
867
  }] });
1071
- // The COMPONENT path's spelling of the pair above — same native views, a tag the behavior registry
1072
- // deliberately does not carry (`component-names/shared.ts`). Declared so the tag alphabet is
1073
- // complete; an app writes the plain name.
1074
- export class ManagedTextInputElement extends TextInputElement {
1075
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedTextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1076
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ManagedTextInputElement, isStandalone: true, selector: "text-input-managed", usesInheritance: true, ngImport: i0 });
1077
- }
1078
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedTextInputElement, decorators: [{
1079
- type: Directive,
1080
- args: [{ selector: 'text-input-managed', standalone: true }]
1081
- }] });
1082
- export class ManagedMultilineTextInputElement extends TextInputElement {
1083
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedMultilineTextInputElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1084
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ManagedMultilineTextInputElement, isStandalone: true, selector: "text-input-multiline-managed", usesInheritance: true, ngImport: i0 });
1085
- }
1086
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedMultilineTextInputElement, decorators: [{
1087
- type: Directive,
1088
- args: [{ selector: 'text-input-multiline-managed', standalone: true }]
1089
- }] });
1090
868
  export class SwitchElement extends ValueChangeElement {
1091
- value;
1092
- disabled;
1093
- trackColor;
1094
- thumbColor;
1095
- ios_backgroundColor;
1096
- onValueChange;
1097
- valueChange = new EventEmitter();
869
+ constructor() {
870
+ super(...arguments);
871
+ this.valueChange = new EventEmitter();
872
+ }
1098
873
  hasValueSubscriber() {
1099
874
  return this.valueChange.observed;
1100
875
  }
@@ -1102,12 +877,12 @@ export class SwitchElement extends ValueChangeElement {
1102
877
  if (typeof value === 'boolean')
1103
878
  this.valueChange.emit(value);
1104
879
  }
1105
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1106
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SwitchElement, isStandalone: true, selector: "switch", inputs: { value: "value", disabled: "disabled", trackColor: "trackColor", thumbColor: "thumbColor", ios_backgroundColor: "ios_backgroundColor", onValueChange: "onValueChange" }, outputs: { valueChange: "valueChange" }, usesInheritance: true, ngImport: i0 });
880
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
881
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SwitchElement, isStandalone: true, selector: "switch, symbiote-switch", inputs: { value: "value", disabled: "disabled", trackColor: "trackColor", thumbColor: "thumbColor", ios_backgroundColor: "ios_backgroundColor", onValueChange: "onValueChange" }, outputs: { valueChange: "valueChange" }, usesInheritance: true, ngImport: i0 }); }
1107
882
  }
1108
883
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchElement, decorators: [{
1109
884
  type: Directive,
1110
- args: [{ selector: 'switch', standalone: true }]
885
+ args: [{ selector: 'switch, symbiote-switch', standalone: true }]
1111
886
  }], propDecorators: { value: [{
1112
887
  type: Input
1113
888
  }], disabled: [{
@@ -1123,14 +898,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1123
898
  }], valueChange: [{
1124
899
  type: Output
1125
900
  }] } });
1126
- export class ManagedSwitchElement extends SwitchElement {
1127
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedSwitchElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1128
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ManagedSwitchElement, isStandalone: true, selector: "switch-managed", usesInheritance: true, ngImport: i0 });
1129
- }
1130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ManagedSwitchElement, decorators: [{
1131
- type: Directive,
1132
- args: [{ selector: 'switch-managed', standalone: true }]
1133
- }] });
1134
901
  /**
1135
902
  * `[(ngModel)]` / `formControlName` on a `<text-input>` or a `<switch>`.
1136
903
  *
@@ -1145,9 +912,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1145
912
  * directive holds no fold of its own.
1146
913
  */
1147
914
  class SymbioteValueAccessor {
1148
- renderer = inject(Renderer2);
1149
- host = inject(ElementRef);
1150
- unlisten;
915
+ constructor() {
916
+ this.renderer = inject(Renderer2);
917
+ this.host = inject(ElementRef);
918
+ }
1151
919
  setProp(name, value) {
1152
920
  this.renderer.setProperty(this.host.nativeElement, name, value);
1153
921
  }
@@ -1157,6 +925,21 @@ class SymbioteValueAccessor {
1157
925
  registerOnChange(fn) {
1158
926
  this.unlisten?.();
1159
927
  this.unlisten = this.renderer.listen(this.host.nativeElement, VALUE_CHANGE_EVENT, (value) => {
928
+ // THE HALF THE DOM DOES FOR FREE, and without it a controlled input undoes every
929
+ // keystroke. `<text-input>`'s behavior re-commands the native text whenever `props.value`
930
+ // disagrees with what native last reported — that is what makes it controlled — and the
931
+ // read-back flush exists so the app's new value is on the node by the time the commit runs.
932
+ // @angular/forms does not reach the node in that window: `NgModel.ngOnChanges` defers
933
+ // `_updateValue` through `resolvedPromise.then`, so `writeValue` lands a MICROTASK after
934
+ // the flush, and the commit in between still reads the value from before the keystroke.
935
+ //
936
+ // In a browser there is nothing to do here: `input.value` already holds what the user
937
+ // typed. `node.props.value` is the same slot, and nothing else writes it — so the accessor
938
+ // mirrors it, which is the shape rather than a workaround. A later `writeValue` still wins,
939
+ // so an app that transforms or refuses the value keeps doing so, one microtask on.
940
+ //
941
+ // Device-reported 2026-09-20: every character snapped the field back to its mounted text.
942
+ this.setProp('value', value);
1160
943
  fn(value);
1161
944
  });
1162
945
  }
@@ -1171,8 +954,8 @@ class SymbioteValueAccessor {
1171
954
  ngOnDestroy() {
1172
955
  this.unlisten?.();
1173
956
  }
1174
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteValueAccessor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1175
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteValueAccessor, isStandalone: true, ngImport: i0 });
957
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteValueAccessor, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
958
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteValueAccessor, isStandalone: true, ngImport: i0 }); }
1176
959
  }
1177
960
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteValueAccessor, decorators: [{
1178
961
  type: Directive
@@ -1181,14 +964,14 @@ export class TextInputValueAccessor extends SymbioteValueAccessor {
1181
964
  writeDisabled(isDisabled) {
1182
965
  this.setProp('editable', !isDisabled);
1183
966
  }
1184
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputValueAccessor, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1185
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextInputValueAccessor, isStandalone: true, selector: "text-input[ngModel], text-input[formControl], text-input[formControlName], text-input-multiline[ngModel], text-input-multiline[formControl], text-input-multiline[formControlName]", providers: [
967
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputValueAccessor, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
968
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TextInputValueAccessor, isStandalone: true, selector: "text-input[ngModel], text-input[formControl], text-input[formControlName], text-input-multiline[ngModel], text-input-multiline[formControl], text-input-multiline[formControlName]", providers: [
1186
969
  {
1187
970
  provide: NG_VALUE_ACCESSOR,
1188
971
  useExisting: forwardRef(() => TextInputValueAccessor),
1189
972
  multi: true,
1190
973
  },
1191
- ], usesInheritance: true, ngImport: i0 });
974
+ ], usesInheritance: true, ngImport: i0 }); }
1192
975
  }
1193
976
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TextInputValueAccessor, decorators: [{
1194
977
  type: Directive,
@@ -1208,19 +991,19 @@ export class SwitchValueAccessor extends SymbioteValueAccessor {
1208
991
  writeDisabled(isDisabled) {
1209
992
  this.setProp('disabled', isDisabled);
1210
993
  }
1211
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchValueAccessor, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1212
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SwitchValueAccessor, isStandalone: true, selector: "switch[ngModel], switch[formControl], switch[formControlName], switch-managed[ngModel], switch-managed[formControl], switch-managed[formControlName]", providers: [
994
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchValueAccessor, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
995
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SwitchValueAccessor, isStandalone: true, selector: "switch[ngModel], switch[formControl], switch[formControlName]", providers: [
1213
996
  {
1214
997
  provide: NG_VALUE_ACCESSOR,
1215
998
  useExisting: forwardRef(() => SwitchValueAccessor),
1216
999
  multi: true,
1217
1000
  },
1218
- ], usesInheritance: true, ngImport: i0 });
1001
+ ], usesInheritance: true, ngImport: i0 }); }
1219
1002
  }
1220
1003
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SwitchValueAccessor, decorators: [{
1221
1004
  type: Directive,
1222
1005
  args: [{
1223
- selector: 'switch[ngModel], switch[formControl], switch[formControlName], switch-managed[ngModel], switch-managed[formControl], switch-managed[formControlName]',
1006
+ selector: 'switch[ngModel], switch[formControl], switch[formControlName]',
1224
1007
  standalone: true,
1225
1008
  providers: [
1226
1009
  {
@@ -1235,12 +1018,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1235
1018
  // The four spinner props are declared here because that is where the app writes them; the engine's
1236
1019
  // behavior redirects them onto the spinner it builds underneath (`slotProps`).
1237
1020
  export class ActivityIndicatorElement extends SymbioteElement {
1238
- animating;
1239
- color;
1240
- size;
1241
- hidesWhenStopped;
1242
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1243
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ActivityIndicatorElement, isStandalone: true, selector: "activity-indicator", inputs: { animating: "animating", color: "color", size: "size", hidesWhenStopped: "hidesWhenStopped" }, usesInheritance: true, ngImport: i0 });
1021
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1022
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ActivityIndicatorElement, isStandalone: true, selector: "activity-indicator", inputs: { animating: "animating", color: "color", size: "size", hidesWhenStopped: "hidesWhenStopped" }, usesInheritance: true, ngImport: i0 }); }
1244
1023
  }
1245
1024
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorElement, decorators: [{
1246
1025
  type: Directive,
@@ -1258,38 +1037,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1258
1037
  // written in an app template — declared only so the tag alphabet stays covered, the same as
1259
1038
  // `scroll-content`.
1260
1039
  export class ActivityIndicatorSpinnerElement extends ActivityIndicatorElement {
1261
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorSpinnerElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1262
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ActivityIndicatorSpinnerElement, isStandalone: true, selector: "activity-indicator-spinner", usesInheritance: true, ngImport: i0 });
1040
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorSpinnerElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1041
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ActivityIndicatorSpinnerElement, isStandalone: true, selector: "activity-indicator-spinner", usesInheritance: true, ngImport: i0 }); }
1263
1042
  }
1264
1043
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ActivityIndicatorSpinnerElement, decorators: [{
1265
1044
  type: Directive,
1266
1045
  args: [{ selector: 'activity-indicator-spinner', standalone: true }]
1267
1046
  }] });
1268
1047
  export class SafeAreaViewElement extends SymbioteElement {
1269
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SafeAreaViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1270
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SafeAreaViewElement, isStandalone: true, selector: "safe-area-view", usesInheritance: true, ngImport: i0 });
1048
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SafeAreaViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1049
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SafeAreaViewElement, isStandalone: true, selector: "safe-area-view", usesInheritance: true, ngImport: i0 }); }
1271
1050
  }
1272
1051
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SafeAreaViewElement, decorators: [{
1273
1052
  type: Directive,
1274
1053
  args: [{ selector: 'safe-area-view', standalone: true }]
1275
1054
  }] });
1276
1055
  export class ModalElement extends SymbioteElement {
1277
- visible;
1278
- transparent;
1279
- animationType;
1280
- presentationStyle;
1281
- supportedOrientations;
1282
- hardwareAccelerated;
1283
- statusBarTranslucent;
1284
- navigationBarTranslucent;
1285
- allowSwipeDismissal;
1286
- backdropColor;
1287
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ModalElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1288
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ModalElement, isStandalone: true, selector: "modal", inputs: { visible: "visible", transparent: "transparent", animationType: "animationType", presentationStyle: "presentationStyle", supportedOrientations: "supportedOrientations", hardwareAccelerated: "hardwareAccelerated", statusBarTranslucent: "statusBarTranslucent", navigationBarTranslucent: "navigationBarTranslucent", allowSwipeDismissal: "allowSwipeDismissal", backdropColor: "backdropColor" }, usesInheritance: true, ngImport: i0 });
1056
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ModalElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1057
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ModalElement, isStandalone: true, selector: "modal, symbiote-modal", inputs: { visible: "visible", transparent: "transparent", animationType: "animationType", presentationStyle: "presentationStyle", supportedOrientations: "supportedOrientations", hardwareAccelerated: "hardwareAccelerated", statusBarTranslucent: "statusBarTranslucent", navigationBarTranslucent: "navigationBarTranslucent", allowSwipeDismissal: "allowSwipeDismissal", backdropColor: "backdropColor" }, usesInheritance: true, ngImport: i0 }); }
1289
1058
  }
1290
1059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ModalElement, decorators: [{
1291
1060
  type: Directive,
1292
- args: [{ selector: 'modal', standalone: true }]
1061
+ args: [{ selector: 'modal, symbiote-modal', standalone: true }]
1293
1062
  }], propDecorators: { visible: [{
1294
1063
  type: Input
1295
1064
  }], transparent: [{
@@ -1312,18 +1081,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1312
1081
  type: Input
1313
1082
  }] } });
1314
1083
  export class RefreshControlElement extends ReadBackElement {
1315
- refreshing;
1316
- enabled;
1317
- colors;
1318
- tintColor;
1319
- title;
1320
- titleColor;
1321
- size;
1322
- progressBackgroundColor;
1323
- progressViewOffset;
1324
- onRefresh;
1325
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RefreshControlElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1326
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: RefreshControlElement, isStandalone: true, selector: "refresh-control", inputs: { refreshing: "refreshing", enabled: "enabled", colors: "colors", tintColor: "tintColor", title: "title", titleColor: "titleColor", size: "size", progressBackgroundColor: "progressBackgroundColor", progressViewOffset: "progressViewOffset", onRefresh: "onRefresh" }, usesInheritance: true, ngImport: i0 });
1084
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RefreshControlElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1085
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: RefreshControlElement, isStandalone: true, selector: "refresh-control", inputs: { refreshing: "refreshing", enabled: "enabled", colors: "colors", tintColor: "tintColor", title: "title", titleColor: "titleColor", size: "size", progressBackgroundColor: "progressBackgroundColor", progressViewOffset: "progressViewOffset", onRefresh: "onRefresh" }, usesInheritance: true, ngImport: i0 }); }
1327
1086
  }
1328
1087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RefreshControlElement, decorators: [{
1329
1088
  type: Directive,
@@ -1350,12 +1109,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1350
1109
  type: Input
1351
1110
  }] } });
1352
1111
  export class StickyHeaderElement extends SymbioteElement {
1353
- inverted;
1354
- nextHeaderLayoutY;
1355
- scrollAnimatedValue;
1356
- scrollViewHeight;
1357
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StickyHeaderElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1358
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: StickyHeaderElement, isStandalone: true, selector: "sticky-header", inputs: { inverted: "inverted", nextHeaderLayoutY: "nextHeaderLayoutY", scrollAnimatedValue: "scrollAnimatedValue", scrollViewHeight: "scrollViewHeight" }, usesInheritance: true, ngImport: i0 });
1112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StickyHeaderElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1113
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: StickyHeaderElement, isStandalone: true, selector: "sticky-header", inputs: { inverted: "inverted", nextHeaderLayoutY: "nextHeaderLayoutY", scrollAnimatedValue: "scrollAnimatedValue", scrollViewHeight: "scrollViewHeight" }, usesInheritance: true, ngImport: i0 }); }
1359
1114
  }
1360
1115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StickyHeaderElement, decorators: [{
1361
1116
  type: Directive,
@@ -1370,9 +1125,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1370
1125
  type: Input
1371
1126
  }] } });
1372
1127
  export class InputAccessoryViewElement extends SymbioteElement {
1373
- backgroundColor;
1374
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: InputAccessoryViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1375
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: InputAccessoryViewElement, isStandalone: true, selector: "input-accessory-view", inputs: { backgroundColor: "backgroundColor" }, usesInheritance: true, ngImport: i0 });
1128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: InputAccessoryViewElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1129
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: InputAccessoryViewElement, isStandalone: true, selector: "input-accessory-view", inputs: { backgroundColor: "backgroundColor" }, usesInheritance: true, ngImport: i0 }); }
1376
1130
  }
1377
1131
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: InputAccessoryViewElement, decorators: [{
1378
1132
  type: Directive,
@@ -1406,10 +1160,7 @@ export const SYMBIOTE_ELEMENTS = [
1406
1160
  HorizontalScrollContentElement,
1407
1161
  TextInputElement,
1408
1162
  MultilineTextInputElement,
1409
- ManagedTextInputElement,
1410
- ManagedMultilineTextInputElement,
1411
1163
  SwitchElement,
1412
- ManagedSwitchElement,
1413
1164
  ActivityIndicatorElement,
1414
1165
  ActivityIndicatorSpinnerElement,
1415
1166
  SafeAreaViewElement,
@@ -1422,7 +1173,39 @@ export const SYMBIOTE_ELEMENTS = [
1422
1173
  // provided, and `elements.test.ts` subtracts them from its tag-coverage check by name.
1423
1174
  TextInputValueAccessor,
1424
1175
  SwitchValueAccessor,
1176
+ // Also not a tag: it matches on the callback ATTRIBUTES, so it lands only on the elements that
1177
+ // bind one and carries the `ChangeDetectorRef` their wrapper needs. It rides this list for the same
1178
+ // reason the accessors do, and `elements.test.ts` subtracts it from the tag-coverage check by name.
1179
+ SymbioteCallbackHost,
1180
+ // The other attribute-matched one: it claims `[style]` and `[class]` so an RN style ARRAY never
1181
+ // reaches Angular's styling engine, which cannot represent one and throws. See `style-host.ts`.
1182
+ SymbioteStyleHost,
1425
1183
  ];
1184
+ // THE DIRECTIVES THAT GO ON MATCHING, and the list is the exceptions rather than the rule.
1185
+ //
1186
+ // A tag directive here is, with four exceptions, nothing but `@Input()` declarations over one
1187
+ // inherited `ngOnChanges` that forwards each of them to the renderer — which is the call
1188
+ // `ɵɵproperty` makes directly on an element nothing claimed. So the instance buys a compile-time
1189
+ // check at ~8.5-9.4 us of run time per element, and `./runtime-matching` keeps the check while
1190
+ // dropping the instance.
1191
+ //
1192
+ // These four cannot go, because they DO something when they are built:
1193
+ //
1194
+ // text-input, text-input-multiline, switch `ValueChangeElement` — listens for the engine's value
1195
+ // event and registers a view flush, which is what stops
1196
+ // a controlled value being undone inside one microtask
1197
+ // refresh-control `ReadBackElement`, the same flush for the same reason
1198
+ //
1199
+ // The two form accessors and `SymbioteCallbackHost` are absent from both lists deliberately: they
1200
+ // match on an ATTRIBUTE rather than a tag, so they already land only where they are needed.
1201
+ withholdFromRuntimeMatching(SYMBIOTE_ELEMENTS.filter(directive => directive !== TextInputElement &&
1202
+ directive !== MultilineTextInputElement &&
1203
+ directive !== SwitchElement &&
1204
+ directive !== RefreshControlElement &&
1205
+ directive !== TextInputValueAccessor &&
1206
+ directive !== SwitchValueAccessor &&
1207
+ directive !== SymbioteCallbackHost &&
1208
+ directive !== SymbioteStyleHost));
1426
1209
  const DECLARES_EVERY_PROP = {
1427
1210
  view: true,
1428
1211
  pressable: true,