@symbiote-native/angular 0.1.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/LICENSE +21 -0
- package/README.md +147 -0
- package/build/angular/components/activity-indicator/index.android.d.ts +12 -0
- package/build/angular/components/activity-indicator/index.android.js +21 -0
- package/build/angular/components/activity-indicator/index.android.js.map +1 -0
- package/build/angular/components/activity-indicator/index.d.ts +1 -0
- package/build/angular/components/activity-indicator/index.ios.d.ts +8 -0
- package/build/angular/components/activity-indicator/index.ios.js +21 -0
- package/build/angular/components/activity-indicator/index.ios.js.map +1 -0
- package/build/angular/components/activity-indicator/index.js +4 -0
- package/build/angular/components/activity-indicator/index.js.map +1 -0
- package/build/angular/components/activity-indicator/shared.d.ts +67 -0
- package/build/angular/components/activity-indicator/shared.js +260 -0
- package/build/angular/components/activity-indicator/shared.js.map +1 -0
- package/build/angular/components/button.d.ts +63 -0
- package/build/angular/components/button.js +332 -0
- package/build/angular/components/button.js.map +1 -0
- package/build/angular/components/drawer-layout-android/index.android.d.ts +34 -0
- package/build/angular/components/drawer-layout-android/index.android.js +291 -0
- package/build/angular/components/drawer-layout-android/index.android.js.map +1 -0
- package/build/angular/components/drawer-layout-android/index.d.ts +11 -0
- package/build/angular/components/drawer-layout-android/index.js +109 -0
- package/build/angular/components/drawer-layout-android/index.js.map +1 -0
- package/build/angular/components/drawer-layout-android/shared.d.ts +74 -0
- package/build/angular/components/drawer-layout-android/shared.js +138 -0
- package/build/angular/components/drawer-layout-android/shared.js.map +1 -0
- package/build/angular/components/flat-list/index.d.ts +122 -0
- package/build/angular/components/flat-list/index.js +689 -0
- package/build/angular/components/flat-list/index.js.map +1 -0
- package/build/angular/components/image/index.android.d.ts +10 -0
- package/build/angular/components/image/index.android.js +59 -0
- package/build/angular/components/image/index.android.js.map +1 -0
- package/build/angular/components/image/index.d.ts +1 -0
- package/build/angular/components/image/index.ios.d.ts +10 -0
- package/build/angular/components/image/index.ios.js +59 -0
- package/build/angular/components/image/index.ios.js.map +1 -0
- package/build/angular/components/image/index.js +3 -0
- package/build/angular/components/image/index.js.map +1 -0
- package/build/angular/components/image/shared.d.ts +101 -0
- package/build/angular/components/image/shared.js +408 -0
- package/build/angular/components/image/shared.js.map +1 -0
- package/build/angular/components/image-background.d.ts +81 -0
- package/build/angular/components/image-background.js +418 -0
- package/build/angular/components/image-background.js.map +1 -0
- package/build/angular/components/input-accessory-view.d.ts +59 -0
- package/build/angular/components/input-accessory-view.js +266 -0
- package/build/angular/components/input-accessory-view.js.map +1 -0
- package/build/angular/components/keyboard-avoiding-view.d.ts +82 -0
- package/build/angular/components/keyboard-avoiding-view.js +363 -0
- package/build/angular/components/keyboard-avoiding-view.js.map +1 -0
- package/build/angular/components/modal.d.ts +92 -0
- package/build/angular/components/modal.js +365 -0
- package/build/angular/components/modal.js.map +1 -0
- package/build/angular/components/pressable/index.d.ts +123 -0
- package/build/angular/components/pressable/index.js +421 -0
- package/build/angular/components/pressable/index.js.map +1 -0
- package/build/angular/components/refresh-control.d.ts +86 -0
- package/build/angular/components/refresh-control.js +347 -0
- package/build/angular/components/refresh-control.js.map +1 -0
- package/build/angular/components/safe-area-view.d.ts +57 -0
- package/build/angular/components/safe-area-view.js +253 -0
- package/build/angular/components/safe-area-view.js.map +1 -0
- package/build/angular/components/scroll-view/index.android.d.ts +21 -0
- package/build/angular/components/scroll-view/index.android.js +235 -0
- package/build/angular/components/scroll-view/index.android.js.map +1 -0
- package/build/angular/components/scroll-view/index.d.ts +3 -0
- package/build/angular/components/scroll-view/index.ios.d.ts +9 -0
- package/build/angular/components/scroll-view/index.ios.js +86 -0
- package/build/angular/components/scroll-view/index.ios.js.map +1 -0
- package/build/angular/components/scroll-view/index.js +6 -0
- package/build/angular/components/scroll-view/index.js.map +1 -0
- package/build/angular/components/scroll-view/projection.d.ts +32 -0
- package/build/angular/components/scroll-view/projection.js +312 -0
- package/build/angular/components/scroll-view/projection.js.map +1 -0
- package/build/angular/components/scroll-view/shared.d.ts +230 -0
- package/build/angular/components/scroll-view/shared.js +679 -0
- package/build/angular/components/scroll-view/shared.js.map +1 -0
- package/build/angular/components/scroll-view/sticky-header.d.ts +41 -0
- package/build/angular/components/scroll-view/sticky-header.js +208 -0
- package/build/angular/components/scroll-view/sticky-header.js.map +1 -0
- package/build/angular/components/section-list/index.d.ts +116 -0
- package/build/angular/components/section-list/index.js +641 -0
- package/build/angular/components/section-list/index.js.map +1 -0
- package/build/angular/components/switch/index.android.d.ts +20 -0
- package/build/angular/components/switch/index.android.js +70 -0
- package/build/angular/components/switch/index.android.js.map +1 -0
- package/build/angular/components/switch/index.d.ts +1 -0
- package/build/angular/components/switch/index.ios.d.ts +19 -0
- package/build/angular/components/switch/index.ios.js +69 -0
- package/build/angular/components/switch/index.ios.js.map +1 -0
- package/build/angular/components/switch/index.js +4 -0
- package/build/angular/components/switch/index.js.map +1 -0
- package/build/angular/components/switch/shared.d.ts +40 -0
- package/build/angular/components/switch/shared.js +127 -0
- package/build/angular/components/switch/shared.js.map +1 -0
- package/build/angular/components/text-input.d.ts +153 -0
- package/build/angular/components/text-input.js +604 -0
- package/build/angular/components/text-input.js.map +1 -0
- package/build/angular/components/touchable-native-feedback.d.ts +83 -0
- package/build/angular/components/touchable-native-feedback.js +376 -0
- package/build/angular/components/touchable-native-feedback.js.map +1 -0
- package/build/angular/components/touchable.d.ts +248 -0
- package/build/angular/components/touchable.js +1206 -0
- package/build/angular/components/touchable.js.map +1 -0
- package/build/angular/components/virtualized-list/directives.d.ts +54 -0
- package/build/angular/components/virtualized-list/directives.js +154 -0
- package/build/angular/components/virtualized-list/directives.js.map +1 -0
- package/build/angular/components/virtualized-list/index.d.ts +268 -0
- package/build/angular/components/virtualized-list/index.js +1162 -0
- package/build/angular/components/virtualized-list/index.js.map +1 -0
- package/build/angular/components/virtualized-section-list/directives.d.ts +37 -0
- package/build/angular/components/virtualized-section-list/directives.js +77 -0
- package/build/angular/components/virtualized-section-list/directives.js.map +1 -0
- package/build/angular/components/virtualized-section-list/index.d.ts +178 -0
- package/build/angular/components/virtualized-section-list/index.js +722 -0
- package/build/angular/components/virtualized-section-list/index.js.map +1 -0
- package/build/angular/components.d.ts +39 -0
- package/build/angular/components.js +38 -0
- package/build/angular/components.js.map +1 -0
- package/build/angular/create-portal.d.ts +22 -0
- package/build/angular/create-portal.js +74 -0
- package/build/angular/create-portal.js.map +1 -0
- package/build/angular/create-tunnel.d.ts +34 -0
- package/build/angular/create-tunnel.js +126 -0
- package/build/angular/create-tunnel.js.map +1 -0
- package/build/angular/descriptor-to-angular/index.d.ts +22 -0
- package/build/angular/descriptor-to-angular/index.js +142 -0
- package/build/angular/descriptor-to-angular/index.js.map +1 -0
- package/build/angular/host-instance/index.d.ts +2 -0
- package/build/angular/host-instance/index.js +37 -0
- package/build/angular/host-instance/index.js.map +1 -0
- package/build/angular/index.d.ts +21 -0
- package/build/angular/index.js +42 -0
- package/build/angular/index.js.map +1 -0
- package/build/angular/modules/animated/create-animated-component.d.ts +68 -0
- package/build/angular/modules/animated/create-animated-component.js +429 -0
- package/build/angular/modules/animated/create-animated-component.js.map +1 -0
- package/build/angular/modules/animated/index.d.ts +51 -0
- package/build/angular/modules/animated/index.js +59 -0
- package/build/angular/modules/animated/index.js.map +1 -0
- package/build/angular/modules/app-registry/index.d.ts +7 -0
- package/build/angular/modules/app-registry/index.js +23 -0
- package/build/angular/modules/app-registry/index.js.map +1 -0
- package/build/angular/modules/status-bar.d.ts +20 -0
- package/build/angular/modules/status-bar.js +59 -0
- package/build/angular/modules/status-bar.js.map +1 -0
- package/build/angular/primitives/index.d.ts +63 -0
- package/build/angular/primitives/index.js +189 -0
- package/build/angular/primitives/index.js.map +1 -0
- package/build/angular/primitives/shared.d.ts +89 -0
- package/build/angular/primitives/shared.js +172 -0
- package/build/angular/primitives/shared.js.map +1 -0
- package/build/angular/render.d.ts +11 -0
- package/build/angular/render.js +161 -0
- package/build/angular/render.js.map +1 -0
- package/build/angular/renderer.d.ts +38 -0
- package/build/angular/renderer.js +360 -0
- package/build/angular/renderer.js.map +1 -0
- package/build/angular/services/color-scheme.service.d.ts +16 -0
- package/build/angular/services/color-scheme.service.js +31 -0
- package/build/angular/services/color-scheme.service.js.map +1 -0
- package/build/angular/services/index.d.ts +2 -0
- package/build/angular/services/index.js +3 -0
- package/build/angular/services/index.js.map +1 -0
- package/build/angular/services/window-dimensions.service.d.ts +16 -0
- package/build/angular/services/window-dimensions.service.js +42 -0
- package/build/angular/services/window-dimensions.service.js.map +1 -0
- package/build/components/activity-indicator/index.android.d.ts +9 -0
- package/build/components/activity-indicator/index.android.js +64 -0
- package/build/components/activity-indicator/index.d.ts +1 -0
- package/build/components/activity-indicator/index.ios.d.ts +5 -0
- package/build/components/activity-indicator/index.ios.js +64 -0
- package/build/components/activity-indicator/index.js +3 -0
- package/build/components/activity-indicator/shared.d.ts +64 -0
- package/build/components/activity-indicator/shared.js +424 -0
- package/build/components/button.d.ts +60 -0
- package/build/components/button.js +456 -0
- package/build/components/drawer-layout-android/index.android.d.ts +29 -0
- package/build/components/drawer-layout-android/index.android.js +326 -0
- package/build/components/drawer-layout-android/index.d.ts +8 -0
- package/build/components/drawer-layout-android/index.js +145 -0
- package/build/components/drawer-layout-android/shared.d.ts +71 -0
- package/build/components/drawer-layout-android/shared.js +205 -0
- package/build/components/flat-list/index.d.ts +119 -0
- package/build/components/flat-list/index.js +692 -0
- package/build/components/image/index.android.d.ts +7 -0
- package/build/components/image/index.android.js +88 -0
- package/build/components/image/index.d.ts +1 -0
- package/build/components/image/index.ios.d.ts +7 -0
- package/build/components/image/index.ios.js +88 -0
- package/build/components/image/index.js +2 -0
- package/build/components/image/shared.d.ts +101 -0
- package/build/components/image/shared.js +407 -0
- package/build/components/image-background.d.ts +78 -0
- package/build/components/image-background.js +583 -0
- package/build/components/input-accessory-view.d.ts +56 -0
- package/build/components/input-accessory-view.js +407 -0
- package/build/components/keyboard-avoiding-view.d.ts +79 -0
- package/build/components/keyboard-avoiding-view.js +509 -0
- package/build/components/modal.d.ts +89 -0
- package/build/components/modal.js +534 -0
- package/build/components/pressable/index.d.ts +120 -0
- package/build/components/pressable/index.js +640 -0
- package/build/components/refresh-control.d.ts +83 -0
- package/build/components/refresh-control.js +514 -0
- package/build/components/safe-area-view.d.ts +54 -0
- package/build/components/safe-area-view.js +393 -0
- package/build/components/scroll-view/index.android.d.ts +16 -0
- package/build/components/scroll-view/index.android.js +228 -0
- package/build/components/scroll-view/index.d.ts +3 -0
- package/build/components/scroll-view/index.ios.d.ts +6 -0
- package/build/components/scroll-view/index.ios.js +113 -0
- package/build/components/scroll-view/index.js +5 -0
- package/build/components/scroll-view/projection.d.ts +32 -0
- package/build/components/scroll-view/projection.js +311 -0
- package/build/components/scroll-view/shared.d.ts +225 -0
- package/build/components/scroll-view/shared.js +757 -0
- package/build/components/scroll-view/sticky-header.d.ts +38 -0
- package/build/components/scroll-view/sticky-header.js +257 -0
- package/build/components/section-list/index.d.ts +113 -0
- package/build/components/section-list/index.js +768 -0
- package/build/components/switch/index.android.d.ts +17 -0
- package/build/components/switch/index.android.js +107 -0
- package/build/components/switch/index.d.ts +1 -0
- package/build/components/switch/index.ios.d.ts +16 -0
- package/build/components/switch/index.ios.js +106 -0
- package/build/components/switch/index.js +3 -0
- package/build/components/switch/shared.d.ts +37 -0
- package/build/components/switch/shared.js +176 -0
- package/build/components/text-input.d.ts +150 -0
- package/build/components/text-input.js +826 -0
- package/build/components/touchable-native-feedback.d.ts +80 -0
- package/build/components/touchable-native-feedback.js +550 -0
- package/build/components/touchable.d.ts +241 -0
- package/build/components/touchable.js +1672 -0
- package/build/components/virtualized-list/directives.d.ts +41 -0
- package/build/components/virtualized-list/directives.js +250 -0
- package/build/components/virtualized-list/index.d.ts +265 -0
- package/build/components/virtualized-list/index.js +1344 -0
- package/build/components/virtualized-section-list/directives.d.ts +28 -0
- package/build/components/virtualized-section-list/directives.js +149 -0
- package/build/components/virtualized-section-list/index.d.ts +175 -0
- package/build/components/virtualized-section-list/index.js +854 -0
- package/build/components.d.ts +39 -0
- package/build/components.js +37 -0
- package/build/create-portal.d.ts +17 -0
- package/build/create-portal.js +128 -0
- package/build/create-tunnel.d.ts +29 -0
- package/build/create-tunnel.js +181 -0
- package/build/descriptor-to-angular/index.d.ts +19 -0
- package/build/descriptor-to-angular/index.js +186 -0
- package/build/host-instance/index.d.ts +2 -0
- package/build/host-instance/index.js +36 -0
- package/build/index.d.ts +21 -0
- package/build/index.js +41 -0
- package/build/modules/animated/create-animated-component.d.ts +57 -0
- package/build/modules/animated/create-animated-component.js +490 -0
- package/build/modules/animated/index.d.ts +51 -0
- package/build/modules/animated/index.js +58 -0
- package/build/modules/app-registry/index.d.ts +7 -0
- package/build/modules/app-registry/index.js +22 -0
- package/build/modules/status-bar.d.ts +17 -0
- package/build/modules/status-bar.js +121 -0
- package/build/primitives/index.d.ts +32 -0
- package/build/primitives/index.js +386 -0
- package/build/primitives/shared.d.ts +84 -0
- package/build/primitives/shared.js +231 -0
- package/build/render.d.ts +11 -0
- package/build/render.js +160 -0
- package/build/renderer.d.ts +38 -0
- package/build/renderer.js +359 -0
- package/build/services/color-scheme.service.d.ts +13 -0
- package/build/services/color-scheme.service.js +72 -0
- package/build/services/index.d.ts +2 -0
- package/build/services/index.js +2 -0
- package/build/services/window-dimensions.service.d.ts +13 -0
- package/build/services/window-dimensions.service.js +83 -0
- package/metro-css-parser.cjs +11 -0
- package/package.json +57 -0
- package/src/__tests__/responder-change-detection.test.ts +102 -0
- package/src/__tests__/responder-nested-cd.test.ts +113 -0
- package/src/angular-gaps.test.ts +142 -0
- package/src/angular-imports.test.ts +100 -0
- package/src/components/activity-indicator/activity-indicator-class-style.test.ts +44 -0
- package/src/components/activity-indicator/activity-indicator.test.ts +131 -0
- package/src/components/activity-indicator/index.android.ts +16 -0
- package/src/components/activity-indicator/index.ios.ts +17 -0
- package/src/components/activity-indicator/index.ts +4 -0
- package/src/components/activity-indicator/shared.ts +206 -0
- package/src/components/button.ts +193 -0
- package/src/components/flat-list/column-wrapper-style-class.test.ts +116 -0
- package/src/components/flat-list/flat-list-array-style.test.ts +131 -0
- package/src/components/flat-list/flat-list-class-style.test.ts +74 -0
- package/src/components/flat-list/flat-list-scroll-containment.test.ts +107 -0
- package/src/components/flat-list/flat-list.test.ts +99 -0
- package/src/components/flat-list/index.ts +575 -0
- package/src/components/image/image-class-style.test.ts +46 -0
- package/src/components/image/index.android.ts +48 -0
- package/src/components/image/index.ios.ts +48 -0
- package/src/components/image/index.ts +3 -0
- package/src/components/image/shared.ts +478 -0
- package/src/components/image-background-class-style.test.ts +48 -0
- package/src/components/image-background-style-class.test.ts +79 -0
- package/src/components/image-background.ts +270 -0
- package/src/components/input-accessory-view.test.ts +43 -0
- package/src/components/input-accessory-view.ts +191 -0
- package/src/components/keyboard-avoiding-view.test.ts +54 -0
- package/src/components/keyboard-avoiding-view.ts +308 -0
- package/src/components/modal.test.ts +43 -0
- package/src/components/modal.ts +304 -0
- package/src/components/pressable/index.ts +371 -0
- package/src/components/pressable/pressable.test.ts +85 -0
- package/src/components/refresh-control.test.ts +41 -0
- package/src/components/refresh-control.ts +288 -0
- package/src/components/safe-area-view.test.ts +43 -0
- package/src/components/safe-area-view.ts +178 -0
- package/src/components/scroll-view/android-scroll-view-axis-projection.test.ts +123 -0
- package/src/components/scroll-view/content-container-style-class.test.ts +75 -0
- package/src/components/scroll-view/index.android.ts +190 -0
- package/src/components/scroll-view/index.ios.ts +79 -0
- package/src/components/scroll-view/index.ts +7 -0
- package/src/components/scroll-view/projection.ts +384 -0
- package/src/components/scroll-view/scroll-view-class-style.test.ts +134 -0
- package/src/components/scroll-view/scroll-view-projection.test.ts +194 -0
- package/src/components/scroll-view/shared.ts +836 -0
- package/src/components/scroll-view/sticky-header.ts +230 -0
- package/src/components/section-list/index.ts +445 -0
- package/src/components/switch/android-switch-class.test.ts +42 -0
- package/src/components/switch/index.android.ts +61 -0
- package/src/components/switch/index.ios.ts +60 -0
- package/src/components/switch/index.ts +4 -0
- package/src/components/switch/shared.ts +197 -0
- package/src/components/switch/switch.test.ts +92 -0
- package/src/components/text-input-class-style.test.ts +54 -0
- package/src/components/text-input.ts +536 -0
- package/src/components/touchable-native-feedback.test.ts +49 -0
- package/src/components/touchable-native-feedback.ts +260 -0
- package/src/components/touchable.test.ts +102 -0
- package/src/components/touchable.ts +643 -0
- package/src/components/virtualized-list/directives.ts +169 -0
- package/src/components/virtualized-list/index.ts +1204 -0
- package/src/components/virtualized-list/virtualized-list-class-style.test.ts +76 -0
- package/src/components/virtualized-section-list/directives.ts +91 -0
- package/src/components/virtualized-section-list/index.ts +598 -0
- package/src/components/virtualized-section-list/virtualized-section-list-class-style.test.ts +60 -0
- package/src/components.ts +149 -0
- package/src/create-portal.test.ts +90 -0
- package/src/create-portal.ts +74 -0
- package/src/create-tunnel.test.ts +120 -0
- package/src/create-tunnel.ts +136 -0
- package/src/descriptor-to-angular/descriptor-outlet.test.ts +94 -0
- package/src/descriptor-to-angular/index.ts +190 -0
- package/src/host-instance/host-instance.test.ts +49 -0
- package/src/host-instance/index.ts +36 -0
- package/src/index.ts +257 -0
- package/src/modules/animated/animated-scroll-view.test.ts +85 -0
- package/src/modules/animated/create-animated-component.ts +435 -0
- package/src/modules/animated/index.ts +105 -0
- package/src/modules/app-registry/app-registry.test.ts +106 -0
- package/src/modules/app-registry/index.ts +60 -0
- package/src/modules/status-bar.test.ts +50 -0
- package/src/modules/status-bar.ts +57 -0
- package/src/primitives/index.ts +119 -0
- package/src/primitives/shared.ts +191 -0
- package/src/render.test.ts +147 -0
- package/src/render.ts +224 -0
- package/src/renderer.test.ts +179 -0
- package/src/renderer.ts +407 -0
- package/src/services/color-scheme.service.ts +27 -0
- package/src/services/index.ts +2 -0
- package/src/services/services.test.ts +163 -0
- package/src/services/window-dimensions.service.ts +41 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// VirtualizedList authoring directives: the Angular-faithful equivalent of React/Vue
|
|
2
|
+
// `renderItem` / `ListHeaderComponent` / `ListFooterComponent` / `ListEmptyComponent` /
|
|
3
|
+
// `ItemSeparatorComponent`. React/Vue pass an element-returning callback; that does NOT
|
|
4
|
+
// translate to Angular, where per-item content is a TEMPLATE. So the app supplies each
|
|
5
|
+
// slot as an `<ng-template>` carrying one of these structural directives, and the list
|
|
6
|
+
// stamps the windowed slice through them. This is the per-adapter children/render split of
|
|
7
|
+
// <prop_types_split_agnostic_vs_per_adapter>: the agnostic windowing surface stays shared,
|
|
8
|
+
// only the cell-AUTHORING shape is framework-specific.
|
|
9
|
+
//
|
|
10
|
+
// Authoring API (what FlatList / SectionList build on, and what the app imports):
|
|
11
|
+
// <VirtualizedList [data]="rows" [getItem]="getItem" [getItemCount]="count">
|
|
12
|
+
// <ng-template vListItem let-item let-index="index" let-separators="separators"> … </ng-template>
|
|
13
|
+
// <ng-template vListHeader> … </ng-template>
|
|
14
|
+
// <ng-template vListFooter> … </ng-template>
|
|
15
|
+
// <ng-template vListEmpty> … </ng-template>
|
|
16
|
+
// <ng-template vListSeparator let-highlighted="highlighted" let-leadingItem="leadingItem"> … </ng-template>
|
|
17
|
+
// </VirtualizedList>
|
|
18
|
+
//
|
|
19
|
+
// `vListItem` carries a static ngTemplateContextGuard so `let-item` infers as ItemT and
|
|
20
|
+
// `let-index` / `let-separators` are typed — the Angular twin of `renderItem`'s typed info arg.
|
|
21
|
+
//
|
|
22
|
+
// VListOutletDirective is the INTERNAL renderer the list uses to stamp those templates. It is
|
|
23
|
+
// a core-only reimplementation of `@angular/common`'s NgTemplateOutlet (the adapter depends on
|
|
24
|
+
// @angular/core ONLY — see package.json), built on ViewContainerRef / TemplateRef from
|
|
25
|
+
// @angular/core: create on template change, update the embedded view's context in place on a
|
|
26
|
+
// context change (no churn of the cell's own view across windowing recomputes).
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
Directive,
|
|
30
|
+
Input,
|
|
31
|
+
TemplateRef,
|
|
32
|
+
ViewContainerRef,
|
|
33
|
+
inject,
|
|
34
|
+
type EmbeddedViewRef,
|
|
35
|
+
type OnChanges,
|
|
36
|
+
type OnDestroy,
|
|
37
|
+
type SimpleChanges,
|
|
38
|
+
} from '@angular/core';
|
|
39
|
+
import { dlog } from '@symbiote-native/engine';
|
|
40
|
+
import type { ISeparators } from '@symbiote-native/components';
|
|
41
|
+
|
|
42
|
+
let vListOutletInstanceCounter = 0;
|
|
43
|
+
|
|
44
|
+
// The context a `vListItem` template receives, mirroring RN's renderItem info arg
|
|
45
|
+
// ({ item, index, separators }). `$implicit` is the item, so `let-item` (no key) binds it.
|
|
46
|
+
export interface IVListItemContext<ItemT> {
|
|
47
|
+
$implicit: ItemT;
|
|
48
|
+
index: number;
|
|
49
|
+
separators: ISeparators;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The context a `vListSeparator` template receives, mirroring RN's ItemSeparatorComponent props
|
|
53
|
+
// (the highlight flag the cell toggles + the items flanking the gap). `$implicit` is the highlight
|
|
54
|
+
// flag, so `let-highlighted` binds it.
|
|
55
|
+
export interface IVListSeparatorContext<ItemT> {
|
|
56
|
+
$implicit: boolean;
|
|
57
|
+
highlighted: boolean;
|
|
58
|
+
leadingItem?: ItemT;
|
|
59
|
+
trailingItem?: ItemT;
|
|
60
|
+
// RN lets a row drive arbitrary separator props via separators.updateProps; they ride here.
|
|
61
|
+
[key: string]: unknown;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
65
|
+
return typeof value === 'object' && value !== null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// `<ng-template vListItem>` — the per-cell content. The static guard makes the `let-` bindings
|
|
69
|
+
// typed at the call site (let-item: ItemT, let-index: number, let-separators: ISeparators).
|
|
70
|
+
@Directive({ selector: '[vListItem]', standalone: true })
|
|
71
|
+
export class VListItemDirective<ItemT = unknown> {
|
|
72
|
+
readonly templateRef = inject<TemplateRef<IVListItemContext<ItemT>>>(TemplateRef);
|
|
73
|
+
|
|
74
|
+
static ngTemplateContextGuard<T>(
|
|
75
|
+
_dir: VListItemDirective<T>,
|
|
76
|
+
_ctx: unknown,
|
|
77
|
+
): _ctx is IVListItemContext<T> {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// `<ng-template vListHeader>` — rendered once above the cells (RN ListHeaderComponent).
|
|
83
|
+
@Directive({ selector: '[vListHeader]', standalone: true })
|
|
84
|
+
export class VListHeaderDirective {
|
|
85
|
+
readonly templateRef = inject(TemplateRef);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// `<ng-template vListFooter>` — rendered once below the cells (RN ListFooterComponent).
|
|
89
|
+
@Directive({ selector: '[vListFooter]', standalone: true })
|
|
90
|
+
export class VListFooterDirective {
|
|
91
|
+
readonly templateRef = inject(TemplateRef);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// `<ng-template vListEmpty>` — rendered in place of the cells when the list is empty
|
|
95
|
+
// (RN ListEmptyComponent).
|
|
96
|
+
@Directive({ selector: '[vListEmpty]', standalone: true })
|
|
97
|
+
export class VListEmptyDirective {
|
|
98
|
+
readonly templateRef = inject(TemplateRef);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// `<ng-template vListSeparator>` — rendered between cells (RN ItemSeparatorComponent). The guard
|
|
102
|
+
// types the `let-` bindings against the separator props.
|
|
103
|
+
@Directive({ selector: '[vListSeparator]', standalone: true })
|
|
104
|
+
export class VListSeparatorDirective<ItemT = unknown> {
|
|
105
|
+
readonly templateRef = inject<TemplateRef<IVListSeparatorContext<ItemT>>>(TemplateRef);
|
|
106
|
+
|
|
107
|
+
static ngTemplateContextGuard<T>(
|
|
108
|
+
_dir: VListSeparatorDirective<T>,
|
|
109
|
+
_ctx: unknown,
|
|
110
|
+
): _ctx is IVListSeparatorContext<T> {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Core-only NgTemplateOutlet twin. The adapter cannot import @angular/common's NgTemplateOutlet
|
|
116
|
+
// (not a dependency), so the list stamps templates through this: it creates the embedded view when
|
|
117
|
+
// the template changes and updates the live view's context IN PLACE on a context change, so a
|
|
118
|
+
// windowing recompute (a fresh context object every CD) refreshes the cell without tearing it down.
|
|
119
|
+
@Directive({ selector: '[vListOutlet]', standalone: true })
|
|
120
|
+
export class VListOutletDirective<C = unknown> implements OnChanges, OnDestroy {
|
|
121
|
+
@Input({ alias: 'vListOutlet' }) templateRef?: TemplateRef<C>;
|
|
122
|
+
@Input({ alias: 'vListOutletContext' }) context?: C;
|
|
123
|
+
|
|
124
|
+
private viewRef: EmbeddedViewRef<C> | null = null;
|
|
125
|
+
private readonly viewContainer = inject(ViewContainerRef);
|
|
126
|
+
private readonly instanceId = (vListOutletInstanceCounter += 1);
|
|
127
|
+
|
|
128
|
+
ngOnChanges(changes: SimpleChanges): void {
|
|
129
|
+
if (changes['templateRef'] !== undefined) {
|
|
130
|
+
dlog(
|
|
131
|
+
`Angular VListOutlet#${this.instanceId} templateRef CHANGED (was=${changes['templateRef'].previousValue !== undefined} now=${this.templateRef !== undefined}) -> clear + recreate`,
|
|
132
|
+
);
|
|
133
|
+
this.viewContainer.clear();
|
|
134
|
+
this.viewRef =
|
|
135
|
+
this.templateRef === undefined
|
|
136
|
+
? null
|
|
137
|
+
: this.viewContainer.createEmbeddedView(this.templateRef, this.context);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (this.viewRef !== null && this.context !== undefined) {
|
|
141
|
+
dlog(`Angular VListOutlet#${this.instanceId} context updated, markForCheck`);
|
|
142
|
+
this.updateContext(this.viewRef.context, this.context);
|
|
143
|
+
this.viewRef.markForCheck();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
ngOnDestroy(): void {
|
|
148
|
+
dlog(`Angular VListOutlet#${this.instanceId} destroyed`);
|
|
149
|
+
this.viewContainer.clear();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Copy the new context's fields onto the live embedded view's context object (whose identity the
|
|
153
|
+
// consumer's `let-` bindings already read), dropping keys that disappeared. The generic `C` can't
|
|
154
|
+
// be index-WRITTEN even once narrowed (TS2862), so the copy runs in a non-generic helper the
|
|
155
|
+
// guarded records flow into — no cast (NgTemplateOutlet does the same copy via `as any`).
|
|
156
|
+
private updateContext(viewContext: C, nextContext: C): void {
|
|
157
|
+
if (!isRecord(viewContext) || !isRecord(nextContext)) return;
|
|
158
|
+
copyContextFields(viewContext, nextContext);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function copyContextFields(target: Record<string, unknown>, source: Record<string, unknown>): void {
|
|
163
|
+
for (const key of Object.keys(target)) {
|
|
164
|
+
if (!(key in source)) delete target[key];
|
|
165
|
+
}
|
|
166
|
+
for (const key of Object.keys(source)) {
|
|
167
|
+
target[key] = source[key];
|
|
168
|
+
}
|
|
169
|
+
}
|