@symbiote-native/angular 0.6.2 → 0.8.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/bin/symbiote-angular-dev.cjs +20 -19
- package/build/angular/anchor-host-registry.js +2 -2
- 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.d.ts +2 -1
- package/build/angular/components/activity-indicator/index.android.js +12 -4
- package/build/angular/components/activity-indicator/index.android.js.map +1 -1
- package/build/angular/components/activity-indicator/index.ios.d.ts +2 -1
- package/build/angular/components/activity-indicator/index.ios.js +8 -3
- 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 +4 -4
- package/build/angular/components/activity-indicator/shared.js.map +1 -1
- package/build/angular/components/button.d.ts +4 -2
- package/build/angular/components/button.js +41 -22
- package/build/angular/components/button.js.map +1 -1
- package/build/angular/components/flat-list/index.d.ts +6 -4
- package/build/angular/components/flat-list/index.js +80 -50
- package/build/angular/components/flat-list/index.js.map +1 -1
- package/build/angular/components/image/index.android.d.ts +8 -3
- package/build/angular/components/image/index.android.js +42 -10
- package/build/angular/components/image/index.android.js.map +1 -1
- package/build/angular/components/image/index.ios.d.ts +8 -3
- package/build/angular/components/image/index.ios.js +42 -10
- package/build/angular/components/image/index.ios.js.map +1 -1
- package/build/angular/components/image/shared.d.ts +4 -1
- package/build/angular/components/image/shared.js +51 -8
- package/build/angular/components/image/shared.js.map +1 -1
- package/build/angular/components/image-background.d.ts +2 -1
- package/build/angular/components/image-background.js +26 -10
- package/build/angular/components/image-background.js.map +1 -1
- package/build/angular/components/input-accessory-view/index.d.ts +9 -4
- package/build/angular/components/input-accessory-view/index.js +49 -10
- 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 +44 -12
- package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
- package/build/angular/components/modal/index.d.ts +11 -8
- package/build/angular/components/modal/index.js +51 -29
- package/build/angular/components/modal/index.js.map +1 -1
- package/build/angular/components/pressable/index.d.ts +12 -6
- package/build/angular/components/pressable/index.js +66 -13
- package/build/angular/components/pressable/index.js.map +1 -1
- package/build/angular/components/refresh-control/index.d.ts +8 -4
- package/build/angular/components/refresh-control/index.js +54 -16
- package/build/angular/components/refresh-control/index.js.map +1 -1
- package/build/angular/components/safe-area-view/index.d.ts +9 -4
- package/build/angular/components/safe-area-view/index.js +48 -9
- package/build/angular/components/safe-area-view/index.js.map +1 -1
- package/build/angular/components/scroll-view/index.android.d.ts +2 -3
- package/build/angular/components/scroll-view/index.android.js +88 -61
- package/build/angular/components/scroll-view/index.android.js.map +1 -1
- package/build/angular/components/scroll-view/index.ios.d.ts +2 -3
- package/build/angular/components/scroll-view/index.ios.js +24 -18
- package/build/angular/components/scroll-view/index.ios.js.map +1 -1
- package/build/angular/components/scroll-view/projection.d.ts +35 -0
- package/build/angular/components/scroll-view/projection.js +279 -53
- package/build/angular/components/scroll-view/projection.js.map +1 -1
- package/build/angular/components/scroll-view/shared.d.ts +14 -5
- package/build/angular/components/scroll-view/shared.js +225 -75
- package/build/angular/components/scroll-view/shared.js.map +1 -1
- package/build/angular/components/scroll-view/sticky-header.js +21 -22
- package/build/angular/components/scroll-view/sticky-header.js.map +1 -1
- package/build/angular/components/section-list/index.d.ts +7 -1
- package/build/angular/components/section-list/index.js +91 -54
- package/build/angular/components/section-list/index.js.map +1 -1
- package/build/angular/components/switch/index.android.d.ts +7 -3
- package/build/angular/components/switch/index.android.js +52 -10
- package/build/angular/components/switch/index.android.js.map +1 -1
- package/build/angular/components/switch/index.ios.d.ts +7 -3
- package/build/angular/components/switch/index.ios.js +52 -10
- package/build/angular/components/switch/index.ios.js.map +1 -1
- package/build/angular/components/switch/shared.d.ts +13 -4
- package/build/angular/components/switch/shared.js +71 -7
- package/build/angular/components/switch/shared.js.map +1 -1
- package/build/angular/components/text-input.d.ts +11 -3
- package/build/angular/components/text-input.js +68 -8
- package/build/angular/components/text-input.js.map +1 -1
- package/build/angular/components/touchable/index.d.ts +40 -9
- package/build/angular/components/touchable/index.js +303 -67
- package/build/angular/components/touchable/index.js.map +1 -1
- package/build/angular/components/touchable-native-feedback/index.d.ts +6 -3
- package/build/angular/components/touchable-native-feedback/index.js +63 -27
- package/build/angular/components/touchable-native-feedback/index.js.map +1 -1
- package/build/angular/components/virtualized-list/directives.js +22 -18
- package/build/angular/components/virtualized-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-list/index.d.ts +15 -4
- package/build/angular/components/virtualized-list/index.js +326 -94
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/directives.js +12 -12
- package/build/angular/components/virtualized-section-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.d.ts +19 -1
- package/build/angular/components/virtualized-section-list/index.js +93 -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 +5 -0
- package/build/angular/components.js.map +1 -1
- package/build/angular/create-portal/index.js +34 -36
- package/build/angular/create-portal/index.js.map +1 -1
- package/build/angular/create-tunnel/index.js +19 -22
- package/build/angular/create-tunnel/index.js.map +1 -1
- package/build/angular/descriptor-to-angular/index.js +6 -4
- 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/host-instance/index.js +1 -1
- package/build/angular/host-instance/index.js.map +1 -1
- package/build/angular/index.d.ts +9 -4
- package/build/angular/index.js +17 -3
- package/build/angular/index.js.map +1 -1
- package/build/angular/modules/animated/animated-leaf-binder.d.ts +1 -7
- package/build/angular/modules/animated/animated-leaf-binder.js +22 -72
- package/build/angular/modules/animated/animated-leaf-binder.js.map +1 -1
- package/build/angular/modules/animated/create-animated-component.d.ts +11 -6
- package/build/angular/modules/animated/create-animated-component.js +106 -55
- package/build/angular/modules/animated/create-animated-component.js.map +1 -1
- package/build/angular/modules/status-bar/index.js +4 -4
- package/build/angular/modules/status-bar/index.js.map +1 -1
- package/build/angular/primitives/index.d.ts +20 -3
- package/build/angular/primitives/index.js +84 -48
- package/build/angular/primitives/index.js.map +1 -1
- package/build/angular/primitives/shared.d.ts +48 -2
- package/build/angular/primitives/shared.js +158 -11
- package/build/angular/primitives/shared.js.map +1 -1
- package/build/angular/render/index.js +69 -38
- package/build/angular/render/index.js.map +1 -1
- package/build/angular/renderer/index.d.ts +1 -0
- package/build/angular/renderer/index.js +37 -2
- package/build/angular/renderer/index.js.map +1 -1
- package/build/angular/services/color-scheme.service.js +3 -3
- package/build/angular/services/color-scheme.service.js.map +1 -1
- package/build/angular/services/window-dimensions.service.js +4 -4
- package/build/angular/services/window-dimensions.service.js.map +1 -1
- package/package.json +10 -8
- package/src/anchor-host-registry.ts +2 -2
- package/src/bootstrap.ts +4 -1
- package/src/components/activity-indicator/index.android.ts +8 -1
- package/src/components/activity-indicator/index.ios.ts +4 -0
- package/src/components/activity-indicator/shared.ts +32 -13
- package/src/components/button.ts +46 -19
- package/src/components/flat-list/index.ts +122 -62
- package/src/components/image/index.android.ts +58 -7
- package/src/components/image/index.ios.ts +58 -7
- package/src/components/image/shared.ts +92 -21
- package/src/components/image-background.ts +29 -9
- package/src/components/input-accessory-view/index.ts +67 -12
- package/src/components/keyboard-avoiding-view/index.ts +61 -15
- package/src/components/modal/index.ts +72 -33
- package/src/components/pressable/index.ts +117 -28
- package/src/components/refresh-control/index.ts +74 -18
- package/src/components/safe-area-view/index.ts +64 -10
- package/src/components/scroll-view/index.android.ts +62 -47
- package/src/components/scroll-view/index.ios.ts +19 -17
- package/src/components/scroll-view/projection.ts +363 -64
- package/src/components/scroll-view/shared.ts +312 -90
- package/src/components/scroll-view/sticky-header.ts +36 -24
- package/src/components/section-list/index.ts +86 -53
- package/src/components/switch/index.android.ts +60 -8
- package/src/components/switch/index.ios.ts +60 -8
- package/src/components/switch/shared.ts +93 -6
- package/src/components/text-input.ts +95 -13
- package/src/components/touchable/index.ts +348 -64
- package/src/components/touchable-native-feedback/index.ts +94 -31
- package/src/components/virtualized-list/directives.ts +19 -5
- package/src/components/virtualized-list/index.ts +380 -85
- package/src/components/virtualized-section-list/directives.ts +6 -3
- package/src/components/virtualized-section-list/index.ts +146 -33
- package/src/components.ts +9 -1
- package/src/create-portal/index.ts +31 -31
- package/src/create-tunnel/index.ts +16 -17
- package/src/descriptor-to-angular/index.ts +29 -8
- package/src/diagnostics.ts +138 -0
- package/src/host-instance/index.ts +9 -3
- package/src/index.ts +61 -3
- package/src/modules/animated/animated-leaf-binder.ts +28 -77
- package/src/modules/animated/create-animated-component.ts +115 -47
- package/src/modules/app-registry/index.ts +9 -9
- package/src/modules/status-bar/index.ts +13 -4
- package/src/primitives/index.ts +47 -2
- package/src/primitives/shared.ts +170 -10
- package/src/render/index.ts +77 -39
- package/src/renderer/index.ts +76 -14
- package/src/services/color-scheme.service.ts +3 -1
- package/src/services/window-dimensions.service.ts +11 -4
- package/build/angular/modules/animated/animated-leaf-binder/index.d.ts +0 -14
- package/build/angular/modules/animated/animated-leaf-binder/index.js +0 -91
- package/build/angular/modules/animated/animated-leaf-binder/index.js.map +0 -1
- package/src/modules/animated/animated-leaf-binder/index.ts +0 -101
|
@@ -24,6 +24,11 @@ export { VirtualizedSectionList, VSectionFooterDirective, VSectionHeaderDirectiv
|
|
|
24
24
|
export { SectionList } from './components/section-list';
|
|
25
25
|
// Re-export primitive hosts so composed components can import them from the public barrel too.
|
|
26
26
|
export { ViewHost, ViewHost as View, TextHost, TextHost as Text, ImageHost, ScrollViewHost, ScrollContentView, HorizontalScrollView, HorizontalScrollContentView, TextInputHost, MultilineTextInputHost, SwitchHost, ActivityIndicatorHost, SafeAreaViewHost, ModalHost, RefreshControlHost, InputAccessoryViewHost, SymbioteHostPropsDirective,
|
|
27
|
+
// Public even though no app names it: it rides `hostDirectives` on every component declaring a
|
|
28
|
+
// `style` input, so ngtsc writes it into their public type metadata and a consuming app's AOT
|
|
29
|
+
// build fails with NG3004 without it. Invisible to tsc and vitest; only a consumer's ngc catches
|
|
30
|
+
// it.
|
|
31
|
+
SymbioteStyleInputDirective,
|
|
27
32
|
// Exported so an OUT-OF-PACKAGE composed component (e.g. @symbiote-native/slider's Angular wrapper,
|
|
28
33
|
// itself listed in ANCHOR_HOST_COMPONENTS) can merge its own anchor host's class-derived style
|
|
29
34
|
// the same way every in-package composed component does — see anchorHostStyle's doc comment.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,kFAAkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAgB3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AASpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAOjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAM9E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAcvC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,kFAAkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAgB3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AASpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAOjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAM9E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAcvC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,+FAA+F;AAC/F,OAAO,EACL,QAAQ,EACR,QAAQ,IAAI,IAAI,EAChB,QAAQ,EACR,QAAQ,IAAI,IAAI,EAChB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B;AAC1B,+FAA+F;AAC/F,8FAA8F;AAC9F,iGAAiG;AACjG,MAAM;AACN,2BAA2B;AAC3B,oGAAoG;AACpG,+FAA+F;AAC/F,6FAA6F;AAC7F,eAAe;AACf,4FAA4F;AAC5F,0FAA0F;AAC1F,oDAAoD;AACpD,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,sFAAsF;AACtF,wFAAwF;AACxF,4CAA4C"}
|
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
// createPortal for @symbiote-native/angular — the Angular twin of the React/Vue same-surface portal
|
|
2
|
-
// (create-portal.ts / Teleport in runtime-helpers.ts). Scope is identical: the target must be
|
|
3
|
-
//
|
|
4
|
-
// across independently-mounted surfaces has no safe host-level primitive
|
|
5
|
-
//
|
|
2
|
+
// (create-portal.ts / Teleport in runtime-helpers.ts). Scope is identical: the target must be an
|
|
3
|
+
// already-mounted location WITHIN THE SAME SURFACE as the portal's call site — moving content
|
|
4
|
+
// across independently-mounted surfaces has no safe host-level primitive, so createTunnel
|
|
5
|
+
// (create-tunnel.ts) covers that cross-surface case instead.
|
|
6
6
|
//
|
|
7
|
-
// React/Vue implement this as a thin validating wrapper around a mechanism the
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// point), not from wherever a node was manually moved to afterwards, so a raw Renderer2 move
|
|
15
|
-
// would desync Angular's internals from the retained tree.
|
|
7
|
+
// React/Vue implement this as a thin validating wrapper around a mechanism the framework itself
|
|
8
|
+
// already has (react-reconciler's Fiber-level HostPortal, Vue's own <Teleport>). Angular has no
|
|
9
|
+
// such built-in (no `@angular/cdk` dependency here, core-only — see package.json), and physically
|
|
10
|
+
// moving an EmbeddedView's already-created root nodes via Renderer2 after the fact is NOT safe —
|
|
11
|
+
// Angular's own view-destroy path removes a view's nodes from wherever ITS OWN bookkeeping thinks
|
|
12
|
+
// they live, not from wherever a node was manually moved to, so a raw Renderer2 move would desync
|
|
13
|
+
// Angular's internals from the retained tree.
|
|
16
14
|
//
|
|
17
|
-
// PortalDirective is a STRUCTURAL directive (`*portal="overlayHost"`), not a component
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// injects that template's own TemplateRef into the directive automatically.
|
|
15
|
+
// PortalDirective is a STRUCTURAL directive (`*portal="overlayHost"`), not a component taking a
|
|
16
|
+
// separate `<ng-template>` + `[content]` binding — that two-step reads as foreign next to
|
|
17
|
+
// `*ngIf`/`*ngFor`/`*ngTemplateOutlet`. `*portal="x"` desugars the same way `*ngIf` does: Angular
|
|
18
|
+
// wraps the host element in an `<ng-template>` and injects that template's own TemplateRef into
|
|
19
|
+
// the directive automatically.
|
|
23
20
|
//
|
|
24
21
|
// The safe, fully-public-API mechanism: create the embedded view DIRECTLY inside a
|
|
25
22
|
// ViewContainerRef anchored at the destination, so there is nothing to move at all. That
|
|
26
|
-
// ViewContainerRef
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
// `
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// one is Angular's own template compiler resolving a template reference variable, so
|
|
34
|
-
// `strictTemplates` rejects anything else at compile time and there is nothing left to guard
|
|
35
|
-
// against at runtime.
|
|
23
|
+
// ViewContainerRef comes from `PortalOutletDirective`, a marker placed on the target host
|
|
24
|
+
// (`<View portalOutlet #overlayHost="portalOutlet">`) purely to expose its ViewContainerRef, the
|
|
25
|
+
// same export-as-template-variable idiom `#form="ngForm"` uses. This also replaces the
|
|
26
|
+
// `isSymbioteNode` runtime guard React/Vue need (there `to` is an arbitrary JS value until
|
|
27
|
+
// validated): here `to` is typed as `PortalOutletDirective` — the only way to construct one is
|
|
28
|
+
// Angular's own template compiler resolving a template reference variable, so `strictTemplates`
|
|
29
|
+
// rejects anything else at compile time and there is nothing left to guard at runtime.
|
|
36
30
|
import { Directive, inject, Input, TemplateRef, ViewContainerRef, } from '@angular/core';
|
|
37
31
|
import * as i0 from "@angular/core";
|
|
38
32
|
/** Marks the destination for `*portal` — place it on whichever already-mounted host should
|
|
@@ -40,12 +34,16 @@ import * as i0 from "@angular/core";
|
|
|
40
34
|
* export it to a template variable and pass that variable as `*portal`'s target. */
|
|
41
35
|
export class PortalOutletDirective {
|
|
42
36
|
viewContainerRef = inject(ViewContainerRef);
|
|
43
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
44
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PortalOutletDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
38
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PortalOutletDirective, isStandalone: true, selector: "[portalOutlet]", exportAs: ["portalOutlet"], ngImport: i0 });
|
|
45
39
|
}
|
|
46
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PortalOutletDirective, decorators: [{
|
|
47
41
|
type: Directive,
|
|
48
|
-
args: [{
|
|
42
|
+
args: [{
|
|
43
|
+
selector: '[portalOutlet]',
|
|
44
|
+
standalone: true,
|
|
45
|
+
exportAs: 'portalOutlet',
|
|
46
|
+
}]
|
|
49
47
|
}] });
|
|
50
48
|
/** `*portal="overlayHost"` — renders the host element into whichever `PortalOutletDirective`
|
|
51
49
|
* `overlayHost` refers to, same surface only (see the file header). Combine with `@if` for
|
|
@@ -61,10 +59,10 @@ export class PortalDirective {
|
|
|
61
59
|
ngOnDestroy() {
|
|
62
60
|
this.viewRef?.destroy();
|
|
63
61
|
}
|
|
64
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
65
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.
|
|
62
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PortalDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
63
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PortalDirective, isStandalone: true, selector: "[portal]", inputs: { portal: "portal" }, usesOnChanges: true, ngImport: i0 });
|
|
66
64
|
}
|
|
67
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PortalDirective, decorators: [{
|
|
68
66
|
type: Directive,
|
|
69
67
|
args: [{ selector: '[portal]', standalone: true }]
|
|
70
68
|
}], propDecorators: { portal: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/create-portal/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/create-portal/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,iGAAiG;AACjG,8FAA8F;AAC9F,0FAA0F;AAC1F,6DAA6D;AAC7D,EAAE;AACF,gGAAgG;AAChG,gGAAgG;AAChG,kGAAkG;AAClG,iGAAiG;AACjG,kGAAkG;AAClG,kGAAkG;AAClG,8CAA8C;AAC9C,EAAE;AACF,gGAAgG;AAChG,0FAA0F;AAC1F,kGAAkG;AAClG,gGAAgG;AAChG,+BAA+B;AAC/B,EAAE;AACF,mFAAmF;AACnF,yFAAyF;AACzF,0FAA0F;AAC1F,iGAAiG;AACjG,uFAAuF;AACvF,2FAA2F;AAC3F,+FAA+F;AAC/F,gGAAgG;AAChG,uFAAuF;AAEvF,OAAO,EACL,SAAS,EACT,MAAM,EACN,KAAK,EACL,WAAW,EACX,gBAAgB,GAIjB,MAAM,eAAe,CAAC;;AAEvB;;qFAEqF;AAMrF,MAAM,OAAO,qBAAqB;IACvB,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;uGAD1C,qBAAqB;2FAArB,qBAAqB;;2FAArB,qBAAqB;kBALjC,SAAS;mBAAC;oBACT,QAAQ,EAAE,gBAAgB;oBAC1B,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,cAAc;iBACzB;;AAKD;;oDAEoD;AAEpD,MAAM,OAAO,eAAe;IACC,MAAM,CAAyB;IAEzC,WAAW,GAAG,MAAM,CAAuB,WAAW,CAAC,CAAC;IACjE,OAAO,GAAoC,IAAI,CAAC;IAExD,WAAW;QACT,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAC5D,IAAI,CAAC,WAAW,CACjB,CAAC;IACJ,CAAC;IAED,WAAW;QACT,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;uGAfU,eAAe;2FAAf,eAAe;;2FAAf,eAAe;kBAD3B,SAAS;mBAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE;;sBAElD,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE"}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
// createTunnel for @symbiote-native/angular — the Angular twin of the React/Vue cross-surface tunnel
|
|
2
2
|
// (adapters/react/src/create-tunnel.tsx, adapters/vue/src/create-tunnel.ts — read their
|
|
3
|
-
// headers for the
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// share a surface or not.
|
|
3
|
+
// headers for the "why not just extend the portal across surfaces" rationale; same prior art:
|
|
4
|
+
// pmndrs/tunnel-rat, facebook/react#17147). `TunnelOut` lives in whichever component should PAINT
|
|
5
|
+
// the content; its own read of the shared store drives that surface's own normal render cycle —
|
|
6
|
+
// no cross-surface reach-in, works whether TunnelIn and TunnelOut share a surface or not.
|
|
8
7
|
//
|
|
9
|
-
// Angular cannot mirror React's/Vue's shape verbatim: both
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// Metro/Hermes (see modules/animated/create-animated-component.ts's header for the same
|
|
8
|
+
// Angular cannot mirror React's/Vue's shape verbatim: both build a FRESH `In`/`Out` pair per
|
|
9
|
+
// `createTunnel()` call, and Angular components can't be synthesized at runtime — no JIT compiler
|
|
10
|
+
// under Metro/Hermes (see modules/animated/create-animated-component.ts's header for the same
|
|
13
11
|
// constraint). So here `createTunnel()` returns only a plain reactive STORE (a signal);
|
|
14
12
|
// `TunnelInDirective` and `TunnelOut` are ONE static, pre-authored, AOT-compilable pair,
|
|
15
|
-
// parameterized by that store through an input —
|
|
16
|
-
//
|
|
13
|
+
// parameterized by that store through an input — the relationship `VListOutletDirective` has to
|
|
14
|
+
// the per-cell template it stamps, generalized to an open-ended, changing SET of templates.
|
|
17
15
|
//
|
|
18
|
-
// TunnelInDirective is a STRUCTURAL directive (`*tunnelIn="overlayTunnel"`),
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// same shape as Angular's own `<router-outlet>`, not content that needs a structural directive.
|
|
16
|
+
// TunnelInDirective is a STRUCTURAL directive (`*tunnelIn="overlayTunnel"`), matching `*portal`
|
|
17
|
+
// (see create-portal.ts's header for why that reads as native Angular). `TunnelOut` stays a plain
|
|
18
|
+
// component (`<tunnel-out>`) — a rendering SLOT, the same shape as Angular's own
|
|
19
|
+
// `<router-outlet>`, not content that needs a structural directive.
|
|
23
20
|
//
|
|
24
21
|
// App code stays fully declarative — no ViewContainerRef/imperative rendering — by putting
|
|
25
22
|
// `*tunnelIn` directly on the portable content, the same way `*ngIf` sits directly on an
|
|
@@ -68,10 +65,10 @@ export class TunnelInDirective {
|
|
|
68
65
|
ngOnDestroy() {
|
|
69
66
|
this.tunnelIn.unregister(this.id);
|
|
70
67
|
}
|
|
71
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
72
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.
|
|
68
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TunnelInDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
69
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: TunnelInDirective, isStandalone: true, selector: "[tunnelIn]", inputs: { tunnelIn: "tunnelIn" }, ngImport: i0 });
|
|
73
70
|
}
|
|
74
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TunnelInDirective, decorators: [{
|
|
75
72
|
type: Directive,
|
|
76
73
|
args: [{ selector: '[tunnelIn]', standalone: true }]
|
|
77
74
|
}], propDecorators: { tunnelIn: [{
|
|
@@ -109,10 +106,10 @@ export class TunnelOut {
|
|
|
109
106
|
this.views.set(id, this.viewContainerRef.createEmbeddedView(templateRef));
|
|
110
107
|
}
|
|
111
108
|
}
|
|
112
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
113
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.
|
|
109
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TunnelOut, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: TunnelOut, isStandalone: true, selector: "tunnel-out", inputs: { tunnel: "tunnel" }, ngImport: i0, template: '', isInline: true });
|
|
114
111
|
}
|
|
115
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TunnelOut, decorators: [{
|
|
116
113
|
type: Component,
|
|
117
114
|
args: [{
|
|
118
115
|
selector: 'tunnel-out',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/create-tunnel/index.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,wFAAwF;AACxF,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/create-tunnel/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,9 @@ export class DescriptorOutlet {
|
|
|
30
30
|
return this.patchElement(this.hostNode, rendered, next);
|
|
31
31
|
}
|
|
32
32
|
createChild(child) {
|
|
33
|
-
return typeof child === 'string'
|
|
33
|
+
return typeof child === 'string'
|
|
34
|
+
? this.createText(child)
|
|
35
|
+
: this.createElement(child);
|
|
34
36
|
}
|
|
35
37
|
createText(value) {
|
|
36
38
|
return { kind: 'text', node: this.renderer.createText(value), value };
|
|
@@ -121,10 +123,10 @@ export class DescriptorOutlet {
|
|
|
121
123
|
this.renderer.insertBefore(parent, newChild, oldChild);
|
|
122
124
|
this.renderer.removeChild(parent, oldChild);
|
|
123
125
|
}
|
|
124
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
125
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.
|
|
126
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DescriptorOutlet, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: DescriptorOutlet, isStandalone: true, selector: "symbiote-descriptor-outlet", inputs: { node: "node" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
126
128
|
}
|
|
127
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DescriptorOutlet, decorators: [{
|
|
128
130
|
type: Component,
|
|
129
131
|
args: [{
|
|
130
132
|
selector: 'symbiote-descriptor-outlet',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/descriptor-to-angular/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,4FAA4F;AAC5F,6FAA6F;AAC7F,+FAA+F;AAC/F,oCAAoC;AAEpC,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,SAAS,GAIV,MAAM,eAAe,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/descriptor-to-angular/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface IAngularProfile {
|
|
2
|
+
cdPasses: number;
|
|
3
|
+
viewsChecked: number;
|
|
4
|
+
rendererWrites: number;
|
|
5
|
+
nodesCreated: number;
|
|
6
|
+
nodesInserted: number;
|
|
7
|
+
nodesRemoved: number;
|
|
8
|
+
styleChecks: number;
|
|
9
|
+
styleMarks: number;
|
|
10
|
+
listChecks: number;
|
|
11
|
+
listRecomputes: number;
|
|
12
|
+
listMarks: number;
|
|
13
|
+
scrollTicks: number;
|
|
14
|
+
outletCreates: number;
|
|
15
|
+
outletUpdates: number;
|
|
16
|
+
outletDestroys: number;
|
|
17
|
+
projectionSchedules: number;
|
|
18
|
+
projectionFlushes: number;
|
|
19
|
+
stickyWrapperCreates: number;
|
|
20
|
+
stickyWrapperReuses: number;
|
|
21
|
+
}
|
|
22
|
+
type IAngularCounter = keyof IAngularProfile;
|
|
23
|
+
export declare function countAngular(counter: IAngularCounter): void;
|
|
24
|
+
export declare function readAngularProfile(): IAngularProfile;
|
|
25
|
+
export declare function setAngularProfileDetail(enabled: boolean): void;
|
|
26
|
+
export declare function noteAngularWrite(propName: string): void;
|
|
27
|
+
export declare function noteAngularCreate(tagName: string): void;
|
|
28
|
+
export interface IAngularProfileDetail {
|
|
29
|
+
writesByProp: readonly (readonly [string, number])[];
|
|
30
|
+
createsByTag: readonly (readonly [string, number])[];
|
|
31
|
+
}
|
|
32
|
+
export declare function readAngularProfileDetail(): IAngularProfileDetail;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Per-window counters for the Angular adapter, the twin of the engine's readCommitProfile().
|
|
2
|
+
// The engine's number answers "what did the commit walk cost"; these answer the question one layer
|
|
3
|
+
// up, which is the one Angular keeps losing: HOW MANY TIMES did anything run at all.
|
|
4
|
+
//
|
|
5
|
+
// Angular is the only adapter whose update model can free-run. A change-detection pass that writes
|
|
6
|
+
// a fresh reference into a downstream @Input marks a view dirty, the zoneless scheduler books
|
|
7
|
+
// another pass, and it never settles - the hazard `stableAnchorStyle` and VirtualizedList's
|
|
8
|
+
// `lastRecompute` gate each guard one instance of. A guard that stops holding is INVISIBLE from the
|
|
9
|
+
// outside: the screen paints correctly, only the frame rate collapses. `cdPasses` at rest is what
|
|
10
|
+
// makes it visible, and every other counter here narrows the same window to a suspect.
|
|
11
|
+
//
|
|
12
|
+
// Deliberately NOT gated behind isDebug(): an integer increment is noise next to the work it
|
|
13
|
+
// counts, and the numbers are only meaningful from a RELEASE build (dev-mode Angular runs its own
|
|
14
|
+
// checks and drowns the signal). The per-name detail map IS gated, since it allocates.
|
|
15
|
+
function createCounters() {
|
|
16
|
+
return {
|
|
17
|
+
cdPasses: 0,
|
|
18
|
+
viewsChecked: 0,
|
|
19
|
+
rendererWrites: 0,
|
|
20
|
+
nodesCreated: 0,
|
|
21
|
+
nodesInserted: 0,
|
|
22
|
+
nodesRemoved: 0,
|
|
23
|
+
styleChecks: 0,
|
|
24
|
+
styleMarks: 0,
|
|
25
|
+
listChecks: 0,
|
|
26
|
+
listRecomputes: 0,
|
|
27
|
+
listMarks: 0,
|
|
28
|
+
scrollTicks: 0,
|
|
29
|
+
outletCreates: 0,
|
|
30
|
+
outletUpdates: 0,
|
|
31
|
+
outletDestroys: 0,
|
|
32
|
+
projectionSchedules: 0,
|
|
33
|
+
projectionFlushes: 0,
|
|
34
|
+
stickyWrapperCreates: 0,
|
|
35
|
+
stickyWrapperReuses: 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
let counters = createCounters();
|
|
39
|
+
export function countAngular(counter) {
|
|
40
|
+
counters[counter] += 1;
|
|
41
|
+
}
|
|
42
|
+
// Reading zeroes the counters, so a sampler on an interval gets disjoint windows rather than a
|
|
43
|
+
// growing total - same contract as readCommitProfile().
|
|
44
|
+
export function readAngularProfile() {
|
|
45
|
+
const snapshot = counters;
|
|
46
|
+
counters = createCounters();
|
|
47
|
+
return snapshot;
|
|
48
|
+
}
|
|
49
|
+
// Which prop names the renderer actually rewrites, and which host tags get created. Off by default
|
|
50
|
+
// because it allocates per write; the probe screen turns it on for one sample. A write nothing
|
|
51
|
+
// asked for is the whole diagnosis, and the prop NAME is what points at the binding responsible.
|
|
52
|
+
let isDetailEnabled = false;
|
|
53
|
+
const writesByProp = new Map();
|
|
54
|
+
const createsByTag = new Map();
|
|
55
|
+
export function setAngularProfileDetail(enabled) {
|
|
56
|
+
isDetailEnabled = enabled;
|
|
57
|
+
if (!enabled) {
|
|
58
|
+
writesByProp.clear();
|
|
59
|
+
createsByTag.clear();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function noteAngularWrite(propName) {
|
|
63
|
+
if (!isDetailEnabled)
|
|
64
|
+
return;
|
|
65
|
+
writesByProp.set(propName, (writesByProp.get(propName) ?? 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
export function noteAngularCreate(tagName) {
|
|
68
|
+
if (!isDetailEnabled)
|
|
69
|
+
return;
|
|
70
|
+
createsByTag.set(tagName, (createsByTag.get(tagName) ?? 0) + 1);
|
|
71
|
+
}
|
|
72
|
+
// Sorted hottest-first and read-and-cleared, so a sample names its own top offenders.
|
|
73
|
+
export function readAngularProfileDetail() {
|
|
74
|
+
const detail = {
|
|
75
|
+
writesByProp: [...writesByProp.entries()].sort((a, b) => b[1] - a[1]),
|
|
76
|
+
createsByTag: [...createsByTag.entries()].sort((a, b) => b[1] - a[1]),
|
|
77
|
+
};
|
|
78
|
+
writesByProp.clear();
|
|
79
|
+
createsByTag.clear();
|
|
80
|
+
return detail;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// - null/undefined -> null
|
|
13
13
|
// An uncommitted or unknown input surfaces as null.
|
|
14
14
|
import { ElementRef } from '@angular/core';
|
|
15
|
-
import { getNativeTag, isSymbioteNode } from '@symbiote-native/engine';
|
|
15
|
+
import { getNativeTag, isSymbioteNode, } from '@symbiote-native/engine';
|
|
16
16
|
function resolveHostNode(candidate) {
|
|
17
17
|
if (candidate === null || candidate === undefined)
|
|
18
18
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/host-instance/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0FAA0F;AAC1F,uDAAuD;AACvD,EAAE;AACF,+FAA+F;AAC/F,0FAA0F;AAC1F,0EAA0E;AAC1E,iCAAiC;AACjC,4CAA4C;AAC5C,mDAAmD;AACnD,yFAAyF;AACzF,6BAA6B;AAC7B,oDAAoD;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/host-instance/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0FAA0F;AAC1F,uDAAuD;AACvD,EAAE;AACF,+FAA+F;AAC/F,0FAA0F;AAC1F,0EAA0E;AAC1E,iCAAiC;AACjC,4CAA4C;AAC5C,mDAAmD;AACnD,yFAAyF;AACzF,6BAA6B;AAC7B,oDAAoD;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,cAAc,GAEf,MAAM,yBAAyB,CAAC;AAIjC,SAAS,eAAe,CAAC,SAAkB;IACzC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,cAAc,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,SAAS,YAAY,UAAU;QACjC,OAAO,eAAe,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,SAAwC,CAAC;IAC3D,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;QACnD,OAAO,eAAe,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,iBAA0B;IACvD,IAAI,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,KAAK,SAAS;QAC/D,OAAO,IAAI,CAAC;IACd,IAAI,OAAO,iBAAiB,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC;IACpE,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC"}
|
package/build/angular/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
export { ActivityIndicator, anchorHostStyle, Button, FlatList, HorizontalScrollContentView, HorizontalScrollView, Image, ImageBackground, InputAccessoryView, KeyboardAvoidingView, Modal, Pressable, RefreshControl, SafeAreaView, ScrollContentView, ScrollView, ScrollViewStickyHeader, SectionList, stableAnchorStyle, Switch, SymbioteHostPropsDirective, Text, TextInput, TouchableHighlight, TouchableNativeFeedback, TouchableOpacity, TouchableWithoutFeedback, View, VirtualizedList, VirtualizedSectionList, VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListSeparatorDirective, VSectionFooterDirective, VSectionHeaderDirective, VSectionItemDirective, VSectionSeparatorDirective, } from './components';
|
|
1
|
+
export { ActivityIndicator, anchorHostStyle, Button, FlatList, HorizontalScrollContentView, HorizontalScrollView, Image, ImageBackground, InputAccessoryView, KeyboardAvoidingView, Modal, Pressable, RefreshControl, SafeAreaView, ScrollContentView, ScrollView, ScrollViewStickyHeader, SectionList, stableAnchorStyle, Switch, SymbioteHostPropsDirective, SymbioteStyleInputDirective, Text, TextInput, TouchableHighlight, TouchableNativeFeedback, TouchableOpacity, TouchableWithoutFeedback, View, VirtualizedList, VirtualizedSectionList, VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListSeparatorDirective, VSectionFooterDirective, VSectionHeaderDirective, VSectionItemDirective, VSectionSeparatorDirective, } from './components';
|
|
2
2
|
export { Animated } from './modules/animated';
|
|
3
3
|
export { AnimatedFlatList, AnimatedImage, AnimatedScrollView, AnimatedSectionList, AnimatedText, AnimatedView, } from './modules/animated';
|
|
4
|
+
export { createAnimatedComponent } from './modules/animated';
|
|
4
5
|
export type { IActivityIndicatorProps, IAngularImageBackgroundProps, IAngularInputAccessoryViewProps, IAngularKeyboardAvoidingViewProps, IAngularModalProps, IAngularPressableProps, IAngularRefreshControlProps, IAngularSafeAreaViewProps, IAngularScrollViewProps, IAngularTextInputProps, IAngularTouchableHighlightProps, IAngularTouchableNativeFeedbackProps, IAngularTouchableOpacityProps, IAngularTouchableWithoutFeedbackProps, IButtonProps, ICellLayout, IFlatListHandle, IFlatListProps, IEnterKeyHint, IImageCacheStatus, IImageProps, IImageSize, IImageSource, IImageSourceProp, IInputMode, IKeyboardAvoidingBehavior, IModalAnimationType, IModalOrientation, IModalOrientationChangeEvent, IModalPresentationStyle, INativeFeedbackBackground, IResizeMode, IRippleBackground, IScrollViewHandle, ISectionListHandle, ISectionListProps, ISeparatorProps, ISeparators, IStickyHeaderComponentType, ISubmitBehavior, IThemeAttrBackground, IViewabilityConfig, IViewabilityConfigCallbackPair, IViewableItemsChangedInfo, IViewToken, IVirtualizedListHandle, IVirtualizedListProps, IVirtualizedSectionListHandle, IVirtualizedSectionListProps, IVListItemContext, IVListSeparatorContext, IVSectionContext, IVSectionItemContext, ISection, ISwitchProps, ISwitchTrackColor, ITextInputHandle, ITextInputSelection, } from './components';
|
|
5
6
|
export { setImageSourceResolver } from './components';
|
|
6
7
|
export { mount, unmount } from './render';
|
|
7
8
|
export { DescriptorOutlet } from './descriptor-to-angular';
|
|
8
9
|
export { PortalDirective, PortalOutletDirective } from './create-portal';
|
|
9
|
-
export { createTunnel, TunnelInDirective, TunnelOut, type ITunnelStore } from './create-tunnel';
|
|
10
|
+
export { createTunnel, TunnelInDirective, TunnelOut, type ITunnelStore, } from './create-tunnel';
|
|
10
11
|
export { SymbioteRenderer, SymbioteRendererFactory } from './renderer';
|
|
11
12
|
export { registerComposedComponent } from './anchor-host-registry';
|
|
12
13
|
export { findNodeHandle } from './host-instance';
|
|
@@ -18,5 +19,9 @@ export type { IComponentProvider, IAppParameters, IRunnable, IHostRegistrar, IWr
|
|
|
18
19
|
export { ColorSchemeService, WindowDimensionsService } from './services';
|
|
19
20
|
export { Alert, Share, ActionSheetIOS, Linking, Vibration, ToastAndroid, Settings, I18nManager, Dimensions, Appearance, AppState, Keyboard, KEYBOARD_EVENT, BackHandler, PermissionsAndroid, PERMISSIONS, RESULTS, AccessibilityInfo, LayoutAnimation, InteractionManager, PanResponder, PixelRatio, PlatformColor, DynamicColorIOS, } from '@symbiote-native/engine';
|
|
20
21
|
export type { IAlertType, IAlertButtonStyle, IAlertButton, IAlertButtons, IAlertOptions, IShareContent, IShareOptions, IShareAction, IActionSheetIOSOptions, IShareActionSheetIOSOptions, IShareActionSheetError, IUrlEvent, II18nManagerConstants, IDisplayMetrics, IDisplayMetricsAndroid, IDimensionsPayload, IDimensionsSet, IDimensionsKey, IDimensionsChangeListener, IDimensionsStatic, IColorSchemeName, IColorSchemePreference, IAppStateStatus, IAppStateEvent, IKeyboardEventName, IKeyboardEvent, IKeyboardMetrics, IBackPressEventName, IBackPressHandler, IPermission, IPermissionStatus, IRationale, IAccessibilityChangeEvent, IAccessibilityChangeEventName, IAccessibilityChangeEventHandler, IAccessibilityAnnouncementFinishedEvent, IAnnounceForAccessibilityOptions, IAccessibilityEventType, ILayoutAnimationType, ILayoutAnimationProperty, ILayoutAnimationConfig, ILayoutAnimationAnim, IInteractionEvent, ISimpleTask, IPromiseTask, ITask, IHandle, IPanResponderGestureState, IPanResponderCallbacks, IGestureResponderHandlers, IPanResponderInstance, IPixelRatioStatic, IColorValue, IOpaqueColorValue, IDynamicColorIOSTuple, } from '@symbiote-native/engine';
|
|
21
|
-
export { dlog,
|
|
22
|
-
export type { IRootTag, ISymbioteEvent, ISymbioteNode } from '@symbiote-native/engine';
|
|
22
|
+
export { dlog, isDebug, Platform, processColor, setColorProcessor, setDeviceEventSource, setNativeViewConfigSource, StyleSheet, } from '@symbiote-native/engine';
|
|
23
|
+
export type { IRootTag, ISymbioteEvent, ISymbioteNode, } from '@symbiote-native/engine';
|
|
24
|
+
export type { IViewStyle, ITextStyle, IFlexAlign, IFlexJustify, IPlatformStatic, IPlatformOSType, IPlatformConstantsIOS, IPlatformConstantsAndroid, IPlatformSelectSpec, INativeViewConfig, INativeViewConfigSource, } from '@symbiote-native/engine';
|
|
25
|
+
export type { IAccessibilityProps, IAriaProps, IAccessibilityRole, IRole, IAccessibilityStateValue, IAccessibilityValue, IAccessibilityActionInfo, IResponderProps, IPressState, IPressableAndroidRippleConfig, IImageStatics, } from '@symbiote-native/components';
|
|
26
|
+
export { readAngularProfile, readAngularProfileDetail, setAngularProfileDetail, } from './diagnostics';
|
|
27
|
+
export type { IAngularProfile, IAngularProfileDetail } from './diagnostics';
|
package/build/angular/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
//
|
|
5
5
|
// SEAM SCAFFOLD: mount/unmount + the renderer seam + host intrinsic selectors. Full RN-like
|
|
6
6
|
// composed components still flow through the shared @symbiote-native/components bridge.
|
|
7
|
-
export { ActivityIndicator, anchorHostStyle, Button, FlatList, HorizontalScrollContentView, HorizontalScrollView, Image, ImageBackground, InputAccessoryView, KeyboardAvoidingView, Modal, Pressable, RefreshControl, SafeAreaView, ScrollContentView, ScrollView, ScrollViewStickyHeader, SectionList, stableAnchorStyle, Switch, SymbioteHostPropsDirective, Text, TextInput, TouchableHighlight, TouchableNativeFeedback, TouchableOpacity, TouchableWithoutFeedback, View, VirtualizedList, VirtualizedSectionList, VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListSeparatorDirective, VSectionFooterDirective, VSectionHeaderDirective, VSectionItemDirective, VSectionSeparatorDirective, } from './components';
|
|
7
|
+
export { ActivityIndicator, anchorHostStyle, Button, FlatList, HorizontalScrollContentView, HorizontalScrollView, Image, ImageBackground, InputAccessoryView, KeyboardAvoidingView, Modal, Pressable, RefreshControl, SafeAreaView, ScrollContentView, ScrollView, ScrollViewStickyHeader, SectionList, stableAnchorStyle, Switch, SymbioteHostPropsDirective, SymbioteStyleInputDirective, Text, TextInput, TouchableHighlight, TouchableNativeFeedback, TouchableOpacity, TouchableWithoutFeedback, View, VirtualizedList, VirtualizedSectionList, VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListSeparatorDirective, VSectionFooterDirective, VSectionHeaderDirective, VSectionItemDirective, VSectionSeparatorDirective, } from './components';
|
|
8
8
|
export { Animated } from './modules/animated';
|
|
9
9
|
// Also exposed as named top-level symbols (not just Animated.View/.Text/...): ngtsc's partial-mode
|
|
10
10
|
// static evaluator can't trace a component class through property access on an external
|
|
@@ -12,6 +12,16 @@ export { Animated } from './modules/animated';
|
|
|
12
12
|
// so `<AnimatedView>` in a template requires `import { AnimatedView } from '@symbiote-native/angular'`,
|
|
13
13
|
// not `const AnimatedView = Animated.View`. Plain tsc/vitest don't catch this; only a real ngc run does.
|
|
14
14
|
export { AnimatedFlatList, AnimatedImage, AnimatedScrollView, AnimatedSectionList, AnimatedText, AnimatedView, } from './modules/animated';
|
|
15
|
+
// Exported even though Angular's version maps only the four primitives (View/Text/Image/
|
|
16
|
+
// ScrollView) onto the pre-authored wrappers above and THROWS on anything else — there is no JIT
|
|
17
|
+
// under AOT/Metro, so it cannot synthesize a wrapper at runtime the way the other four adapters
|
|
18
|
+
// do. It ships anyway because portable code (`createAnimatedComponent(View)`) then compiles and
|
|
19
|
+
// runs identically on all five adapters, and the one case Angular cannot serve fails with a
|
|
20
|
+
// message naming the fix (author a standalone @Component over AnimatedComponentBase) instead of
|
|
21
|
+
// failing as a missing export, which names nothing. Found by the barrel audit in
|
|
22
|
+
// `.claude/rules/adapter-parity-audit.md`: it was implemented and tested here all along and simply
|
|
23
|
+
// never reached this file, so `@symbiote-native/angular` consumers could not reach it at all.
|
|
24
|
+
export { createAnimatedComponent } from './modules/animated';
|
|
15
25
|
export { setImageSourceResolver } from './components';
|
|
16
26
|
export { mount, unmount } from './render';
|
|
17
27
|
// The generic Descriptor→Angular bridge, the twin of descriptorToReact/descriptorToVue.
|
|
@@ -26,7 +36,7 @@ export { DescriptorOutlet } from './descriptor-to-angular';
|
|
|
26
36
|
// idiom) parameterized by an `@Input()`, rather than a factory returning fresh components per
|
|
27
37
|
// call.
|
|
28
38
|
export { PortalDirective, PortalOutletDirective } from './create-portal';
|
|
29
|
-
export { createTunnel, TunnelInDirective, TunnelOut } from './create-tunnel';
|
|
39
|
+
export { createTunnel, TunnelInDirective, TunnelOut, } from './create-tunnel';
|
|
30
40
|
export { SymbioteRenderer, SymbioteRendererFactory } from './renderer';
|
|
31
41
|
// registerComposedComponent lives in the dependency-free leaf ./anchor-host-registry, NOT in the
|
|
32
42
|
// require-cyclic ./renderer — see the leaf header. The babel-register-composed plugin injects the
|
|
@@ -42,5 +52,9 @@ export { ColorSchemeService, WindowDimensionsService } from './services';
|
|
|
42
52
|
// Framework-agnostic runtime modules from @symbiote-native/engine. Every adapter re-exports them so
|
|
43
53
|
// app code names only @symbiote-native/angular.
|
|
44
54
|
export { Alert, Share, ActionSheetIOS, Linking, Vibration, ToastAndroid, Settings, I18nManager, Dimensions, Appearance, AppState, Keyboard, KEYBOARD_EVENT, BackHandler, PermissionsAndroid, PERMISSIONS, RESULTS, AccessibilityInfo, LayoutAnimation, InteractionManager, PanResponder, PixelRatio, PlatformColor, DynamicColorIOS, } from '@symbiote-native/engine';
|
|
45
|
-
export { dlog,
|
|
55
|
+
export { dlog, isDebug, Platform, processColor, setColorProcessor, setDeviceEventSource, setNativeViewConfigSource, StyleSheet, } from '@symbiote-native/engine';
|
|
56
|
+
// Diagnostics: per-window Angular-side counters (change-detection passes, renderer writes, list
|
|
57
|
+
// recomputes, cell views). The engine's readCommitProfile() prices the commit; these say how many
|
|
58
|
+
// times anything ran at all - the number that exposes a change-detection free-run.
|
|
59
|
+
export { readAngularProfile, readAngularProfileDetail, setAngularProfileDetail, } from './diagnostics';
|
|
46
60
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,8FAA8F;AAC9F,sGAAsG;AACtG,EAAE;AACF,4FAA4F;AAC5F,wFAAwF;AAExF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,2BAA2B,EAC3B,oBAAoB,EACpB,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,0BAA0B,EAC1B,IAAI,EACJ,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,IAAI,EACJ,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,mGAAmG;AACnG,wFAAwF;AACxF,iEAAiE;AACjE,wGAAwG;AACxG,yGAAyG;AACzG,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import { type ISymbioteNode } from '@symbiote-native/engine';
|
|
2
2
|
export declare class AnimatedLeafBinder {
|
|
3
3
|
private readonly resolveNode;
|
|
4
|
-
private readonly
|
|
5
|
-
private attached;
|
|
6
|
-
private cancelBind;
|
|
7
|
-
private eventDetachers;
|
|
4
|
+
private readonly lifecycle;
|
|
8
5
|
constructor(resolveNode: () => ISymbioteNode | null, label: string);
|
|
9
6
|
reconcile(props: Record<string, unknown>, wantsNative: boolean): void;
|
|
10
|
-
private bindNode;
|
|
11
|
-
private attachEvents;
|
|
12
|
-
private detachEvents;
|
|
13
7
|
destroy(): void;
|
|
14
8
|
}
|