@symbiote-native/angular 0.7.0 → 1.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.
- package/README.md +3 -3
- package/babel-lower-host-primitives.cjs +636 -0
- package/babel-register-composed.cjs +21 -3
- package/build/angular/anchor-host-registry.js +3 -1
- package/build/angular/anchor-host-registry.js.map +1 -1
- package/build/angular/bootstrap.js +1 -1
- package/build/angular/bootstrap.js.map +1 -1
- package/build/angular/components/activity-indicator/index.android.js +7 -2
- package/build/angular/components/activity-indicator/index.android.js.map +1 -1
- package/build/angular/components/activity-indicator/index.ios.js +3 -1
- package/build/angular/components/activity-indicator/index.ios.js.map +1 -1
- package/build/angular/components/activity-indicator/shared.d.ts +1 -1
- package/build/angular/components/activity-indicator/shared.js +1 -1
- package/build/angular/components/activity-indicator/shared.js.map +1 -1
- package/build/angular/components/button.d.ts +3 -0
- package/build/angular/components/button.js +22 -5
- package/build/angular/components/button.js.map +1 -1
- package/build/angular/components/flat-list/index.d.ts +1 -1
- package/build/angular/components/flat-list/index.js +47 -14
- package/build/angular/components/flat-list/index.js.map +1 -1
- package/build/angular/components/image/index.android.js +4 -10
- package/build/angular/components/image/index.android.js.map +1 -1
- package/build/angular/components/image/index.ios.js +4 -10
- package/build/angular/components/image/index.ios.js.map +1 -1
- package/build/angular/components/image/shared.d.ts +4 -4
- package/build/angular/components/image/shared.js +51 -33
- package/build/angular/components/image/shared.js.map +1 -1
- package/build/angular/components/image-background.d.ts +3 -0
- package/build/angular/components/image-background.js +32 -9
- package/build/angular/components/image-background.js.map +1 -1
- package/build/angular/components/input-accessory-view/index.d.ts +2 -1
- package/build/angular/components/input-accessory-view/index.js +18 -16
- package/build/angular/components/input-accessory-view/index.js.map +1 -1
- package/build/angular/components/keyboard-avoiding-view/index.d.ts +3 -1
- package/build/angular/components/keyboard-avoiding-view/index.js +56 -19
- package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
- package/build/angular/components/modal/index.d.ts +1 -0
- package/build/angular/components/modal/index.js +21 -10
- package/build/angular/components/modal/index.js.map +1 -1
- package/build/angular/components/pressable/index.d.ts +10 -5
- package/build/angular/components/pressable/index.js +61 -16
- package/build/angular/components/pressable/index.js.map +1 -1
- package/build/angular/components/refresh-control/index.d.ts +2 -1
- package/build/angular/components/refresh-control/index.js +13 -9
- package/build/angular/components/refresh-control/index.js.map +1 -1
- package/build/angular/components/safe-area-view/index.d.ts +3 -1
- package/build/angular/components/safe-area-view/index.js +22 -20
- package/build/angular/components/safe-area-view/index.js.map +1 -1
- package/build/angular/components/scroll-view/index.android.js +44 -14
- package/build/angular/components/scroll-view/index.android.js.map +1 -1
- package/build/angular/components/scroll-view/index.ios.js +13 -5
- package/build/angular/components/scroll-view/index.ios.js.map +1 -1
- package/build/angular/components/scroll-view/projection.d.ts +32 -0
- package/build/angular/components/scroll-view/projection.js +212 -47
- package/build/angular/components/scroll-view/projection.js.map +1 -1
- package/build/angular/components/scroll-view/shared.d.ts +2 -0
- package/build/angular/components/scroll-view/shared.js +48 -11
- package/build/angular/components/scroll-view/shared.js.map +1 -1
- package/build/angular/components/scroll-view/sticky-header.js +7 -3
- package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
- package/build/angular/components/section-list/index.d.ts +9 -1
- package/build/angular/components/section-list/index.js +72 -18
- package/build/angular/components/section-list/index.js.map +1 -1
- package/build/angular/components/switch/index.android.js +23 -9
- package/build/angular/components/switch/index.android.js.map +1 -1
- package/build/angular/components/switch/index.ios.js +23 -9
- package/build/angular/components/switch/index.ios.js.map +1 -1
- package/build/angular/components/switch/shared.d.ts +1 -1
- package/build/angular/components/switch/shared.js +5 -2
- package/build/angular/components/switch/shared.js.map +1 -1
- package/build/angular/components/text-input.d.ts +8 -2
- package/build/angular/components/text-input.js +79 -34
- package/build/angular/components/text-input.js.map +1 -1
- package/build/angular/components/touchable/index.d.ts +36 -7
- package/build/angular/components/touchable/index.js +280 -72
- package/build/angular/components/touchable/index.js.map +1 -1
- package/build/angular/components/touchable-native-feedback/index.d.ts +2 -1
- package/build/angular/components/touchable-native-feedback/index.js +19 -17
- package/build/angular/components/touchable-native-feedback/index.js.map +1 -1
- package/build/angular/components/virtualized-list/directives.js +4 -0
- package/build/angular/components/virtualized-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-list/index.d.ts +8 -2
- package/build/angular/components/virtualized-list/index.js +207 -61
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.d.ts +21 -1
- package/build/angular/components/virtualized-section-list/index.js +100 -22
- package/build/angular/components/virtualized-section-list/index.js.map +1 -1
- package/build/angular/components.d.ts +2 -2
- package/build/angular/components.js +1 -1
- package/build/angular/components.js.map +1 -1
- package/build/angular/create-portal/index.d.ts +11 -2
- package/build/angular/create-portal/index.js +42 -12
- package/build/angular/create-portal/index.js.map +1 -1
- package/build/angular/create-tunnel/index.js.map +1 -1
- package/build/angular/descriptor-to-angular/index.js +3 -1
- package/build/angular/descriptor-to-angular/index.js.map +1 -1
- package/build/angular/diagnostics.d.ts +33 -0
- package/build/angular/diagnostics.js +82 -0
- package/build/angular/diagnostics.js.map +1 -0
- package/build/angular/gate-demand.d.ts +37 -0
- package/build/angular/gate-demand.js +84 -0
- package/build/angular/gate-demand.js.map +1 -0
- package/build/angular/host-instance/index.js +1 -1
- package/build/angular/host-instance/index.js.map +1 -1
- package/build/angular/index.d.ts +6 -2
- package/build/angular/index.js +16 -1
- package/build/angular/index.js.map +1 -1
- package/build/angular/modules/animated/create-animated-component.d.ts +1 -0
- package/build/angular/modules/animated/create-animated-component.js +41 -18
- package/build/angular/modules/animated/create-animated-component.js.map +1 -1
- package/build/angular/modules/app-registry/index.js.map +1 -1
- package/build/angular/modules/status-bar/index.js +1 -1
- package/build/angular/modules/status-bar/index.js.map +1 -1
- package/build/angular/primitives/index.d.ts +31 -2
- package/build/angular/primitives/index.js +81 -3
- package/build/angular/primitives/index.js.map +1 -1
- package/build/angular/primitives/shared.d.ts +9 -1
- package/build/angular/primitives/shared.js +49 -3
- package/build/angular/primitives/shared.js.map +1 -1
- package/build/angular/register.d.ts +1 -0
- package/build/angular/register.js +35 -0
- package/build/angular/register.js.map +1 -0
- package/build/angular/render/index.js +51 -6
- package/build/angular/render/index.js.map +1 -1
- package/build/angular/renderer/index.d.ts +1 -0
- package/build/angular/renderer/index.js +157 -21
- package/build/angular/renderer/index.js.map +1 -1
- package/build/angular/services/color-scheme.service.js.map +1 -1
- package/build/angular/services/window-dimensions.service.js +1 -1
- package/build/angular/services/window-dimensions.service.js.map +1 -1
- package/build/angular/state-style.d.ts +9 -0
- package/build/angular/state-style.js +39 -0
- package/build/angular/state-style.js.map +1 -0
- package/metro-transformer.cjs +69 -0
- package/package.json +27 -8
- package/src/anchor-host-registry.ts +3 -1
- package/src/bootstrap.ts +4 -1
- package/src/components/activity-indicator/index.android.ts +7 -2
- package/src/components/activity-indicator/index.ios.ts +3 -1
- package/src/components/activity-indicator/shared.ts +32 -13
- package/src/components/button.ts +36 -6
- package/src/components/flat-list/index.ts +91 -29
- package/src/components/image/index.android.ts +9 -6
- package/src/components/image/index.ios.ts +9 -6
- package/src/components/image/shared.ts +110 -45
- package/src/components/image-background.ts +47 -10
- package/src/components/input-accessory-view/index.ts +41 -18
- package/src/components/keyboard-avoiding-view/index.ts +76 -22
- package/src/components/modal/index.ts +39 -12
- package/src/components/pressable/index.ts +121 -31
- package/src/components/refresh-control/index.ts +36 -13
- package/src/components/safe-area-view/index.ts +44 -19
- package/src/components/scroll-view/index.android.ts +31 -9
- package/src/components/scroll-view/index.ios.ts +17 -4
- package/src/components/scroll-view/projection.ts +290 -63
- package/src/components/scroll-view/shared.ts +124 -30
- package/src/components/scroll-view/sticky-header.ts +25 -8
- package/src/components/section-list/index.ts +79 -19
- package/src/components/switch/index.android.ts +18 -7
- package/src/components/switch/index.ios.ts +18 -7
- package/src/components/switch/shared.ts +15 -4
- package/src/components/text-input.ts +119 -31
- package/src/components/touchable/index.ts +339 -72
- package/src/components/touchable-native-feedback/index.ts +50 -18
- package/src/components/virtualized-list/directives.ts +19 -5
- package/src/components/virtualized-list/index.ts +292 -72
- package/src/components/virtualized-section-list/directives.ts +6 -3
- package/src/components/virtualized-section-list/index.ts +164 -34
- package/src/components.ts +6 -1
- package/src/create-portal/index.ts +47 -11
- package/src/create-tunnel/index.ts +3 -1
- package/src/descriptor-to-angular/index.ts +29 -8
- package/src/diagnostics.ts +138 -0
- package/src/gate-demand.ts +109 -0
- package/src/host-instance/index.ts +9 -3
- package/src/index.ts +33 -2
- package/src/modules/animated/create-animated-component.ts +67 -19
- package/src/modules/app-registry/index.ts +3 -1
- package/src/modules/status-bar/index.ts +13 -4
- package/src/primitives/index.ts +73 -2
- package/src/primitives/shared.ts +70 -9
- package/src/register.ts +43 -0
- package/src/render/index.ts +59 -7
- package/src/renderer/index.ts +209 -37
- package/src/services/color-scheme.service.ts +3 -1
- package/src/services/window-dimensions.service.ts +11 -4
- package/src/state-style.ts +39 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// keyboard's way as it shows/hides. The inset math + the behavior → style/structure decision
|
|
3
3
|
// live framework-agnostic in @symbiote-native/components (render-keyboard-avoiding-view), shared verbatim
|
|
4
4
|
// with React/Vue; Angular supplies only the lifecycle: a plain inset field, ngOnInit subscribes to
|
|
5
|
-
// the core Keyboard module (
|
|
5
|
+
// the core Keyboard module (the host's show / hide pair) and markForCheck pulls the OnPush view (the
|
|
6
6
|
// Angular twin of React's setState / Vue's reactive ref), ngOnDestroy tears the subscriptions down,
|
|
7
7
|
// and the wrapper's onLayout measures the frame that feeds the next event's inset. The user
|
|
8
8
|
// children nest under the wrapper (or, for 'position', an inner View) via <ng-content>. No native
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
// Full parity: behavior 'height'|'position'|'padding', enabled, keyboardVerticalOffset,
|
|
12
12
|
// contentContainerStyle, onLayout, plus the full a11y/aria surface every View carries.
|
|
13
13
|
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, inject, Input, Output, } from '@angular/core';
|
|
14
|
-
import { computeInset, readKeyboardFrame, readLayoutFrame, resolveAccessibilityProps, resolveKeyboardAvoidingLayout, DEFAULT_VERTICAL_OFFSET, } from '@symbiote-native/components';
|
|
15
|
-
import { Keyboard,
|
|
14
|
+
import { computeInset, keyboardAvoidingEventNamesFor, readKeyboardFrame, readLayoutFrame, readPrefersCrossFadeTransitions, resolveAccessibilityProps, resolveKeyboardAvoidingLayout, DEFAULT_VERTICAL_OFFSET, } from '@symbiote-native/components';
|
|
15
|
+
import { Keyboard, Platform, dlog, isSymbioteEvent, } from '@symbiote-native/engine';
|
|
16
16
|
import { anchorHostStyle, SymbioteHostPropsDirective, SymbioteStyleInputDirective, ViewHost, } from '../../primitives';
|
|
17
17
|
import * as i0 from "@angular/core";
|
|
18
18
|
import * as i1 from "../../primitives/shared";
|
|
@@ -73,6 +73,12 @@ export class KeyboardAvoidingView {
|
|
|
73
73
|
// keyboard event's inset math (React's frameRef / initialHeightRef, Vue's frame / initialHeight).
|
|
74
74
|
frame;
|
|
75
75
|
initialHeight;
|
|
76
|
+
// The iOS "Prefer Cross-Fade Transitions" setting, read once per mount. Deliberately a plain
|
|
77
|
+
// field and NOT markForCheck'd when the promise lands: it is a device setting that cannot change
|
|
78
|
+
// mid-session, and it feeds only the NEXT keyboard event's math — never the current render — so
|
|
79
|
+
// under zoneless CD there is nothing to repaint at resolve time. The keyboard event that does use
|
|
80
|
+
// it already calls markForCheck itself.
|
|
81
|
+
prefersCrossFadeTransitions = false;
|
|
76
82
|
subscriptions = [];
|
|
77
83
|
changeDetector = inject(ChangeDetectorRef);
|
|
78
84
|
// This component's OWN host — the non-painting anchor `class="..."` at the use site resolves
|
|
@@ -80,11 +86,21 @@ export class KeyboardAvoidingView {
|
|
|
80
86
|
// component has none; the wrapper IS the outer template node hostProps binds onto).
|
|
81
87
|
elementRef = inject(ElementRef);
|
|
82
88
|
ngOnInit() {
|
|
89
|
+
// TWO events, picked per host, never three: iOS takes the will* pair so the view rides up with
|
|
90
|
+
// the keyboard animation, Android the did* pair. The change-frame notification is deliberately
|
|
91
|
+
// absent — with an undocked/split/floating iOS keyboard it fires BEFORE the hide, so listening
|
|
92
|
+
// to it applies a frame captured mid-dismissal (RN KeyboardAvoidingView.js's own comment).
|
|
93
|
+
const events = keyboardAvoidingEventNamesFor(Platform.OS);
|
|
83
94
|
this.subscriptions = [
|
|
84
|
-
Keyboard.addListener(
|
|
85
|
-
Keyboard.addListener(
|
|
86
|
-
Keyboard.addListener(KEYBOARD_EVENT.didHide, () => this.onHide()),
|
|
95
|
+
Keyboard.addListener(events.show, payload => this.onShow(payload)),
|
|
96
|
+
Keyboard.addListener(events.hide, () => this.onHide()),
|
|
87
97
|
];
|
|
98
|
+
// The core wrapper, not AccessibilityInfo directly: the engine's iOS getter REJECTS on a
|
|
99
|
+
// native error (RN parity), and nobody awaits this read, so an unwrapped call would surface
|
|
100
|
+
// as an unhandled rejection. The wrapper answers false on a failed read.
|
|
101
|
+
void readPrefersCrossFadeTransitions().then(enabled => {
|
|
102
|
+
this.prefersCrossFadeTransitions = enabled;
|
|
103
|
+
});
|
|
88
104
|
}
|
|
89
105
|
ngOnDestroy() {
|
|
90
106
|
for (const subscription of this.subscriptions)
|
|
@@ -94,7 +110,17 @@ export class KeyboardAvoidingView {
|
|
|
94
110
|
onShow(payload) {
|
|
95
111
|
const keyboard = readKeyboardFrame(payload);
|
|
96
112
|
const offset = this.keyboardVerticalOffset ?? DEFAULT_VERTICAL_OFFSET;
|
|
97
|
-
const next = computeInset(this.frame, keyboard, offset
|
|
113
|
+
const next = computeInset(this.frame, keyboard, offset, {
|
|
114
|
+
// Read off the field at event time, not captured when the subscription was built: `behavior`
|
|
115
|
+
// is an @Input that can change under a long-lived subscription, and a stale one keeps
|
|
116
|
+
// applying the old mode's math (it gates the previous-inset correction below).
|
|
117
|
+
behavior: this.behavior,
|
|
118
|
+
// The inset CURRENTLY applied (RN's this.state.bottom), read off the field at event time so
|
|
119
|
+
// 'height' mode's fixpoint correction sees the live value: that mode SHRINKS the wrapper by
|
|
120
|
+
// the inset, so the next onLayout reports a frame shorter by exactly that much.
|
|
121
|
+
previousInset: this.inset,
|
|
122
|
+
prefersCrossFadeTransitions: this.prefersCrossFadeTransitions,
|
|
123
|
+
});
|
|
98
124
|
dlog(`KeyboardAvoidingView show -> inset ${next}`);
|
|
99
125
|
this.inset = next;
|
|
100
126
|
this.changeDetector.markForCheck();
|
|
@@ -141,7 +167,9 @@ export class KeyboardAvoidingView {
|
|
|
141
167
|
return this.resolvedLayout.wrapperStyle;
|
|
142
168
|
}
|
|
143
169
|
get innerStyle() {
|
|
144
|
-
return this.resolvedLayout.kind === 'nested'
|
|
170
|
+
return this.resolvedLayout.kind === 'nested'
|
|
171
|
+
? this.resolvedLayout.innerStyle
|
|
172
|
+
: undefined;
|
|
145
173
|
}
|
|
146
174
|
// The wrapper's full prop bag (style + identity + a11y) folded for `[symbioteHostProps]`,
|
|
147
175
|
// the same pattern Modal's `hostProps` uses over its renderModal descriptor. The anchor's
|
|
@@ -154,15 +182,24 @@ export class KeyboardAvoidingView {
|
|
|
154
182
|
nativeID: this.nativeID,
|
|
155
183
|
accessible: this.accessible,
|
|
156
184
|
...this.folded,
|
|
185
|
+
onAccessibilityAction: this.eventEmitterHandler(this.accessibilityAction),
|
|
186
|
+
onAccessibilityTap: this.eventEmitterHandler(this.accessibilityTap),
|
|
187
|
+
onMagicTap: this.eventEmitterHandler(this.magicTap),
|
|
188
|
+
onAccessibilityEscape: this.eventEmitterHandler(this.accessibilityEscape),
|
|
157
189
|
};
|
|
158
190
|
}
|
|
159
191
|
// Forward an engine event to the matching @Output(), narrowing the template's untyped $event
|
|
160
|
-
// first.
|
|
161
|
-
// [onX] property bindings; events flow through (event) only).
|
|
192
|
+
// first.
|
|
162
193
|
emit(emitter, event) {
|
|
163
194
|
if (isSymbioteEvent(event))
|
|
164
195
|
emitter.emit(event);
|
|
165
196
|
}
|
|
197
|
+
// The four accessibility events are boolean-GATED Fabric events
|
|
198
|
+
// (`.claude/rules/fabric-boolean-event-gates.md`). `.observed`-gated, unlike `layout` above which
|
|
199
|
+
// this component needs unconditionally for its own internal frame measurement.
|
|
200
|
+
eventEmitterHandler(emitter) {
|
|
201
|
+
return emitter.observed ? event => this.emit(emitter, event) : undefined;
|
|
202
|
+
}
|
|
166
203
|
// Fold the web aria-*/role aliases into the canonical accessibility* props once per render, so the
|
|
167
204
|
// host node never sees an aria-* key (native ignores them) — the shared transform every adapter runs.
|
|
168
205
|
get folded() {
|
|
@@ -205,10 +242,6 @@ export class KeyboardAvoidingView {
|
|
|
205
242
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: KeyboardAvoidingView, isStandalone: true, selector: "KeyboardAvoidingView", inputs: { behavior: "behavior", enabled: "enabled", keyboardVerticalOffset: "keyboardVerticalOffset", contentContainerStyle: "contentContainerStyle", style: "style", testID: "testID", nativeID: "nativeID", 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", role: "role", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledBy: ["aria-labelledby", "ariaLabelledBy"], ariaLive: ["aria-live", "ariaLive"], ariaHidden: ["aria-hidden", "ariaHidden"], ariaBusy: ["aria-busy", "ariaBusy"], ariaChecked: ["aria-checked", "ariaChecked"], ariaDisabled: ["aria-disabled", "ariaDisabled"], ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaSelected: ["aria-selected", "ariaSelected"], ariaModal: ["aria-modal", "ariaModal"], ariaValueMax: ["aria-valuemax", "ariaValueMax"], ariaValueMin: ["aria-valuemin", "ariaValueMin"], ariaValueNow: ["aria-valuenow", "ariaValueNow"], ariaValueText: ["aria-valuetext", "ariaValueText"] }, outputs: { layout: "layout", accessibilityAction: "accessibilityAction", accessibilityTap: "accessibilityTap", magicTap: "magicTap", accessibilityEscape: "accessibilityEscape" }, hostDirectives: [{ directive: i1.SymbioteStyleInputDirective, inputs: ["style", "style"] }], ngImport: i0, template: `
|
|
206
243
|
<symbiote-view
|
|
207
244
|
[symbioteHostProps]="hostProps"
|
|
208
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
209
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
210
|
-
(magicTap)="emit(magicTap, $event)"
|
|
211
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
212
245
|
(layout)="handleLayout($event)"
|
|
213
246
|
>
|
|
214
247
|
@if (isNested) {
|
|
@@ -226,20 +259,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
226
259
|
args: [{
|
|
227
260
|
selector: 'KeyboardAvoidingView',
|
|
228
261
|
standalone: true,
|
|
229
|
-
hostDirectives: [
|
|
262
|
+
hostDirectives: [
|
|
263
|
+
{ directive: SymbioteStyleInputDirective, inputs: ['style'] },
|
|
264
|
+
],
|
|
230
265
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
231
266
|
imports: [ViewHost, SymbioteHostPropsDirective],
|
|
232
267
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
233
268
|
// The wrapper carries a11y + onLayout; 'position' ('nested') pushes the children in an inner
|
|
234
269
|
// View by `bottom: inset`, the wrapper modes adjust the single wrapper directly. Only one @if
|
|
235
270
|
// branch is instantiated, so each branch's <ng-content> projects the children unambiguously.
|
|
271
|
+
// `layout` stays a plain, unconditional template binding: unlike the four accessibility events
|
|
272
|
+
// below, this component READS its own onLayout internally (handleLayout measures the frame that
|
|
273
|
+
// feeds the next keyboard event's inset math — see keyboard-avoiding-view-rn-contract.md), so the
|
|
274
|
+
// gate must stay lit regardless of whether the app subscribes to the `layout` @Output(). Gating it
|
|
275
|
+
// on `.observed` would silently break the inset fixpoint correction the moment an app didn't
|
|
276
|
+
// listen to `layout`.
|
|
236
277
|
template: `
|
|
237
278
|
<symbiote-view
|
|
238
279
|
[symbioteHostProps]="hostProps"
|
|
239
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
240
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
241
|
-
(magicTap)="emit(magicTap, $event)"
|
|
242
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
243
280
|
(layout)="handleLayout($event)"
|
|
244
281
|
>
|
|
245
282
|
@if (isNested) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/keyboard-avoiding-view/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,6FAA6F;AAC7F,0GAA0G;AAC1G,mGAAmG;AACnG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/keyboard-avoiding-view/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,6 +89,7 @@ export declare class Modal implements IAngularModalInputs, OnInit, OnChanges, Do
|
|
|
89
89
|
readonly hostProps: import("@angular/core").Signal<Record<string, unknown>>;
|
|
90
90
|
get containerStyle(): unknown;
|
|
91
91
|
emit(emitter: EventEmitter<ISymbioteEvent>, event: unknown): void;
|
|
92
|
+
private eventEmitterHandler;
|
|
92
93
|
private accessibilityInputs;
|
|
93
94
|
static ɵfac: i0.ɵɵFactoryDeclaration<Modal, never>;
|
|
94
95
|
static ɵcmp: i0.ɵɵComponentDeclaration<Modal, "Modal", never, { "visible": { "alias": "visible"; "required": false; }; "transparent": { "alias": "transparent"; "required": false; }; "backdropColor": { "alias": "backdropColor"; "required": false; }; "animationType": { "alias": "animationType"; "required": false; }; "presentationStyle": { "alias": "presentationStyle"; "required": false; }; "supportedOrientations": { "alias": "supportedOrientations"; "required": false; }; "hardwareAccelerated": { "alias": "hardwareAccelerated"; "required": false; }; "statusBarTranslucent": { "alias": "statusBarTranslucent"; "required": false; }; "navigationBarTranslucent": { "alias": "navigationBarTranslucent"; "required": false; }; "allowSwipeDismissal": { "alias": "allowSwipeDismissal"; "required": false; }; "style": { "alias": "style"; "required": false; }; "testID": { "alias": "testID"; "required": false; }; "accessible": { "alias": "accessible"; "required": false; }; "accessibilityLabel": { "alias": "accessibilityLabel"; "required": false; }; "accessibilityHint": { "alias": "accessibilityHint"; "required": false; }; "accessibilityRole": { "alias": "accessibilityRole"; "required": false; }; "accessibilityState": { "alias": "accessibilityState"; "required": false; }; "accessibilityValue": { "alias": "accessibilityValue"; "required": false; }; "accessibilityActions": { "alias": "accessibilityActions"; "required": false; }; "accessibilityLabelledBy": { "alias": "accessibilityLabelledBy"; "required": false; }; "importantForAccessibility": { "alias": "importantForAccessibility"; "required": false; }; "accessibilityLiveRegion": { "alias": "accessibilityLiveRegion"; "required": false; }; "screenReaderFocusable": { "alias": "screenReaderFocusable"; "required": false; }; "accessibilityViewIsModal": { "alias": "accessibilityViewIsModal"; "required": false; }; "accessibilityElementsHidden": { "alias": "accessibilityElementsHidden"; "required": false; }; "accessibilityIgnoresInvertColors": { "alias": "accessibilityIgnoresInvertColors"; "required": false; }; "accessibilityLanguage": { "alias": "accessibilityLanguage"; "required": false; }; "accessibilityRespondsToUserInteraction": { "alias": "accessibilityRespondsToUserInteraction"; "required": false; }; "accessibilityShowsLargeContentViewer": { "alias": "accessibilityShowsLargeContentViewer"; "required": false; }; "accessibilityLargeContentTitle": { "alias": "accessibilityLargeContentTitle"; "required": false; }; "role": { "alias": "role"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledBy": { "alias": "aria-labelledby"; "required": false; }; "ariaLive": { "alias": "aria-live"; "required": false; }; "ariaHidden": { "alias": "aria-hidden"; "required": false; }; "ariaBusy": { "alias": "aria-busy"; "required": false; }; "ariaChecked": { "alias": "aria-checked"; "required": false; }; "ariaDisabled": { "alias": "aria-disabled"; "required": false; }; "ariaExpanded": { "alias": "aria-expanded"; "required": false; }; "ariaSelected": { "alias": "aria-selected"; "required": false; }; "ariaModal": { "alias": "aria-modal"; "required": false; }; "ariaValueMax": { "alias": "aria-valuemax"; "required": false; }; "ariaValueMin": { "alias": "aria-valuemin"; "required": false; }; "ariaValueNow": { "alias": "aria-valuenow"; "required": false; }; "ariaValueText": { "alias": "aria-valuetext"; "required": false; }; }, { "show": "show"; "dismiss": "dismiss"; "requestClose": "requestClose"; "orientationChange": "orientationChange"; "accessibilityAction": "accessibilityAction"; "accessibilityTap": "accessibilityTap"; "magicTap": "magicTap"; "accessibilityEscape": "accessibilityEscape"; }, never, ["*"], true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
|
|
@@ -152,17 +152,34 @@ export class Modal {
|
|
|
152
152
|
hostProps = computed(() => {
|
|
153
153
|
this.hostPropsRevision();
|
|
154
154
|
const descriptorProps = this.descriptor.props;
|
|
155
|
-
return {
|
|
155
|
+
return {
|
|
156
|
+
...descriptorProps,
|
|
157
|
+
style: [anchorHostStyle(this.elementRef), descriptorProps.style],
|
|
158
|
+
onAccessibilityAction: this.eventEmitterHandler(this.accessibilityAction),
|
|
159
|
+
onAccessibilityTap: this.eventEmitterHandler(this.accessibilityTap),
|
|
160
|
+
onMagicTap: this.eventEmitterHandler(this.magicTap),
|
|
161
|
+
onAccessibilityEscape: this.eventEmitterHandler(this.accessibilityEscape),
|
|
162
|
+
};
|
|
156
163
|
}, /* @ts-ignore */
|
|
157
164
|
...(ngDevMode ? [{ debugName: "hostProps" }] : /* istanbul ignore next */ []));
|
|
158
165
|
get containerStyle() {
|
|
159
166
|
const container = this.descriptor.children[0];
|
|
160
167
|
return typeof container === 'string' ? undefined : container.props.style;
|
|
161
168
|
}
|
|
169
|
+
// NOT private: `(orientationChange)="emit(...)"` in the template above calls it, and a template
|
|
170
|
+
// can only reach public members. `tsc` does not typecheck Angular templates, so `private` here
|
|
171
|
+
// compiles clean and fails only under `ngc --compilationMode partial`.
|
|
162
172
|
emit(emitter, event) {
|
|
163
173
|
if (isSymbioteEvent(event))
|
|
164
174
|
emitter.emit(event);
|
|
165
175
|
}
|
|
176
|
+
// The four accessibility events are boolean-GATED Fabric events
|
|
177
|
+
// (`.claude/rules/fabric-boolean-event-gates.md`) — `show`/`dismiss`/`requestClose`/
|
|
178
|
+
// `orientationChange` are NOT (Modal's own MODAL_EVENTS), so those stay unconditional template
|
|
179
|
+
// bindings above. `.observed`-gated, mirroring Pressable's.
|
|
180
|
+
eventEmitterHandler(emitter) {
|
|
181
|
+
return emitter.observed ? event => this.emit(emitter, event) : undefined;
|
|
182
|
+
}
|
|
166
183
|
// Typed as the a11y intersection WITH the string index (the bag renderModal spreads into the
|
|
167
184
|
// host props), so resolveAccessibilityProps's result stays assignable to passthrough.
|
|
168
185
|
accessibilityInputs() {
|
|
@@ -212,10 +229,6 @@ export class Modal {
|
|
|
212
229
|
(dismiss)="dismiss.emit()"
|
|
213
230
|
(requestClose)="requestClose.emit()"
|
|
214
231
|
(orientationChange)="emit(orientationChange, $event)"
|
|
215
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
216
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
217
|
-
(magicTap)="emit(magicTap, $event)"
|
|
218
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
219
232
|
>
|
|
220
233
|
<symbiote-view [style]="containerStyle" [collapsable]="false">
|
|
221
234
|
<ng-content></ng-content>
|
|
@@ -229,7 +242,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
229
242
|
args: [{
|
|
230
243
|
selector: 'Modal',
|
|
231
244
|
standalone: true,
|
|
232
|
-
hostDirectives: [
|
|
245
|
+
hostDirectives: [
|
|
246
|
+
{ directive: SymbioteStyleInputDirective, inputs: ['style'] },
|
|
247
|
+
],
|
|
233
248
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
234
249
|
imports: [ModalHost, ViewHost, SymbioteHostPropsDirective],
|
|
235
250
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
@@ -241,10 +256,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
241
256
|
(dismiss)="dismiss.emit()"
|
|
242
257
|
(requestClose)="requestClose.emit()"
|
|
243
258
|
(orientationChange)="emit(orientationChange, $event)"
|
|
244
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
245
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
246
|
-
(magicTap)="emit(magicTap, $event)"
|
|
247
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
248
259
|
>
|
|
249
260
|
<symbiote-view [style]="containerStyle" [collapsable]="false">
|
|
250
261
|
<ng-content></ng-content>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/modal/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,gGAAgG;AAChG,kGAAkG;AAClG,2GAA2G;AAC3G,8FAA8F;AAC9F,oGAAoG;AACpG,gGAAgG;AAChG,kGAAkG;AAClG,oEAAoE;AAEpE,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,GAKP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,iBAAiB,GAQlB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,IAAI,EACJ,eAAe,GAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,eAAe,EACf,SAAS,EACT,0BAA0B,EAC1B,2BAA2B,EAC3B,QAAQ,GACT,MAAM,kBAAkB,CAAC;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/modal/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { EventEmitter, type DoCheck, type OnChanges } from '@angular/core';
|
|
1
|
+
import { EventEmitter, type DoCheck, type OnChanges, type OnDestroy } from '@angular/core';
|
|
2
2
|
import { type IAccessibilityProps, type IAccessibilityStateValue, type IAriaProps, type IPressableAndroidRippleConfig, type IPressHandler, type IPressState, type IRectOffset } from '@symbiote-native/components';
|
|
3
3
|
import { type ISymbioteEvent, type IStyleProp, type IViewStyle } from '@symbiote-native/engine';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "../../primitives/shared";
|
|
6
|
-
export type { IPressState, IPressableAndroidRippleConfig } from '@symbiote-native/components';
|
|
6
|
+
export type { IPressState, IPressableAndroidRippleConfig, } from '@symbiote-native/components';
|
|
7
7
|
export interface IAngularPressableProps extends IAccessibilityProps, IAriaProps {
|
|
8
8
|
onPress?: IPressHandler;
|
|
9
9
|
onPressIn?: IPressHandler;
|
|
@@ -33,7 +33,7 @@ export interface IAngularPressableProps extends IAccessibilityProps, IAriaProps
|
|
|
33
33
|
style?: IStyleProp<IViewStyle> | ((state: IPressState) => IStyleProp<IViewStyle>);
|
|
34
34
|
}
|
|
35
35
|
export type IAngularPressableInputs = Omit<IAngularPressableProps, 'onPress' | 'onPressIn' | 'onPressOut' | 'onPressMove' | 'onLongPress' | 'onHoverIn' | 'onHoverOut' | 'onAccessibilityAction' | 'onAccessibilityTap' | 'onMagicTap' | 'onAccessibilityEscape'>;
|
|
36
|
-
export declare class Pressable implements IAngularPressableInputs, OnChanges, DoCheck {
|
|
36
|
+
export declare class Pressable implements IAngularPressableInputs, OnChanges, OnDestroy, DoCheck {
|
|
37
37
|
readonly press: EventEmitter<ISymbioteEvent>;
|
|
38
38
|
readonly pressIn: EventEmitter<ISymbioteEvent>;
|
|
39
39
|
readonly pressOut: EventEmitter<ISymbioteEvent>;
|
|
@@ -51,6 +51,8 @@ export declare class Pressable implements IAngularPressableInputs, OnChanges, Do
|
|
|
51
51
|
hitSlop?: IRectOffset;
|
|
52
52
|
pressRetentionOffset?: IRectOffset;
|
|
53
53
|
unstable_pressDelay?: number;
|
|
54
|
+
/** @internal Touchable* mirrors RN's Pressability minPressDuration: 0 override. */
|
|
55
|
+
__minPressDuration: number;
|
|
54
56
|
android_ripple?: IPressableAndroidRippleConfig;
|
|
55
57
|
android_disableSound?: boolean;
|
|
56
58
|
delayHoverIn?: number;
|
|
@@ -104,10 +106,12 @@ export declare class Pressable implements IAngularPressableInputs, OnChanges, Do
|
|
|
104
106
|
private readonly runtime;
|
|
105
107
|
private readonly host;
|
|
106
108
|
private readonly changeDetector;
|
|
109
|
+
private readonly gateDemand;
|
|
107
110
|
private readonly elementRef;
|
|
108
111
|
private readonly inputsRevision;
|
|
109
112
|
private readonly anchorStyle;
|
|
110
113
|
ngDoCheck(): void;
|
|
114
|
+
ngOnDestroy(): void;
|
|
111
115
|
ngOnChanges(): void;
|
|
112
116
|
get resolvedStyle(): IStyleProp<IViewStyle> | undefined;
|
|
113
117
|
get foldedAccessibility(): Partial<IAngularPressableProps>;
|
|
@@ -119,11 +123,12 @@ export declare class Pressable implements IAngularPressableInputs, OnChanges, Do
|
|
|
119
123
|
handleResponderMove(event: unknown): void;
|
|
120
124
|
claimResponder(): boolean;
|
|
121
125
|
allowTermination(): boolean;
|
|
122
|
-
emit
|
|
126
|
+
private emit;
|
|
123
127
|
private noteHoverNoop;
|
|
124
128
|
private emitterHandler;
|
|
129
|
+
private accessibilityEmitterHandler;
|
|
125
130
|
private get handlers();
|
|
126
131
|
private get hostNode();
|
|
127
132
|
static ɵfac: i0.ɵɵFactoryDeclaration<Pressable, never>;
|
|
128
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<Pressable, "Pressable
|
|
133
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Pressable, "Pressable", never, { "delayLongPress": { "alias": "delayLongPress"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "cancelable": { "alias": "cancelable"; "required": false; }; "hitSlop": { "alias": "hitSlop"; "required": false; }; "pressRetentionOffset": { "alias": "pressRetentionOffset"; "required": false; }; "unstable_pressDelay": { "alias": "unstable_pressDelay"; "required": false; }; "__minPressDuration": { "alias": "__minPressDuration"; "required": false; }; "android_ripple": { "alias": "android_ripple"; "required": false; }; "android_disableSound": { "alias": "android_disableSound"; "required": false; }; "delayHoverIn": { "alias": "delayHoverIn"; "required": false; }; "delayHoverOut": { "alias": "delayHoverOut"; "required": false; }; "testID": { "alias": "testID"; "required": false; }; "nativeID": { "alias": "nativeID"; "required": false; }; "hasTVPreferredFocus": { "alias": "hasTVPreferredFocus"; "required": false; }; "nextFocusDown": { "alias": "nextFocusDown"; "required": false; }; "nextFocusForward": { "alias": "nextFocusForward"; "required": false; }; "nextFocusLeft": { "alias": "nextFocusLeft"; "required": false; }; "nextFocusRight": { "alias": "nextFocusRight"; "required": false; }; "nextFocusUp": { "alias": "nextFocusUp"; "required": false; }; "style": { "alias": "style"; "required": false; }; "accessible": { "alias": "accessible"; "required": false; }; "accessibilityLabel": { "alias": "accessibilityLabel"; "required": false; }; "accessibilityHint": { "alias": "accessibilityHint"; "required": false; }; "accessibilityRole": { "alias": "accessibilityRole"; "required": false; }; "accessibilityState": { "alias": "accessibilityState"; "required": false; }; "accessibilityValue": { "alias": "accessibilityValue"; "required": false; }; "accessibilityActions": { "alias": "accessibilityActions"; "required": false; }; "accessibilityLabelledBy": { "alias": "accessibilityLabelledBy"; "required": false; }; "importantForAccessibility": { "alias": "importantForAccessibility"; "required": false; }; "accessibilityLiveRegion": { "alias": "accessibilityLiveRegion"; "required": false; }; "screenReaderFocusable": { "alias": "screenReaderFocusable"; "required": false; }; "accessibilityViewIsModal": { "alias": "accessibilityViewIsModal"; "required": false; }; "accessibilityElementsHidden": { "alias": "accessibilityElementsHidden"; "required": false; }; "accessibilityIgnoresInvertColors": { "alias": "accessibilityIgnoresInvertColors"; "required": false; }; "accessibilityLanguage": { "alias": "accessibilityLanguage"; "required": false; }; "accessibilityRespondsToUserInteraction": { "alias": "accessibilityRespondsToUserInteraction"; "required": false; }; "accessibilityShowsLargeContentViewer": { "alias": "accessibilityShowsLargeContentViewer"; "required": false; }; "accessibilityLargeContentTitle": { "alias": "accessibilityLargeContentTitle"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaBusy": { "alias": "ariaBusy"; "required": false; }; "ariaChecked": { "alias": "ariaChecked"; "required": false; }; "ariaDisabled": { "alias": "ariaDisabled"; "required": false; }; "ariaExpanded": { "alias": "ariaExpanded"; "required": false; }; "ariaHidden": { "alias": "ariaHidden"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaLive": { "alias": "ariaLive"; "required": false; }; "ariaSelected": { "alias": "ariaSelected"; "required": false; }; "ariaModal": { "alias": "ariaModal"; "required": false; }; "ariaValueMax": { "alias": "ariaValueMax"; "required": false; }; "ariaValueMin": { "alias": "ariaValueMin"; "required": false; }; "ariaValueNow": { "alias": "ariaValueNow"; "required": false; }; "ariaValueText": { "alias": "ariaValueText"; "required": false; }; "id": { "alias": "id"; "required": false; }; "role": { "alias": "role"; "required": false; }; }, { "press": "press"; "pressIn": "pressIn"; "pressOut": "pressOut"; "pressMove": "pressMove"; "longPress": "longPress"; "hoverIn": "hoverIn"; "hoverOut": "hoverOut"; "accessibilityAction": "accessibilityAction"; "accessibilityTap": "accessibilityTap"; "magicTap": "magicTap"; "accessibilityEscape": "accessibilityEscape"; }, never, ["*"], true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
|
|
129
134
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, computed, inject, Input, Output, signal, ViewChild, } from '@angular/core';
|
|
2
|
-
import { createPressHandlers, createPressRuntime, DEFAULT_DELAY_LONG_PRESS_MS, isTerminationAllowed, resolveAccessibilityProps, resolveDisabledAccessibilityState, rippleProps, shouldClaimResponder, shouldSuppressPress, } from '@symbiote-native/components';
|
|
2
|
+
import { createPressHandlers, createPressRuntime, disposePressRuntime, DEFAULT_DELAY_LONG_PRESS_MS, DEFAULT_MIN_PRESS_DURATION_MS, isTerminationAllowed, resolveAccessibilityProps, resolveDisabledAccessibilityState, rippleProps, shouldClaimResponder, shouldSuppressPress, } from '@symbiote-native/components';
|
|
3
3
|
import { dlog, isSymbioteNode, measure, } from '@symbiote-native/engine';
|
|
4
4
|
import { anchorHostStyle, SymbioteHostPropsDirective, SymbioteStyleInputDirective, ViewHost, } from '../../primitives';
|
|
5
|
+
import { gateWanted, injectGateDemand, } from '../../gate-demand';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "../../primitives/shared";
|
|
7
8
|
function isStyleFn(value) {
|
|
@@ -25,9 +26,15 @@ export class Pressable {
|
|
|
25
26
|
longPress = new EventEmitter();
|
|
26
27
|
hoverIn = new EventEmitter();
|
|
27
28
|
hoverOut = new EventEmitter();
|
|
28
|
-
// The four accessibility callbacks as real Angular events
|
|
29
|
-
//
|
|
30
|
-
// `
|
|
29
|
+
// The four accessibility callbacks as real Angular events, app-facing. UNLIKE press/hover above,
|
|
30
|
+
// these are NOT bound in the template at all — `accessibilityAction`/`accessibilityTap`/
|
|
31
|
+
// `magicTap`/`accessibilityEscape` are `onX`-gated Fabric events
|
|
32
|
+
// (`.claude/rules/fabric-boolean-event-gates.md`): the engine only emits them when the committed
|
|
33
|
+
// payload carries a FUNCTION at that key, so a `(accessibilityAction)="..."` template binding —
|
|
34
|
+
// always present once written — would light the gate on every instance regardless of whether the
|
|
35
|
+
// app ever subscribes. Routed through `hostProps()` instead (`accessibilityEmitterHandler`
|
|
36
|
+
// below), the same `.observed`-conditional shape `emitterHandler` already uses for press/hover,
|
|
37
|
+
// so the gate lights only when something is actually listening.
|
|
31
38
|
accessibilityAction = new EventEmitter();
|
|
32
39
|
accessibilityTap = new EventEmitter();
|
|
33
40
|
magicTap = new EventEmitter();
|
|
@@ -38,6 +45,8 @@ export class Pressable {
|
|
|
38
45
|
hitSlop;
|
|
39
46
|
pressRetentionOffset;
|
|
40
47
|
unstable_pressDelay;
|
|
48
|
+
/** @internal Touchable* mirrors RN's Pressability minPressDuration: 0 override. */
|
|
49
|
+
__minPressDuration = DEFAULT_MIN_PRESS_DURATION_MS;
|
|
41
50
|
android_ripple;
|
|
42
51
|
android_disableSound;
|
|
43
52
|
delayHoverIn;
|
|
@@ -111,8 +120,13 @@ export class Pressable {
|
|
|
111
120
|
const id = setTimeout(callback, ms);
|
|
112
121
|
return () => clearTimeout(id);
|
|
113
122
|
},
|
|
123
|
+
now: Date.now,
|
|
114
124
|
};
|
|
115
125
|
changeDetector = inject(ChangeDetectorRef);
|
|
126
|
+
// Null unless an adapter wrapper renders this Pressable in its own template. See
|
|
127
|
+
// `gate-demand.ts`; an app's own `<Pressable>` — including one projected INTO a wrapper — gets
|
|
128
|
+
// null and falls back to its own `.observed`.
|
|
129
|
+
gateDemand = injectGateDemand();
|
|
116
130
|
// This component's OWN host - the non-painting anchor `class="..."` at the use site resolves
|
|
117
131
|
// onto (see anchorHostStyle's doc comment) - NOT `hostElement` above, which targets the real
|
|
118
132
|
// inner `symbiote-view` one level down.
|
|
@@ -142,6 +156,9 @@ export class Pressable {
|
|
|
142
156
|
ngDoCheck() {
|
|
143
157
|
this.anchorStyle.set(anchorHostStyle(this.elementRef));
|
|
144
158
|
}
|
|
159
|
+
ngOnDestroy() {
|
|
160
|
+
disposePressRuntime(this.runtime);
|
|
161
|
+
}
|
|
145
162
|
ngOnChanges() {
|
|
146
163
|
// Tells the computed bag below that an @Input moved - plain class fields are not reactive on
|
|
147
164
|
// their own. Must stay in ngOnChanges: that is the single moment Angular has finished writing
|
|
@@ -190,7 +207,9 @@ export class Pressable {
|
|
|
190
207
|
});
|
|
191
208
|
}
|
|
192
209
|
get resolvedRippleProps() {
|
|
193
|
-
return this.android_ripple === undefined
|
|
210
|
+
return this.android_ripple === undefined
|
|
211
|
+
? undefined
|
|
212
|
+
: rippleProps(this.android_ripple);
|
|
194
213
|
}
|
|
195
214
|
// Flat bag for `[symbioteHostProps]` (Renderer2.setProperty per key) - see primitives/shared.ts.
|
|
196
215
|
//
|
|
@@ -213,6 +232,10 @@ export class Pressable {
|
|
|
213
232
|
style: [this.anchorStyle(), this.resolvedStyle],
|
|
214
233
|
accessible: this.accessible,
|
|
215
234
|
...this.foldedAccessibility,
|
|
235
|
+
onAccessibilityAction: this.accessibilityEmitterHandler('accessibilityAction'),
|
|
236
|
+
onAccessibilityTap: this.accessibilityEmitterHandler('accessibilityTap'),
|
|
237
|
+
onMagicTap: this.accessibilityEmitterHandler('magicTap'),
|
|
238
|
+
onAccessibilityEscape: this.accessibilityEmitterHandler('accessibilityEscape'),
|
|
216
239
|
android_disableSound: this.android_disableSound,
|
|
217
240
|
nativeBackgroundAndroid: this.resolvedRippleProps?.nativeBackgroundAndroid,
|
|
218
241
|
nativeForegroundAndroid: this.resolvedRippleProps?.nativeForegroundAndroid,
|
|
@@ -267,6 +290,20 @@ export class Pressable {
|
|
|
267
290
|
emitterHandler(emitter) {
|
|
268
291
|
return emitter.observed ? event => emitter.emit(event) : undefined;
|
|
269
292
|
}
|
|
293
|
+
// The accessibility twin of emitterHandler, feeding hostProps()'s flat bag instead of
|
|
294
|
+
// createPressHandlers' config — see the accessibilityAction @Output()'s own comment for why
|
|
295
|
+
// these four specifically cannot be plain template `(x)="..."` bindings. `undefined` here means
|
|
296
|
+
// `setEventListener` never sees a function, so the gated prop's flag never lights
|
|
297
|
+
// (`fabric-boolean-event-gates.md`, "The flag follows the VALUE, not the key").
|
|
298
|
+
accessibilityEmitterHandler(name) {
|
|
299
|
+
const emitter = this[name];
|
|
300
|
+
// A WRAPPER's binding is not a subscriber, and `.observed` cannot tell the two apart. When a
|
|
301
|
+
// demand is supplied from above it decides instead — see `gate-demand.ts` for why the channel
|
|
302
|
+
// is DI rather than an `@Input`.
|
|
303
|
+
return gateWanted(this.gateDemand, name, emitter)
|
|
304
|
+
? event => this.emit(emitter, event)
|
|
305
|
+
: undefined;
|
|
306
|
+
}
|
|
270
307
|
get handlers() {
|
|
271
308
|
this.noteHoverNoop();
|
|
272
309
|
const config = {
|
|
@@ -277,6 +314,7 @@ export class Pressable {
|
|
|
277
314
|
onLongPress: this.emitterHandler(this.longPress),
|
|
278
315
|
delayLongPress: this.delayLongPress ?? DEFAULT_DELAY_LONG_PRESS_MS,
|
|
279
316
|
unstable_pressDelay: this.unstable_pressDelay ?? 0,
|
|
317
|
+
minPressDuration: this.__minPressDuration,
|
|
280
318
|
hitSlop: this.hitSlop,
|
|
281
319
|
pressRetentionOffset: this.pressRetentionOffset,
|
|
282
320
|
};
|
|
@@ -287,14 +325,10 @@ export class Pressable {
|
|
|
287
325
|
return isSymbioteNode(native) ? native : undefined;
|
|
288
326
|
}
|
|
289
327
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: Pressable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
290
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: Pressable, isStandalone: true, selector: "Pressable
|
|
328
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: Pressable, isStandalone: true, selector: "Pressable", inputs: { delayLongPress: "delayLongPress", disabled: "disabled", cancelable: "cancelable", hitSlop: "hitSlop", pressRetentionOffset: "pressRetentionOffset", unstable_pressDelay: "unstable_pressDelay", __minPressDuration: "__minPressDuration", android_ripple: "android_ripple", android_disableSound: "android_disableSound", delayHoverIn: "delayHoverIn", delayHoverOut: "delayHoverOut", testID: "testID", nativeID: "nativeID", hasTVPreferredFocus: "hasTVPreferredFocus", nextFocusDown: "nextFocusDown", nextFocusForward: "nextFocusForward", nextFocusLeft: "nextFocusLeft", nextFocusRight: "nextFocusRight", nextFocusUp: "nextFocusUp", style: "style", 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", ariaLabel: "ariaLabel", ariaBusy: "ariaBusy", ariaChecked: "ariaChecked", ariaDisabled: "ariaDisabled", ariaExpanded: "ariaExpanded", ariaHidden: "ariaHidden", ariaLabelledBy: "ariaLabelledBy", ariaLive: "ariaLive", ariaSelected: "ariaSelected", ariaModal: "ariaModal", ariaValueMax: "ariaValueMax", ariaValueMin: "ariaValueMin", ariaValueNow: "ariaValueNow", ariaValueText: "ariaValueText", id: "id", role: "role" }, outputs: { press: "press", pressIn: "pressIn", pressOut: "pressOut", pressMove: "pressMove", longPress: "longPress", hoverIn: "hoverIn", hoverOut: "hoverOut", accessibilityAction: "accessibilityAction", accessibilityTap: "accessibilityTap", magicTap: "magicTap", accessibilityEscape: "accessibilityEscape" }, viewQueries: [{ propertyName: "hostElement", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, hostDirectives: [{ directive: i1.SymbioteStyleInputDirective, inputs: ["style", "style"] }], ngImport: i0, template: `
|
|
291
329
|
<symbiote-view
|
|
292
330
|
#host
|
|
293
331
|
[symbioteHostProps]="hostProps()"
|
|
294
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
295
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
296
|
-
(magicTap)="emit(magicTap, $event)"
|
|
297
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
298
332
|
(press)="handlePress($event)"
|
|
299
333
|
(pressIn)="handlePressIn($event)"
|
|
300
334
|
(pressOut)="handlePressOut($event)"
|
|
@@ -309,19 +343,28 @@ export class Pressable {
|
|
|
309
343
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: Pressable, decorators: [{
|
|
310
344
|
type: Component,
|
|
311
345
|
args: [{
|
|
312
|
-
selector
|
|
346
|
+
// Single-name selector, matching TextInput's own ('TextInput', text-input.ts) rather than
|
|
347
|
+
// View/Text's dual one. The alternate `symbiote-pressable` spelling was vestigial — nothing in
|
|
348
|
+
// this component's own template ever renders that tag (it renders `symbiote-view`, below), and
|
|
349
|
+
// no app or example code invokes the composed component by that literal tag (verified by grep,
|
|
350
|
+
// 2026-08-31). Its only effect was to force `symbiote-pressable` into
|
|
351
|
+
// `ANCHOR_HOST_COMPONENTS` unconditionally, which collided with the tag's OTHER, load-bearing
|
|
352
|
+
// meaning — the host-behavior registry key (`PRESSABLE_TAG`,
|
|
353
|
+
// core/components/src/behaviors/pressable.ts) a lowered `<Pressable>` must carry to get the
|
|
354
|
+
// press machine. That collision is exactly why `DIAGNOSTIC_LOWERED_PRESSABLE_TAG` existed
|
|
355
|
+
// (renderer/index.ts) — dropping the vestigial spelling here removes the collision at its
|
|
356
|
+
// source, so the escape hatch is retired rather than worked around.
|
|
357
|
+
selector: 'Pressable',
|
|
313
358
|
standalone: true,
|
|
314
|
-
hostDirectives: [
|
|
359
|
+
hostDirectives: [
|
|
360
|
+
{ directive: SymbioteStyleInputDirective, inputs: ['style'] },
|
|
361
|
+
],
|
|
315
362
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
316
363
|
imports: [ViewHost, SymbioteHostPropsDirective],
|
|
317
364
|
template: `
|
|
318
365
|
<symbiote-view
|
|
319
366
|
#host
|
|
320
367
|
[symbioteHostProps]="hostProps()"
|
|
321
|
-
(accessibilityAction)="emit(accessibilityAction, $event)"
|
|
322
|
-
(accessibilityTap)="emit(accessibilityTap, $event)"
|
|
323
|
-
(magicTap)="emit(magicTap, $event)"
|
|
324
|
-
(accessibilityEscape)="emit(accessibilityEscape, $event)"
|
|
325
368
|
(press)="handlePress($event)"
|
|
326
369
|
(pressIn)="handlePressIn($event)"
|
|
327
370
|
(pressOut)="handlePressOut($event)"
|
|
@@ -368,6 +411,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
368
411
|
type: Input
|
|
369
412
|
}], unstable_pressDelay: [{
|
|
370
413
|
type: Input
|
|
414
|
+
}], __minPressDuration: [{
|
|
415
|
+
type: Input
|
|
371
416
|
}], android_ripple: [{
|
|
372
417
|
type: Input
|
|
373
418
|
}], android_disableSound: [{
|