@ng-native/components 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -1
  3. package/dist/activity-indicator.d.ts +41 -0
  4. package/dist/activity-indicator.js +66 -0
  5. package/dist/activity-indicator.js.map +1 -0
  6. package/dist/animated-style.d.ts +31 -0
  7. package/dist/animated-style.js +102 -0
  8. package/dist/animated-style.js.map +1 -0
  9. package/dist/animated.d.ts +125 -0
  10. package/dist/animated.js +538 -0
  11. package/dist/animated.js.map +1 -0
  12. package/dist/animation.d.ts +40 -0
  13. package/dist/animation.js +20 -0
  14. package/dist/animation.js.map +1 -0
  15. package/dist/animations-web.d.ts +8 -0
  16. package/dist/animations-web.js +31 -0
  17. package/dist/animations-web.js.map +1 -0
  18. package/dist/animations.d.ts +7 -0
  19. package/dist/animations.js +58 -0
  20. package/dist/animations.js.map +1 -0
  21. package/dist/controlled-model.d.ts +33 -0
  22. package/dist/controlled-model.js +47 -0
  23. package/dist/controlled-model.js.map +1 -0
  24. package/dist/easing.d.ts +21 -0
  25. package/dist/easing.js +50 -0
  26. package/dist/easing.js.map +1 -0
  27. package/dist/events.d.ts +169 -0
  28. package/dist/events.js +2 -0
  29. package/dist/events.js.map +1 -0
  30. package/dist/gesture-backend.d.ts +26 -0
  31. package/dist/gesture-backend.js +14 -0
  32. package/dist/gesture-backend.js.map +1 -0
  33. package/dist/gesture-dispatch.d.ts +67 -0
  34. package/dist/gesture-dispatch.js +106 -0
  35. package/dist/gesture-dispatch.js.map +1 -0
  36. package/dist/gestures.d.ts +23 -0
  37. package/dist/gestures.js +164 -0
  38. package/dist/gestures.js.map +1 -0
  39. package/dist/height-index.d.ts +31 -0
  40. package/dist/height-index.js +80 -0
  41. package/dist/height-index.js.map +1 -0
  42. package/dist/image-background.d.ts +32 -0
  43. package/dist/image-background.js +80 -0
  44. package/dist/image-background.js.map +1 -0
  45. package/dist/image.d.ts +79 -0
  46. package/dist/image.js +155 -0
  47. package/dist/image.js.map +1 -0
  48. package/dist/index.d.ts +38 -0
  49. package/dist/index.js +39 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/input-accessory-view.d.ts +16 -0
  52. package/dist/input-accessory-view.js +29 -0
  53. package/dist/input-accessory-view.js.map +1 -0
  54. package/dist/keyboard-avoiding-view.d.ts +79 -0
  55. package/dist/keyboard-avoiding-view.js +172 -0
  56. package/dist/keyboard-avoiding-view.js.map +1 -0
  57. package/dist/keyboard-dock.d.ts +126 -0
  58. package/dist/keyboard-dock.js +327 -0
  59. package/dist/keyboard-dock.js.map +1 -0
  60. package/dist/keyboard-taps.d.ts +12 -0
  61. package/dist/keyboard-taps.js +51 -0
  62. package/dist/keyboard-taps.js.map +1 -0
  63. package/dist/modal.d.ts +56 -0
  64. package/dist/modal.js +102 -0
  65. package/dist/modal.js.map +1 -0
  66. package/dist/native-gesture.d.ts +21 -0
  67. package/dist/native-gesture.js +56 -0
  68. package/dist/native-gesture.js.map +1 -0
  69. package/dist/native-ref.d.ts +7 -0
  70. package/dist/native-ref.js +13 -0
  71. package/dist/native-ref.js.map +1 -0
  72. package/dist/pressable.d.ts +220 -0
  73. package/dist/pressable.js +484 -0
  74. package/dist/pressable.js.map +1 -0
  75. package/dist/reanimated.d.ts +19 -0
  76. package/dist/reanimated.js +111 -0
  77. package/dist/reanimated.js.map +1 -0
  78. package/dist/refresh-control.d.ts +50 -0
  79. package/dist/refresh-control.js +103 -0
  80. package/dist/refresh-control.js.map +1 -0
  81. package/dist/safe-area-provider.d.ts +11 -0
  82. package/dist/safe-area-provider.js +70 -0
  83. package/dist/safe-area-provider.js.map +1 -0
  84. package/dist/safe-area-view.d.ts +22 -0
  85. package/dist/safe-area-view.js +77 -0
  86. package/dist/safe-area-view.js.map +1 -0
  87. package/dist/safe-area.d.ts +12 -0
  88. package/dist/safe-area.js +27 -0
  89. package/dist/safe-area.js.map +1 -0
  90. package/dist/scroll-view-props.d.ts +89 -0
  91. package/dist/scroll-view-props.js +153 -0
  92. package/dist/scroll-view-props.js.map +1 -0
  93. package/dist/scroll-view.d.ts +95 -0
  94. package/dist/scroll-view.js +181 -0
  95. package/dist/scroll-view.js.map +1 -0
  96. package/dist/section-list.d.ts +146 -0
  97. package/dist/section-list.js +300 -0
  98. package/dist/section-list.js.map +1 -0
  99. package/dist/sticky-headers.d.ts +41 -0
  100. package/dist/sticky-headers.js +118 -0
  101. package/dist/sticky-headers.js.map +1 -0
  102. package/dist/swipe-refresh-layout.d.ts +51 -0
  103. package/dist/swipe-refresh-layout.js +162 -0
  104. package/dist/swipe-refresh-layout.js.map +1 -0
  105. package/dist/switch.d.ts +54 -0
  106. package/dist/switch.js +110 -0
  107. package/dist/switch.js.map +1 -0
  108. package/dist/template-slot.d.ts +18 -0
  109. package/dist/template-slot.js +30 -0
  110. package/dist/template-slot.js.map +1 -0
  111. package/dist/text-input.d.ts +168 -0
  112. package/dist/text-input.js +312 -0
  113. package/dist/text-input.js.map +1 -0
  114. package/dist/text.d.ts +70 -0
  115. package/dist/text.js +111 -0
  116. package/dist/text.js.map +1 -0
  117. package/dist/touchable-opacity.d.ts +36 -0
  118. package/dist/touchable-opacity.js +76 -0
  119. package/dist/touchable-opacity.js.map +1 -0
  120. package/dist/transforms.d.ts +2 -0
  121. package/dist/transforms.js +17 -0
  122. package/dist/transforms.js.map +1 -0
  123. package/dist/view-base.d.ts +332 -0
  124. package/dist/view-base.js +534 -0
  125. package/dist/view-base.js.map +1 -0
  126. package/dist/view.d.ts +12 -0
  127. package/dist/view.js +18 -0
  128. package/dist/view.js.map +1 -0
  129. package/dist/virtual-list.d.ts +530 -0
  130. package/dist/virtual-list.js +1150 -0
  131. package/dist/virtual-list.js.map +1 -0
  132. package/dist/worklet-scroll.d.ts +13 -0
  133. package/dist/worklet-scroll.js +49 -0
  134. package/dist/worklet-scroll.js.map +1 -0
  135. package/dist/worklet-style.d.ts +13 -0
  136. package/dist/worklet-style.js +47 -0
  137. package/dist/worklet-style.js.map +1 -0
  138. package/dist/worklets.d.ts +89 -0
  139. package/dist/worklets.js +42 -0
  140. package/dist/worklets.js.map +1 -0
  141. package/dist/written-props.d.ts +6 -0
  142. package/dist/written-props.js +180 -0
  143. package/dist/written-props.js.map +1 -0
  144. package/package.json +88 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ashley Hunter
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,80 @@
1
1
  # @ng-native/components
2
2
 
3
- A placeholder: this version has no code. See https://ng-native.com.
3
+ The React Native element set as Angular components: `<view>`, `<text>`, `<scroll-view>`,
4
+ `<text-input>` and the rest, each committing as a real native view through React Native's Fabric
5
+ renderer.
6
+
7
+ Alpha: APIs may change before 1.0.
8
+
9
+ ## Install
10
+
11
+ Most apps start from `npx create-expo-app@latest my-app --template @ng-native/template`, which
12
+ already has this and its peers set up. Otherwise:
13
+
14
+ ```sh
15
+ npm install @ng-native/components
16
+ npm install @angular/core react-native
17
+ ```
18
+
19
+ `react-native-gesture-handler` and `react-native-reanimated` are optional peers, needed only for
20
+ gestures and Reanimated worklets.
21
+
22
+ ## Example
23
+
24
+ ```ts
25
+ import { Component, input } from '@angular/core';
26
+ import { View, Text } from '@ng-native/components';
27
+
28
+ @Component({
29
+ selector: 'app-greeting',
30
+ imports: [View, Text],
31
+ template: `
32
+ <view>
33
+ <text>Hello, {{ name() }}</text>
34
+ </view>
35
+ `,
36
+ })
37
+ export class Greeting {
38
+ readonly name = input('there');
39
+ }
40
+ ```
41
+
42
+ A template that writes `<scroll-view>` needs `ScrollView` in its `imports`; without it, the element
43
+ renders as a plain, unstyled view and logs a console warning in development.
44
+
45
+ ## What's in the package
46
+
47
+ - `.` - `View`, `Text`, `ScrollView`, `TextInput`, `Pressable`, `Image`, `Switch`,
48
+ `ActivityIndicator`, `Modal`, `VirtualList`, `SafeAreaProvider`, `SafeAreaView`, and the event
49
+ payload types (`LayoutEvent`, `TouchEvent`, `ScrollEvent`, and more).
50
+ - `./gestures.ts` - React Native Gesture Handler bindings.
51
+ - `./animations.ts` - `AnimatedStyle`, `Animated` and `Easing`: React Native's graph on a device,
52
+ a React-free one with the same API in a browser build.
53
+ - `./reanimated.ts` - Reanimated worklet bindings.
54
+
55
+ These three are separate entry points because each reaches into React Native's own uncompiled
56
+ source, which Node cannot parse; importing them from the main entry point would break loading this
57
+ package under Node (tests, tooling).
58
+
59
+ ## Docs
60
+
61
+ - [Components](https://ng-native.com/packages/components)
62
+ - [Layout](https://ng-native.com/packages/components/layout),
63
+ [scroll view](https://ng-native.com/packages/components/scroll-view),
64
+ [keyboard-avoiding view](https://ng-native.com/packages/components/keyboard-avoiding-view),
65
+ [lists](https://ng-native.com/packages/components/lists),
66
+ [text](https://ng-native.com/packages/components/text),
67
+ [image](https://ng-native.com/packages/components/image),
68
+ [activity indicator](https://ng-native.com/packages/components/activity-indicator),
69
+ [text input](https://ng-native.com/packages/components/input),
70
+ [switch](https://ng-native.com/packages/components/switch),
71
+ [pressable](https://ng-native.com/packages/components/pressable),
72
+ [gestures](https://ng-native.com/packages/components/gestures),
73
+ [modal](https://ng-native.com/packages/components/modal) and
74
+ [animation](https://ng-native.com/packages/components/animation)
75
+ - [Root README](https://github.com/ng-native/ng-native/blob/main/README.md) and
76
+ [ARCHITECTURE.md](https://github.com/ng-native/ng-native/blob/main/ARCHITECTURE.md)
77
+
78
+ ## License
79
+
80
+ MIT
@@ -0,0 +1,41 @@
1
+ import { ViewBase } from './view-base.ts';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * A spinner. Commits as `ActivityIndicatorView` on iOS and `AndroidProgressBar` on Android.
5
+ *
6
+ * RN's wrapper gives the native view an explicit size: the native component has no intrinsic
7
+ * dimensions, so without one it stretches to fill whatever space its parent offers. That
8
+ * failure is invisible, since the spinner still draws at its natural size in the middle of the
9
+ * stretched box, but the box swallows gestures across its whole width.
10
+ */
11
+ export declare class ActivityIndicator extends ViewBase {
12
+ /** `small` and `large` match RN's 20 and 36 points; a number sets both dimensions. */
13
+ readonly size: import("@angular/core").InputSignal<number | "small" | "large">;
14
+ /** Whether the spinner turns. Defaults to true. */
15
+ readonly animating: import("@angular/core").InputSignalWithTransform<boolean | undefined, unknown>;
16
+ /** The spinner's colour. */
17
+ readonly color: import("@angular/core").InputSignal<string | undefined>;
18
+ /** iOS: hide the spinner when `animating` is false rather than showing it still. */
19
+ readonly hidesWhenStopped: import("@angular/core").InputSignalWithTransform<boolean | undefined, unknown>;
20
+ protected readonly nativeSize: import("@angular/core").Signal<"small" | "large">;
21
+ /**
22
+ * Android only, and not optional there.
23
+ *
24
+ * `AndroidProgressBar` picks its drawable from `styleAttr`, and has no default: the native view
25
+ * throws `setStyle() not called` out of its own update pass if the first commit arrives without
26
+ * one, which takes the whole screen down. RN's wrapper sends `Normal` for every size and lets
27
+ * the box above do the sizing, so this sends the same rather than mapping `large` onto
28
+ * `progressBarStyleLarge` and diverging. `indeterminate` is required by the same spec.
29
+ *
30
+ * Both stay `undefined` on iOS, where `ActivityIndicatorView` has neither prop and an undefined
31
+ * input never reaches native.
32
+ */
33
+ protected readonly styleAttr: string | undefined;
34
+ protected readonly indeterminate: boolean | undefined;
35
+ protected readonly sizeStyle: import("@angular/core").Signal<{
36
+ width: number;
37
+ height: number;
38
+ }>;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActivityIndicator, never>;
40
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ActivityIndicator, "activity-indicator", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "animating": { "alias": "animating"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "hidesWhenStopped": { "alias": "hidesWhenStopped"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
41
+ }
@@ -0,0 +1,66 @@
1
+ import { Directive, computed, input } from '@angular/core';
2
+ import { nativePlatform } from '@ng-native/fabric';
3
+ import { optionalBoolean } from "./transforms.js";
4
+ import { ViewBase } from "./view-base.js";
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * A spinner. Commits as `ActivityIndicatorView` on iOS and `AndroidProgressBar` on Android.
8
+ *
9
+ * RN's wrapper gives the native view an explicit size: the native component has no intrinsic
10
+ * dimensions, so without one it stretches to fill whatever space its parent offers. That
11
+ * failure is invisible, since the spinner still draws at its natural size in the middle of the
12
+ * stretched box, but the box swallows gestures across its whole width.
13
+ */
14
+ export class ActivityIndicator extends ViewBase {
15
+ /** `small` and `large` match RN's 20 and 36 points; a number sets both dimensions. */
16
+ size = input('small', /* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
18
+ /** Whether the spinner turns. Defaults to true. */
19
+ animating = input(undefined, { ...(ngDevMode ? { debugName: "animating" } : /* istanbul ignore next */ {}), transform: optionalBoolean });
20
+ /** The spinner's colour. */
21
+ color = input(/* @ts-ignore */
22
+ ...(ngDevMode ? [undefined, { debugName: "color" }] : /* istanbul ignore next */ []));
23
+ /** iOS: hide the spinner when `animating` is false rather than showing it still. */
24
+ hidesWhenStopped = input(undefined, { ...(ngDevMode ? { debugName: "hidesWhenStopped" } : /* istanbul ignore next */ {}), transform: optionalBoolean });
25
+ nativeSize = computed(() => (this.size() === 'large' ? 'large' : 'small'), /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "nativeSize" }] : /* istanbul ignore next */ []));
27
+ /**
28
+ * Android only, and not optional there.
29
+ *
30
+ * `AndroidProgressBar` picks its drawable from `styleAttr`, and has no default: the native view
31
+ * throws `setStyle() not called` out of its own update pass if the first commit arrives without
32
+ * one, which takes the whole screen down. RN's wrapper sends `Normal` for every size and lets
33
+ * the box above do the sizing, so this sends the same rather than mapping `large` onto
34
+ * `progressBarStyleLarge` and diverging. `indeterminate` is required by the same spec.
35
+ *
36
+ * Both stay `undefined` on iOS, where `ActivityIndicatorView` has neither prop and an undefined
37
+ * input never reaches native.
38
+ */
39
+ styleAttr = nativePlatform() === 'android' ? 'Normal' : undefined;
40
+ indeterminate = nativePlatform() === 'android' ? true : undefined;
41
+ sizeStyle = computed(() => {
42
+ const size = this.size();
43
+ if (typeof size === 'number')
44
+ return { width: size, height: size };
45
+ return size === 'large' ? { width: 36, height: 36 } : { width: 20, height: 20 };
46
+ }, /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "sizeStyle" }] : /* istanbul ignore next */ []));
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.0", ngImport: i0, type: ActivityIndicator, deps: null, target: i0.ɵɵFactoryTarget.Directive });
49
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.2.0", type: ActivityIndicator, isStandalone: true, selector: "activity-indicator", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, animating: { classPropertyName: "animating", publicName: "animating", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, hidesWhenStopped: { classPropertyName: "hidesWhenStopped", publicName: "hidesWhenStopped", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style": "sizeStyle()", "size": "nativeSize()", "animating": "animating()", "color": "color()", "hidesWhenStopped": "hidesWhenStopped()", "styleAttr": "styleAttr", "indeterminate": "indeterminate" } }, usesInheritance: true, ngImport: i0 });
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.0", ngImport: i0, type: ActivityIndicator, decorators: [{
52
+ type: Directive,
53
+ args: [{
54
+ selector: 'activity-indicator',
55
+ host: {
56
+ '[style]': 'sizeStyle()',
57
+ '[size]': 'nativeSize()',
58
+ '[animating]': 'animating()',
59
+ '[color]': 'color()',
60
+ '[hidesWhenStopped]': 'hidesWhenStopped()',
61
+ '[styleAttr]': 'styleAttr',
62
+ '[indeterminate]': 'indeterminate',
63
+ },
64
+ }]
65
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], animating: [{ type: i0.Input, args: [{ isSignal: true, alias: "animating", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], hidesWhenStopped: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidesWhenStopped", required: false }] }] } });
66
+ //# sourceMappingURL=activity-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-indicator.js","sourceRoot":"","sources":["../src/activity-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;;AAE1C;;;;;;;GAOG;AAaH,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,sFAAsF;IAC7E,IAAI,GAAG,KAAK,CAA6B,OAAO;6EAAC,CAAC;IAC3D,mDAAmD;IAC1C,SAAS,GAAG,KAAK,CAAC,SAAS,iFAAI,SAAS,EAAE,eAAe,GAAG,CAAC;IACtE,4BAA4B;IACnB,KAAK,GAAG,KAAK;yFAAU,CAAC;IACjC,oFAAoF;IAC3E,gBAAgB,GAAG,KAAK,CAAC,SAAS,wFAAI,SAAS,EAAE,eAAe,GAAG,CAAC;IAE1D,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;mFAAC,CAAC;IAE9F;;;;;;;;;;;OAWG;IACgB,SAAS,GAAG,cAAc,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,aAAa,GAAG,cAAc,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAElE,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnE,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClF,CAAC;kFAAC,CAAC;uGA/BQ,iBAAiB;2FAAjB,iBAAiB;;2FAAjB,iBAAiB;kBAZ7B,SAAS;mBAAC;oBACT,QAAQ,EAAE,oBAAoB;oBAC9B,IAAI,EAAE;wBACJ,SAAS,EAAE,aAAa;wBACxB,QAAQ,EAAE,cAAc;wBACxB,aAAa,EAAE,aAAa;wBAC5B,SAAS,EAAE,SAAS;wBACpB,oBAAoB,EAAE,oBAAoB;wBAC1C,aAAa,EAAE,WAAW;wBAC1B,iBAAiB,EAAE,eAAe;qBACnC;iBACF","sourcesContent":["import { Directive, computed, input } from '@angular/core';\nimport { nativePlatform } from '@ng-native/fabric';\nimport { optionalBoolean } from './transforms.ts';\nimport { ViewBase } from './view-base.ts';\n\n/**\n * A spinner. Commits as `ActivityIndicatorView` on iOS and `AndroidProgressBar` on Android.\n *\n * RN's wrapper gives the native view an explicit size: the native component has no intrinsic\n * dimensions, so without one it stretches to fill whatever space its parent offers. That\n * failure is invisible, since the spinner still draws at its natural size in the middle of the\n * stretched box, but the box swallows gestures across its whole width.\n */\n@Directive({\n selector: 'activity-indicator',\n host: {\n '[style]': 'sizeStyle()',\n '[size]': 'nativeSize()',\n '[animating]': 'animating()',\n '[color]': 'color()',\n '[hidesWhenStopped]': 'hidesWhenStopped()',\n '[styleAttr]': 'styleAttr',\n '[indeterminate]': 'indeterminate',\n },\n})\nexport class ActivityIndicator extends ViewBase {\n /** `small` and `large` match RN's 20 and 36 points; a number sets both dimensions. */\n readonly size = input<'small' | 'large' | number>('small');\n /** Whether the spinner turns. Defaults to true. */\n readonly animating = input(undefined, { transform: optionalBoolean });\n /** The spinner's colour. */\n readonly color = input<string>();\n /** iOS: hide the spinner when `animating` is false rather than showing it still. */\n readonly hidesWhenStopped = input(undefined, { transform: optionalBoolean });\n\n protected readonly nativeSize = computed(() => (this.size() === 'large' ? 'large' : 'small'));\n\n /**\n * Android only, and not optional there.\n *\n * `AndroidProgressBar` picks its drawable from `styleAttr`, and has no default: the native view\n * throws `setStyle() not called` out of its own update pass if the first commit arrives without\n * one, which takes the whole screen down. RN's wrapper sends `Normal` for every size and lets\n * the box above do the sizing, so this sends the same rather than mapping `large` onto\n * `progressBarStyleLarge` and diverging. `indeterminate` is required by the same spec.\n *\n * Both stay `undefined` on iOS, where `ActivityIndicatorView` has neither prop and an undefined\n * input never reaches native.\n */\n protected readonly styleAttr = nativePlatform() === 'android' ? 'Normal' : undefined;\n protected readonly indeterminate = nativePlatform() === 'android' ? true : undefined;\n\n protected readonly sizeStyle = computed(() => {\n const size = this.size();\n if (typeof size === 'number') return { width: size, height: size };\n return size === 'large' ? { width: 36, height: 36 } : { width: 20, height: 20 };\n });\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * The behaviour, with the graph left as a dependency so it can be driven by a fake. `AnimatedStyle`
4
+ * in `../animations.ts` is the one apps import: same selector, and it supplies the real graph
5
+ * itself - React Native's on a device, `animated.ts` in a browser - so importing the directive is
6
+ * the whole setup.
7
+ */
8
+ export declare class AnimatedStyleBase {
9
+ private readonly node;
10
+ private readonly engine;
11
+ private readonly animation;
12
+ /** A style object whose values may be animated nodes, plain numbers, or a mix. */
13
+ readonly animatedStyle: import("@angular/core").InputSignal<Record<string, unknown>>;
14
+ private handle;
15
+ private connected;
16
+ constructor();
17
+ /**
18
+ * One JavaScript-driven frame. Also the first chance to hand over the react tag: a node has
19
+ * one only after it has been committed, and this runs after at least one commit has happened.
20
+ */
21
+ private frame;
22
+ private write;
23
+ /**
24
+ * Hand the graph the react tag, once there is one. Calling this before an animation starts is
25
+ * the point: React Native connects the view now if the graph is already native, and remembers
26
+ * it for the moment an animation with the native driver takes over.
27
+ */
28
+ private connect;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<AnimatedStyleBase, never>;
30
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AnimatedStyleBase, "[animatedStyle]", never, { "animatedStyle": { "alias": "animatedStyle"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
31
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Binds a style holding animated values to the element it sits on: the Angular equivalent of
3
+ * React Native's `createAnimatedComponent`.
4
+ *
5
+ * ```html
6
+ * <view [animatedStyle]="{ opacity: fade, transform: [{ translateY: slide }] }">
7
+ * ```
8
+ *
9
+ * Two drivers, and the difference is where the work happens. With `useNativeDriver: true` the
10
+ * whole animation runs on the UI thread: this hands the graph the element's react tag once and
11
+ * then does nothing per frame, so the animation keeps its frame rate with the JavaScript thread
12
+ * blocked. Without it, every frame calls back here and is written to the node. A browser has only
13
+ * the second kind: `animations-web.ts` supplies a graph that is JavaScript-driven throughout, and
14
+ * `useNativeDriver` there changes nothing.
15
+ *
16
+ * A JavaScript frame commits outside change detection, one of the two exceptions to committing at
17
+ * most once per change-detection pass (the other is a CSS transition). It has to: the graph advances on its own schedule, and waiting for the next change
18
+ * detection pass would drop the frame. The commit is incremental like any other, and touches
19
+ * only the nodes the frame changed.
20
+ */
21
+ import { Directive, ElementRef, afterNextRender, effect, inject, input, untracked, } from '@angular/core';
22
+ import { Engine, HostEngine } from '@ng-native/fabric';
23
+ import { ANIMATION } from "./animation.js";
24
+ import * as i0 from "@angular/core";
25
+ /**
26
+ * The behaviour, with the graph left as a dependency so it can be driven by a fake. `AnimatedStyle`
27
+ * in `../animations.ts` is the one apps import: same selector, and it supplies the real graph
28
+ * itself - React Native's on a device, `animated.ts` in a browser - so importing the directive is
29
+ * the whole setup.
30
+ */
31
+ export class AnimatedStyleBase {
32
+ node = inject(ElementRef).nativeElement;
33
+ // The shared host seam, read off the node as every primitive reads it, so a browser host serves
34
+ // this as well as Fabric does. Only the react tag is Fabric's own, and `connect()` asks for it.
35
+ engine = this.node.host ?? inject(HostEngine);
36
+ animation = inject(ANIMATION);
37
+ /** A style object whose values may be animated nodes, plain numbers, or a mix. */
38
+ animatedStyle = input.required(/* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "animatedStyle" }] : /* istanbul ignore next */ []));
40
+ handle = null;
41
+ connected = false;
42
+ constructor() {
43
+ // A node has a react tag only once it has been committed, and a native-driven animation
44
+ // never calls back into JavaScript, so there would otherwise be no moment to hand it over.
45
+ afterNextRender(() => this.connect());
46
+ effect((onCleanup) => {
47
+ const style = this.animatedStyle();
48
+ const handle = this.animation.props(style, () => untracked(() => this.frame()));
49
+ this.handle = handle;
50
+ this.connected = false;
51
+ handle.attach();
52
+ // The starting values, so the element is right before anything animates. This runs inside
53
+ // change detection, so the commit it needs is the ordinary one.
54
+ this.write(handle.read());
55
+ onCleanup(() => {
56
+ handle.detach();
57
+ if (this.handle === handle)
58
+ this.handle = null;
59
+ });
60
+ });
61
+ }
62
+ /**
63
+ * One JavaScript-driven frame. Also the first chance to hand over the react tag: a node has
64
+ * one only after it has been committed, and this runs after at least one commit has happened.
65
+ */
66
+ frame() {
67
+ const handle = this.handle;
68
+ if (!handle)
69
+ return;
70
+ this.write(handle.read());
71
+ this.engine.commit();
72
+ }
73
+ write(values) {
74
+ const current = this.node.props['style'] ?? {};
75
+ this.engine.setProp(this.node, 'style', { ...current, ...values });
76
+ this.connect();
77
+ }
78
+ /**
79
+ * Hand the graph the react tag, once there is one. Calling this before an animation starts is
80
+ * the point: React Native connects the view now if the graph is already native, and remembers
81
+ * it for the moment an animation with the native driver takes over.
82
+ */
83
+ connect() {
84
+ if (this.connected)
85
+ return;
86
+ // A browser has no native driver to hand a view to, so there is no tag to look for.
87
+ if (!(this.engine instanceof Engine))
88
+ return;
89
+ const tag = this.engine.tagOf(this.node);
90
+ if (tag === null)
91
+ return;
92
+ this.handle?.connect(tag);
93
+ this.connected = true;
94
+ }
95
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.0", ngImport: i0, type: AnimatedStyleBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
96
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.2.0", type: AnimatedStyleBase, isStandalone: true, selector: "[animatedStyle]", inputs: { animatedStyle: { classPropertyName: "animatedStyle", publicName: "animatedStyle", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.0", ngImport: i0, type: AnimatedStyleBase, decorators: [{
99
+ type: Directive,
100
+ args: [{ selector: '[animatedStyle]' }]
101
+ }], ctorParameters: () => [], propDecorators: { animatedStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "animatedStyle", required: true }] }] } });
102
+ //# sourceMappingURL=animated-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-style.js","sourceRoot":"","sources":["../src/animated-style.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Binds a style holding animated values to the element it sits on: the Angular equivalent of\n * React Native's `createAnimatedComponent`.\n *\n * ```html\n * <view [animatedStyle]=\"{ opacity: fade, transform: [{ translateY: slide }] }\">\n * ```\n *\n * Two drivers, and the difference is where the work happens. With `useNativeDriver: true` the\n * whole animation runs on the UI thread: this hands the graph the element's react tag once and\n * then does nothing per frame, so the animation keeps its frame rate with the JavaScript thread\n * blocked. Without it, every frame calls back here and is written to the node. A browser has only\n * the second kind: `animations-web.ts` supplies a graph that is JavaScript-driven throughout, and\n * `useNativeDriver` there changes nothing.\n *\n * A JavaScript frame commits outside change detection, one of the two exceptions to committing at\n * most once per change-detection pass (the other is a CSS transition). It has to: the graph advances on its own schedule, and waiting for the next change\n * detection pass would drop the frame. The commit is incremental like any other, and touches\n * only the nodes the frame changed.\n */\nimport {\n Directive,\n ElementRef,\n afterNextRender,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport { Engine, HostEngine, type EngineNode, type HostNode } from '@ng-native/fabric';\nimport { ANIMATION, type AnimatedPropsHandle } from './animation.ts';\n\n/**\n * The behaviour, with the graph left as a dependency so it can be driven by a fake. `AnimatedStyle`\n * in `../animations.ts` is the one apps import: same selector, and it supplies the real graph\n * itself - React Native's on a device, `animated.ts` in a browser - so importing the directive is\n * the whole setup.\n */\n@Directive({ selector: '[animatedStyle]' })\nexport class AnimatedStyleBase {\n private readonly node = inject(ElementRef).nativeElement as HostNode;\n // The shared host seam, read off the node as every primitive reads it, so a browser host serves\n // this as well as Fabric does. Only the react tag is Fabric's own, and `connect()` asks for it.\n private readonly engine = this.node.host ?? inject(HostEngine);\n private readonly animation = inject(ANIMATION);\n\n /** A style object whose values may be animated nodes, plain numbers, or a mix. */\n readonly animatedStyle = input.required<Record<string, unknown>>();\n\n private handle: AnimatedPropsHandle | null = null;\n private connected = false;\n\n constructor() {\n // A node has a react tag only once it has been committed, and a native-driven animation\n // never calls back into JavaScript, so there would otherwise be no moment to hand it over.\n afterNextRender(() => this.connect());\n\n effect((onCleanup) => {\n const style = this.animatedStyle();\n const handle = this.animation.props(style, () => untracked(() => this.frame()));\n this.handle = handle;\n this.connected = false;\n handle.attach();\n // The starting values, so the element is right before anything animates. This runs inside\n // change detection, so the commit it needs is the ordinary one.\n this.write(handle.read());\n\n onCleanup(() => {\n handle.detach();\n if (this.handle === handle) this.handle = null;\n });\n });\n }\n\n /**\n * One JavaScript-driven frame. Also the first chance to hand over the react tag: a node has\n * one only after it has been committed, and this runs after at least one commit has happened.\n */\n private frame(): void {\n const handle = this.handle;\n if (!handle) return;\n this.write(handle.read());\n this.engine.commit();\n }\n\n private write(values: Record<string, unknown>): void {\n const current = (this.node.props['style'] as Record<string, unknown> | undefined) ?? {};\n this.engine.setProp(this.node, 'style', { ...current, ...values });\n this.connect();\n }\n\n /**\n * Hand the graph the react tag, once there is one. Calling this before an animation starts is\n * the point: React Native connects the view now if the graph is already native, and remembers\n * it for the moment an animation with the native driver takes over.\n */\n private connect(): void {\n if (this.connected) return;\n // A browser has no native driver to hand a view to, so there is no tag to look for.\n if (!(this.engine instanceof Engine)) return;\n const tag = this.engine.tagOf(this.node as EngineNode);\n if (tag === null) return;\n this.handle?.connect(tag);\n this.connected = true;\n }\n}\n"]}
@@ -0,0 +1,125 @@
1
+ import type { AnimationBackend } from './animation.ts';
2
+ import { type EasingFunction } from './easing.ts';
3
+ export interface EndResult {
4
+ finished: boolean;
5
+ }
6
+ export type EndCallback = (result: EndResult) => void;
7
+ /** What `Animated.timing` and the rest hand back, as React Native's do. */
8
+ export interface CompositeAnimation {
9
+ start(callback?: EndCallback): void;
10
+ stop(): void;
11
+ reset(): void;
12
+ }
13
+ type Extrapolate = 'extend' | 'clamp' | 'identity';
14
+ export interface InterpolationConfig {
15
+ inputRange: readonly number[];
16
+ outputRange: readonly (number | string)[];
17
+ easing?: EasingFunction;
18
+ extrapolate?: Extrapolate;
19
+ extrapolateLeft?: Extrapolate;
20
+ extrapolateRight?: Extrapolate;
21
+ }
22
+ /** Anything a style can hold where a plain value would go. */
23
+ export declare abstract class AnimatedNode {
24
+ abstract __getValue(): unknown;
25
+ /** The values this one is computed from: the things that actually change. */
26
+ abstract __roots(): Iterable<AnimatedValue>;
27
+ interpolate(config: InterpolationConfig): AnimatedInterpolation;
28
+ }
29
+ export declare class AnimatedValue extends AnimatedNode {
30
+ private value;
31
+ private offset;
32
+ private readonly startingValue;
33
+ private animation;
34
+ private readonly listeners;
35
+ private nextListener;
36
+ /** The `[animatedStyle]` handles reading this value, told once per change. */
37
+ readonly __observers: Set<() => void>;
38
+ constructor(value?: number);
39
+ __getValue(): number;
40
+ __roots(): Iterable<AnimatedValue>;
41
+ setValue(value: number): void;
42
+ setOffset(offset: number): void;
43
+ flattenOffset(): void;
44
+ extractOffset(): void;
45
+ addListener(callback: (state: {
46
+ value: number;
47
+ }) => void): string;
48
+ removeListener(id: string): void;
49
+ removeAllListeners(): void;
50
+ stopAnimation(callback?: (value: number) => void): void;
51
+ resetAnimation(callback?: (value: number) => void): void;
52
+ /** Run one animation on this value, stopping whatever was running on it. */
53
+ __animate(animation: Driver, callback?: EndCallback): void;
54
+ private update;
55
+ }
56
+ export declare class AnimatedInterpolation extends AnimatedNode {
57
+ private readonly parent;
58
+ private readonly config;
59
+ constructor(parent: AnimatedNode, config: InterpolationConfig);
60
+ __getValue(): unknown;
61
+ __roots(): Iterable<AnimatedValue>;
62
+ }
63
+ /**
64
+ * One animation on one value: React Native's `Animation`, reduced to what it does here. It asks
65
+ * for frames until it ends, and ends once, whether it finished or was stopped.
66
+ */
67
+ declare abstract class Driver {
68
+ protected update: (value: number) => void;
69
+ private onEnd;
70
+ private active;
71
+ private frameId;
72
+ start(from: number, update: (value: number) => void, onEnd: EndCallback, previous: Driver | null): void;
73
+ stop(): void;
74
+ protected abstract begin(from: number, previous: Driver | null): void;
75
+ protected request(step: (time: number) => void): void;
76
+ /** Whether a listener stopped this from inside the last update. */
77
+ protected get stopped(): boolean;
78
+ protected end(finished: boolean): void;
79
+ }
80
+ export interface TimingConfig {
81
+ toValue: number;
82
+ duration?: number;
83
+ easing?: EasingFunction;
84
+ delay?: number;
85
+ useNativeDriver?: boolean;
86
+ }
87
+ export interface SpringConfig {
88
+ toValue: number;
89
+ overshootClamping?: boolean;
90
+ restDisplacementThreshold?: number;
91
+ restSpeedThreshold?: number;
92
+ velocity?: number;
93
+ delay?: number;
94
+ bounciness?: number;
95
+ speed?: number;
96
+ tension?: number;
97
+ friction?: number;
98
+ stiffness?: number;
99
+ damping?: number;
100
+ mass?: number;
101
+ useNativeDriver?: boolean;
102
+ }
103
+ declare function timing(value: AnimatedValue, config: TimingConfig): CompositeAnimation;
104
+ declare function spring(value: AnimatedValue, config: SpringConfig): CompositeAnimation;
105
+ declare function sequence(animations: readonly CompositeAnimation[]): CompositeAnimation;
106
+ declare function parallel(animations: readonly CompositeAnimation[], config?: {
107
+ stopTogether?: boolean;
108
+ }): CompositeAnimation;
109
+ declare function delay(time: number): CompositeAnimation;
110
+ export declare const Animated: {
111
+ Value: typeof AnimatedValue;
112
+ Node: typeof AnimatedNode;
113
+ Interpolation: typeof AnimatedInterpolation;
114
+ timing: typeof timing;
115
+ spring: typeof spring;
116
+ sequence: typeof sequence;
117
+ parallel: typeof parallel;
118
+ delay: typeof delay;
119
+ };
120
+ /**
121
+ * `[animatedStyle]`'s graph, for a browser. Every value here is driven in JavaScript, so each
122
+ * change is a frame the directive writes, and there is never a native view to hand a tag to.
123
+ */
124
+ export declare const animationBackend: AnimationBackend;
125
+ export {};