@rafaelaugusto/jolt 0.1.0-beta.11 → 0.1.0-beta.13

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 (151) hide show
  1. package/README.md +42 -8
  2. package/dist/animate.d.ts +15 -3
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +52 -34
  5. package/dist/animate.js.map +1 -1
  6. package/dist/drag.d.ts +17 -3
  7. package/dist/drag.d.ts.map +1 -1
  8. package/dist/drag.js +34 -11
  9. package/dist/drag.js.map +1 -1
  10. package/dist/driver/android.d.ts.map +1 -1
  11. package/dist/driver/android.js +2 -0
  12. package/dist/driver/android.js.map +1 -1
  13. package/dist/driver/frame.d.ts +3 -0
  14. package/dist/driver/frame.d.ts.map +1 -0
  15. package/dist/driver/frame.js +7 -0
  16. package/dist/driver/frame.js.map +1 -0
  17. package/dist/driver/index.d.ts +2 -0
  18. package/dist/driver/index.d.ts.map +1 -1
  19. package/dist/driver/index.js.map +1 -1
  20. package/dist/driver/ios.d.ts.map +1 -1
  21. package/dist/driver/ios.js +2 -0
  22. package/dist/driver/ios.js.map +1 -1
  23. package/dist/easing.d.ts +1 -1
  24. package/dist/easing.d.ts.map +1 -1
  25. package/dist/easing.js +11 -0
  26. package/dist/easing.js.map +1 -1
  27. package/dist/engine.d.ts +20 -2
  28. package/dist/engine.d.ts.map +1 -1
  29. package/dist/engine.js +166 -38
  30. package/dist/engine.js.map +1 -1
  31. package/dist/gradient.d.ts.map +1 -1
  32. package/dist/gradient.js +10 -4
  33. package/dist/gradient.js.map +1 -1
  34. package/dist/image-effect.d.ts +1 -0
  35. package/dist/image-effect.d.ts.map +1 -1
  36. package/dist/image-effect.js +10 -2
  37. package/dist/image-effect.js.map +1 -1
  38. package/dist/index.d.ts +8 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/keyboard.d.ts.map +1 -1
  43. package/dist/keyboard.js +63 -10
  44. package/dist/keyboard.js.map +1 -1
  45. package/dist/mixer.d.ts +49 -0
  46. package/dist/mixer.d.ts.map +1 -0
  47. package/dist/mixer.js +238 -0
  48. package/dist/mixer.js.map +1 -0
  49. package/dist/motion-scope.d.ts +6 -2
  50. package/dist/motion-scope.d.ts.map +1 -1
  51. package/dist/motion-scope.js +12 -4
  52. package/dist/motion-scope.js.map +1 -1
  53. package/dist/motion-states.d.ts +10 -5
  54. package/dist/motion-states.d.ts.map +1 -1
  55. package/dist/motion-states.js +55 -22
  56. package/dist/motion-states.js.map +1 -1
  57. package/dist/motion-value.d.ts +152 -0
  58. package/dist/motion-value.d.ts.map +1 -0
  59. package/dist/motion-value.js +635 -0
  60. package/dist/motion-value.js.map +1 -0
  61. package/dist/native/index.d.ts +6 -0
  62. package/dist/native/index.d.ts.map +1 -0
  63. package/dist/native/index.js +3 -0
  64. package/dist/native/index.js.map +1 -0
  65. package/dist/native-properties.d.ts +28 -0
  66. package/dist/native-properties.d.ts.map +1 -0
  67. package/dist/native-properties.js +154 -0
  68. package/dist/native-properties.js.map +1 -0
  69. package/dist/native-property-driver.d.ts +19 -0
  70. package/dist/native-property-driver.d.ts.map +1 -0
  71. package/dist/native-property-driver.js +69 -0
  72. package/dist/native-property-driver.js.map +1 -0
  73. package/dist/native-property.d.ts +35 -0
  74. package/dist/native-property.d.ts.map +1 -0
  75. package/dist/native-property.js +277 -0
  76. package/dist/native-property.js.map +1 -0
  77. package/dist/path.d.ts.map +1 -1
  78. package/dist/path.js +2 -2
  79. package/dist/path.js.map +1 -1
  80. package/dist/playback-group.d.ts.map +1 -1
  81. package/dist/playback-group.js +17 -1
  82. package/dist/playback-group.js.map +1 -1
  83. package/dist/playback.d.ts +15 -0
  84. package/dist/playback.d.ts.map +1 -1
  85. package/dist/playback.js +23 -0
  86. package/dist/playback.js.map +1 -1
  87. package/dist/sequence.d.ts +24 -0
  88. package/dist/sequence.d.ts.map +1 -1
  89. package/dist/sequence.js +181 -19
  90. package/dist/sequence.js.map +1 -1
  91. package/dist/timed-animation.d.ts +38 -0
  92. package/dist/timed-animation.d.ts.map +1 -0
  93. package/dist/timed-animation.js +177 -0
  94. package/dist/timed-animation.js.map +1 -0
  95. package/dist/track.d.ts.map +1 -1
  96. package/dist/track.js +31 -12
  97. package/dist/track.js.map +1 -1
  98. package/dist/transition.d.ts +15 -4
  99. package/dist/transition.d.ts.map +1 -1
  100. package/dist/transition.js +46 -7
  101. package/dist/transition.js.map +1 -1
  102. package/dist/types.d.ts +5 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/value-observers.d.ts +19 -0
  105. package/dist/value-observers.d.ts.map +1 -0
  106. package/dist/value-observers.js +111 -0
  107. package/dist/value-observers.js.map +1 -0
  108. package/dist/value-track.d.ts +13 -0
  109. package/dist/value-track.d.ts.map +1 -0
  110. package/dist/value-track.js +59 -0
  111. package/dist/value-track.js.map +1 -0
  112. package/dist/vue/index.d.ts +28 -2
  113. package/dist/vue/index.d.ts.map +1 -1
  114. package/dist/vue/index.js +78 -2
  115. package/dist/vue/index.js.map +1 -1
  116. package/package.json +6 -2
  117. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  118. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  119. package/src/android-plugin.d.ts +64 -0
  120. package/src/animate.ts +106 -17
  121. package/src/drag.ts +67 -21
  122. package/src/driver/android.ts +2 -0
  123. package/src/driver/frame.ts +10 -0
  124. package/src/driver/index.ts +2 -0
  125. package/src/driver/ios.ts +2 -0
  126. package/src/easing.ts +14 -0
  127. package/src/engine.ts +181 -55
  128. package/src/gradient.ts +10 -4
  129. package/src/image-effect.ts +10 -2
  130. package/src/index.ts +23 -1
  131. package/src/ios-plugin.d.ts +33 -0
  132. package/src/keyboard.ts +83 -18
  133. package/src/mixer.ts +264 -0
  134. package/src/motion-scope.ts +17 -5
  135. package/src/motion-states.ts +79 -29
  136. package/src/motion-value.ts +795 -0
  137. package/src/native/index.ts +16 -0
  138. package/src/native-properties.ts +188 -0
  139. package/src/native-property-driver.ts +123 -0
  140. package/src/native-property.ts +353 -0
  141. package/src/path.ts +2 -1
  142. package/src/playback-group.ts +17 -1
  143. package/src/playback.ts +41 -0
  144. package/src/sequence.ts +209 -20
  145. package/src/timed-animation.ts +192 -0
  146. package/src/track.ts +37 -12
  147. package/src/transition.ts +69 -10
  148. package/src/types.ts +5 -0
  149. package/src/value-observers.ts +133 -0
  150. package/src/value-track.ts +71 -0
  151. package/src/vue/index.ts +98 -1
@@ -0,0 +1,6 @@
1
+ export { registerNativeProperty, checkNativeProperty } from '../native-property.js';
2
+ export type { NativeProperty, NativePropertyDefinition } from '../native-property.js';
3
+ export type { NativeSink } from '../native-property-driver.js';
4
+ export { mapKitCoordinate, mapKitCamera, mapLibreCoordinate, mapLibreCamera, sceneKitPose, } from '../native-properties.js';
5
+ export type { Coordinate, MapKitCamera, MapLibreCamera, ScenePose, } from '../native-properties.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AACnF,YAAY,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AACrF,YAAY,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,yBAAyB,CAAA;AAChC,YAAY,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,SAAS,GACV,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { registerNativeProperty, checkNativeProperty } from '../native-property.js';
2
+ export { mapKitCoordinate, mapKitCamera, mapLibreCoordinate, mapLibreCamera, sceneKitPose, } from '../native-properties.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAGnF,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,28 @@
1
+ export interface Coordinate {
2
+ latitude: number;
3
+ longitude: number;
4
+ }
5
+ export interface MapKitCamera extends Coordinate {
6
+ altitude: number;
7
+ pitch: number;
8
+ heading: number;
9
+ }
10
+ export interface MapLibreCamera extends Coordinate {
11
+ zoom: number;
12
+ tilt: number;
13
+ bearing: number;
14
+ }
15
+ export interface ScenePose {
16
+ position: readonly [number, number, number];
17
+ orientation: readonly [number, number, number, number];
18
+ }
19
+ /** Shortest longitude/heading interpolation. Coordinates use a local linear path, not a geodesic. */
20
+ export declare function shortestAngle(from: number, to: number, fraction: number): number;
21
+ export declare const mapKitCoordinate: (target: object) => import("./native-property.js").NativeProperty<Coordinate>;
22
+ export declare const mapKitCamera: (target: object) => import("./native-property.js").NativeProperty<MapKitCamera>;
23
+ export declare const mapLibreCoordinate: (target: object) => import("./native-property.js").NativeProperty<Coordinate>;
24
+ export declare const mapLibreCamera: (target: object) => import("./native-property.js").NativeProperty<MapLibreCamera>;
25
+ /** Unit quaternion slerp; q and -q describe the same orientation. */
26
+ export declare function interpolatePose(a: ScenePose, b: ScenePose, t: number): ScenePose;
27
+ export declare const sceneKitPose: (target: object) => import("./native-property.js").NativeProperty<ScenePose>;
28
+ //# sourceMappingURL=native-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-properties.d.ts","sourceRoot":"","sources":["../src/native-properties.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AACD,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AACD,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AACD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACvD;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAGvE;AAmBD,eAAO,MAAM,gBAAgB,+EAU3B,CAAA;AACF,eAAO,MAAM,YAAY,iFA+BvB,CAAA;AACF,eAAO,MAAM,kBAAkB,+EAU7B,CAAA;AACF,eAAO,MAAM,cAAc,mFA+BzB,CAAA;AAEF,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CA0BhF;AACD,eAAO,MAAM,YAAY,8EA4BvB,CAAA"}
@@ -0,0 +1,154 @@
1
+ import { registerNativeProperty } from './native-property.js';
2
+ /** Shortest longitude/heading interpolation. Coordinates use a local linear path, not a geodesic. */
3
+ export function shortestAngle(from, to, fraction) {
4
+ const delta = ((((to - from + 180) % 360) + 360) % 360) - 180;
5
+ return from + delta * fraction;
6
+ }
7
+ function validateCoordinate(value) {
8
+ if (!Number.isFinite(value.latitude) ||
9
+ Math.abs(value.latitude) > 90 ||
10
+ !Number.isFinite(value.longitude))
11
+ throw new RangeError('Coordinates need latitude in -90..90 and a finite longitude.');
12
+ }
13
+ function coordinate(from, to, t) {
14
+ return {
15
+ latitude: Math.max(-90, Math.min(90, from.latitude + (to.latitude - from.latitude) * t)),
16
+ longitude: shortestAngle(from.longitude, to.longitude, t),
17
+ };
18
+ }
19
+ export const mapKitCoordinate = registerNativeProperty({
20
+ name: 'jolt.mapkit/coordinate',
21
+ units: ['latitude degrees', 'longitude degrees'],
22
+ platforms: ['ios'],
23
+ spatial: true,
24
+ encode: (v) => [v.latitude, v.longitude],
25
+ decode: (v) => ({ latitude: v[0], longitude: v[1] }),
26
+ validate: validateCoordinate,
27
+ interpolate: coordinate,
28
+ create: (target) => JoltReferenceProperties.mapCoordinate(target),
29
+ });
30
+ export const mapKitCamera = registerNativeProperty({
31
+ name: 'jolt.mapkit/camera',
32
+ units: [
33
+ 'latitude degrees',
34
+ 'longitude degrees',
35
+ 'altitude meters',
36
+ 'pitch degrees',
37
+ 'heading degrees',
38
+ ],
39
+ platforms: ['ios'],
40
+ spatial: true,
41
+ encode: (v) => [v.latitude, v.longitude, v.altitude, v.pitch, v.heading],
42
+ decode: (v) => ({
43
+ latitude: v[0],
44
+ longitude: v[1],
45
+ altitude: v[2],
46
+ pitch: v[3],
47
+ heading: v[4],
48
+ }),
49
+ validate(v) {
50
+ validateCoordinate(v);
51
+ if (v.altitude < 1 || v.pitch < 0 || v.pitch > 80)
52
+ throw new RangeError('MapKit camera needs altitude >= 1m and pitch 0..80 degrees.');
53
+ },
54
+ interpolate: (a, b, t) => ({
55
+ ...coordinate(a, b, t),
56
+ altitude: Math.max(1, a.altitude + (b.altitude - a.altitude) * t),
57
+ pitch: Math.max(0, Math.min(80, a.pitch + (b.pitch - a.pitch) * t)),
58
+ heading: shortestAngle(a.heading, b.heading, t),
59
+ }),
60
+ create: (target) => JoltReferenceProperties.mapCamera(target),
61
+ });
62
+ export const mapLibreCoordinate = registerNativeProperty({
63
+ name: 'jolt.maplibre/coordinate',
64
+ units: ['latitude degrees', 'longitude degrees'],
65
+ platforms: ['android'],
66
+ spatial: true,
67
+ encode: (v) => [v.latitude, v.longitude],
68
+ decode: (v) => ({ latitude: v[0], longitude: v[1] }),
69
+ validate: validateCoordinate,
70
+ interpolate: coordinate,
71
+ create: (target) => new org.rafaelaugusto.jolt.MapLibrePropertySink(target, false),
72
+ });
73
+ export const mapLibreCamera = registerNativeProperty({
74
+ name: 'jolt.maplibre/camera',
75
+ units: [
76
+ 'latitude degrees',
77
+ 'longitude degrees',
78
+ 'zoom level',
79
+ 'tilt degrees',
80
+ 'bearing degrees',
81
+ ],
82
+ platforms: ['android'],
83
+ spatial: true,
84
+ encode: (v) => [v.latitude, v.longitude, v.zoom, v.tilt, v.bearing],
85
+ decode: (v) => ({
86
+ latitude: v[0],
87
+ longitude: v[1],
88
+ zoom: v[2],
89
+ tilt: v[3],
90
+ bearing: v[4],
91
+ }),
92
+ validate(v) {
93
+ validateCoordinate(v);
94
+ if (v.zoom < 0 || v.zoom > 24 || v.tilt < 0 || v.tilt > 60)
95
+ throw new RangeError('MapLibre camera needs zoom 0..24 and tilt 0..60 degrees.');
96
+ },
97
+ interpolate: (a, b, t) => ({
98
+ ...coordinate(a, b, t),
99
+ zoom: Math.max(0, Math.min(24, a.zoom + (b.zoom - a.zoom) * t)),
100
+ tilt: Math.max(0, Math.min(60, a.tilt + (b.tilt - a.tilt) * t)),
101
+ bearing: shortestAngle(a.bearing, b.bearing, t),
102
+ }),
103
+ create: (target) => new org.rafaelaugusto.jolt.MapLibrePropertySink(target, true),
104
+ });
105
+ /** Unit quaternion slerp; q and -q describe the same orientation. */
106
+ export function interpolatePose(a, b, t) {
107
+ const normalize = (q) => {
108
+ const length = Math.hypot(...q);
109
+ if (!Number.isFinite(length) || length < 1e-12)
110
+ throw new RangeError('Orientation must be a nonzero finite quaternion.');
111
+ return q.map((v) => v / length);
112
+ };
113
+ const from = normalize(a.orientation), to = normalize(b.orientation);
114
+ let dot = from.reduce((sum, v, i) => sum + v * to[i], 0);
115
+ if (dot < 0) {
116
+ dot = -dot;
117
+ for (let i = 0; i < 4; i++)
118
+ to[i] = -to[i];
119
+ }
120
+ const theta = Math.acos(Math.min(1, dot)), sine = Math.sin(theta);
121
+ const x = sine < 1e-6 ? 1 - t : Math.sin((1 - t) * theta) / sine, y = sine < 1e-6 ? t : Math.sin(t * theta) / sine;
122
+ return {
123
+ position: a.position.map((v, i) => v + (b.position[i] - v) * t),
124
+ orientation: normalize(from.map((v, i) => v * x + to[i] * y)),
125
+ };
126
+ }
127
+ export const sceneKitPose = registerNativeProperty({
128
+ name: 'jolt.scenekit/pose',
129
+ units: [
130
+ 'x scene units',
131
+ 'y scene units',
132
+ 'z scene units',
133
+ 'quaternion x',
134
+ 'quaternion y',
135
+ 'quaternion z',
136
+ 'quaternion w',
137
+ ],
138
+ platforms: ['ios'],
139
+ spatial: true,
140
+ encode: (v) => [...v.position, ...v.orientation],
141
+ decode: (v) => ({
142
+ position: [v[0], v[1], v[2]],
143
+ orientation: [v[3], v[4], v[5], v[6]],
144
+ }),
145
+ validate(v) {
146
+ if (v.position.length !== 3 ||
147
+ v.orientation.length !== 4 ||
148
+ Math.hypot(...v.orientation) < 1e-12)
149
+ throw new RangeError('Scene pose needs a 3D position and a nonzero quaternion.');
150
+ },
151
+ interpolate: interpolatePose,
152
+ create: (target) => JoltReferenceProperties.scenePose(target),
153
+ });
154
+ //# sourceMappingURL=native-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-properties.js","sourceRoot":"","sources":["../src/native-properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Track } from './track.js';
2
+ /** Opaque compiled JoltPropertySink / PropertySink instance. */
3
+ export type NativeSink = object;
4
+ export interface NativePlayer {
5
+ control(time: number, paused: boolean): void;
6
+ cancel(): void;
7
+ }
8
+ export interface NativePropertyDriver {
9
+ validate(sink: NativeSink, dimensions: number): void;
10
+ alive(sink: NativeSink): boolean;
11
+ read(sink: NativeSink): number[];
12
+ write(sink: NativeSink, values: readonly number[]): void;
13
+ dispose(sink: NativeSink): void;
14
+ play(sink: NativeSink, track: Track, samples: readonly (readonly number[])[], final: readonly number[], end: (completed: boolean) => void): NativePlayer;
15
+ }
16
+ /** Test injection; not part of the public package entry. */
17
+ export declare function setNativePropertyDriver(driver: NativePropertyDriver | undefined): void;
18
+ export declare function nativePropertyDriver(): NativePropertyDriver;
19
+ //# sourceMappingURL=native-property-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-property-driver.d.ts","sourceRoot":"","sources":["../src/native-property-driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAC/B,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5C,MAAM,IAAI,IAAI,CAAA;CACf;AACD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;IAChC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAAA;IAChC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACxD,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IAC/B,IAAI,CACF,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACvC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAChC,YAAY,CAAA;CAChB;AAED,4DAA4D;AAC5D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,QAE/E;AACD,wBAAgB,oBAAoB,IAAI,oBAAoB,CAW3D"}
@@ -0,0 +1,69 @@
1
+ import { isAndroid } from '@nativescript/core';
2
+ let override;
3
+ /** Test injection; not part of the public package entry. */
4
+ export function setNativePropertyDriver(driver) {
5
+ override = driver;
6
+ }
7
+ export function nativePropertyDriver() {
8
+ if (override)
9
+ return override;
10
+ const available = isAndroid
11
+ ? typeof org !== 'undefined' &&
12
+ typeof org.rafaelaugusto.jolt.PropertySink?.scalar === 'function'
13
+ : typeof JoltPropertySink !== 'undefined';
14
+ if (!available)
15
+ throw new Error('Native property adapters require the optional @rafaelaugusto/jolt-native plugin. Install it and rebuild the native app.');
16
+ return isAndroid ? androidDriver : iosDriver;
17
+ }
18
+ function array(values) {
19
+ const result = Array.create('double', values.length);
20
+ values.forEach((value, i) => {
21
+ result[i] = value;
22
+ });
23
+ return result;
24
+ }
25
+ const androidDriver = {
26
+ validate(sink, dimensions) {
27
+ if (!(sink instanceof org.rafaelaugusto.jolt.PropertySink) ||
28
+ sink.getDimensions() !== dimensions ||
29
+ !sink.isCompiled())
30
+ throw new TypeError('Native adapters require a compiled PropertySink with matching dimensions, not a JavaScript setter.');
31
+ },
32
+ alive: (sink) => sink.isAlive(),
33
+ read(sink) {
34
+ const values = sink.read();
35
+ return Array.from({ length: values.length }, (_, i) => values[i]);
36
+ },
37
+ write: (sink, values) => sink.write(array(values)),
38
+ dispose: (sink) => sink.dispose(),
39
+ play(sink, track, samples, final, end) {
40
+ const player = new org.rafaelaugusto.jolt.PropertyPlayer(sink, array(track.times), array(samples.flat()), array(final), track.duration, track.delay, Number.isFinite(track.repeat) ? track.repeat : -1, track.reverse, new org.rafaelaugusto.jolt.PropertyPlayer.Listener({ onEnd: end }));
41
+ return {
42
+ control: (time, paused) => player.control(time, paused),
43
+ cancel: () => player.cancel(),
44
+ };
45
+ },
46
+ };
47
+ const iosDriver = {
48
+ validate(sink, dimensions) {
49
+ if (!(sink instanceof JoltPropertySink) ||
50
+ sink.dimensions !== dimensions ||
51
+ !sink.compiled)
52
+ throw new TypeError('Native adapters require a compiled JoltPropertySink with matching dimensions, not a JavaScript setter.');
53
+ },
54
+ alive: (sink) => sink.alive,
55
+ read(sink) {
56
+ const values = sink.read();
57
+ return Array.from({ length: values.count }, (_, i) => values.objectAtIndex(i));
58
+ },
59
+ write: (sink, values) => sink.write(NSArray.arrayWithArray([...values])),
60
+ dispose: (sink) => sink.dispose(),
61
+ play(sink, track, samples, final, end) {
62
+ const player = JoltPropertyPlayer.startSinkTimesValuesFinalValueDurationDelayRepeatReverseCompletion(sink, NSArray.arrayWithArray([...track.times]), NSArray.arrayWithArray(samples.flat()), NSArray.arrayWithArray([...final]), track.duration, track.delay, track.repeat, track.reverse, end);
63
+ return {
64
+ control: (time, paused) => player.controlPaused(time, paused),
65
+ cancel: () => player.cancel(),
66
+ };
67
+ },
68
+ };
69
+ //# sourceMappingURL=native-property-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-property-driver.js","sourceRoot":"","sources":["../src/native-property-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { DerivedValue } from './motion-value.js';
2
+ import type { PlaybackAnimation } from './playback.js';
3
+ import { type Transition, type SpringName } from './transition.js';
4
+ import { type NativeSink } from './native-property-driver.js';
5
+ export interface NativePropertyDefinition<T> {
6
+ /** Namespaced identity, e.g. 'acme.chart/reveal'. One registration per name. */
7
+ readonly name: string;
8
+ readonly units: readonly string[];
9
+ readonly platforms: readonly ('ios' | 'android')[];
10
+ /** Spatial properties jump to their destination under reduced motion. */
11
+ readonly spatial?: boolean;
12
+ encode(value: T): readonly number[];
13
+ decode(value: readonly number[]): T;
14
+ /** Called once per sampled keyframe in JS, never per native frame. */
15
+ interpolate?(from: T, to: T, fraction: number): T;
16
+ validate?(value: T): void;
17
+ /** Must return a compiled native sink, not a JavaScript implementation of its methods. */
18
+ create(target: object): NativeSink;
19
+ }
20
+ export interface NativeProperty<T> {
21
+ readonly name: string;
22
+ get(): T;
23
+ set(value: T): void;
24
+ animate(to: T, options?: Transition | SpringName): PlaybackAnimation;
25
+ /** Sample a pure mapping at setup/boundaries, then write the property entirely in native code. */
26
+ bind(value: DerivedValue, map: (value: number) => T): () => void;
27
+ stop(): void;
28
+ /** Release this owner's native resources. Call before destroying the SDK target. */
29
+ dispose(): void;
30
+ }
31
+ /** Optional plugin registry. No SDK is loaded until its adapter creates a target. */
32
+ export declare function registerNativeProperty<T>(definition: NativePropertyDefinition<T>): (target: object) => NativeProperty<T>;
33
+ /** Reusable conformance checks for setup/command behavior; frame/lifecycle checks require a native app. */
34
+ export declare function checkNativeProperty<T>(property: NativeProperty<T>, value: T): T;
35
+ //# sourceMappingURL=native-property.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-property.d.ts","sourceRoot":"","sources":["../src/native-property.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtD,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,6BAA6B,CAAA;AAEpC,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAA;IAClD,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,MAAM,EAAE,CAAA;IACnC,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,sEAAsE;IACtE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAA;IACjD,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACzB,0FAA0F;IAC1F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;CACnC;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,GAAG,IAAI,CAAC,CAAA;IACR,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAA;IACpE,kGAAkG;IAClG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,MAAM,IAAI,CAAA;IAChE,IAAI,IAAI,IAAI,CAAA;IACZ,oFAAoF;IACpF,OAAO,IAAI,IAAI,CAAA;CAChB;AASD,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC,GACtC,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,CAuBvC;AAgPD,2GAA2G;AAC3G,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAQ3E"}
@@ -0,0 +1,277 @@
1
+ import { isAndroid, Trace } from '@nativescript/core';
2
+ import { reducedMotion } from './config.js';
3
+ import { valuePlayback } from './motion-value.js';
4
+ import { TimedAnimation } from './timed-animation.js';
5
+ import { createTrack, instantTrack } from './track.js';
6
+ import { resolveTransition, springs, } from './transition.js';
7
+ import { nativePropertyDriver, } from './native-property-driver.js';
8
+ const definitions = new Set();
9
+ const owners = new WeakMap();
10
+ /** Optional plugin registry. No SDK is loaded until its adapter creates a target. */
11
+ export function registerNativeProperty(definition) {
12
+ if (!/^[\w.-]+\/[\w.-]+$/.test(definition.name))
13
+ throw new TypeError('Native property names must be namespaced: plugin/property.');
14
+ if (definitions.has(definition.name))
15
+ throw new Error(`Native property "${definition.name}" is already registered.`);
16
+ if (!definition.units.length ||
17
+ definition.units.some((unit) => typeof unit !== 'string' || !unit))
18
+ throw new TypeError('Describe the units of every native property component.');
19
+ if (!definition.platforms.length ||
20
+ definition.platforms.some((p) => p !== 'ios' && p !== 'android'))
21
+ throw new TypeError('Declare supported native platforms.');
22
+ if (typeof definition.create !== 'function' ||
23
+ typeof definition.encode !== 'function' ||
24
+ typeof definition.decode !== 'function')
25
+ throw new TypeError('A native property needs create(), encode() and decode().');
26
+ definitions.add(definition.name);
27
+ return (target) => new PropertyTarget(target, definition);
28
+ }
29
+ class PropertyTarget {
30
+ target;
31
+ definition;
32
+ sink;
33
+ owned = new Set();
34
+ disposed = false;
35
+ name;
36
+ constructor(target, definition) {
37
+ this.target = target;
38
+ this.definition = definition;
39
+ this.name = definition.name;
40
+ if (!target || (typeof target !== 'object' && typeof target !== 'function'))
41
+ throw new TypeError('A native property needs a native target.');
42
+ const platform = isAndroid ? 'android' : 'ios';
43
+ if (!definition.platforms.includes(platform))
44
+ throw new Error(`${this.name} is unavailable on ${platform}.`);
45
+ const driver = nativePropertyDriver();
46
+ this.sink = definition.create(target);
47
+ try {
48
+ driver.validate(this.sink, definition.units.length);
49
+ }
50
+ catch (error) {
51
+ try {
52
+ driver.dispose(this.sink);
53
+ }
54
+ catch { }
55
+ throw error;
56
+ }
57
+ }
58
+ alive() {
59
+ if (this.disposed)
60
+ throw new Error(`${this.name} has been disposed.`);
61
+ if (!nativePropertyDriver().alive(this.sink))
62
+ throw new Error(`${this.name} has lost its native target.`);
63
+ }
64
+ vector(value) {
65
+ this.definition.validate?.(value);
66
+ const numbers = [...this.definition.encode(value)];
67
+ if (numbers.length !== this.definition.units.length ||
68
+ numbers.some((n) => !Number.isFinite(n)))
69
+ throw new TypeError(`${this.name} expects ${this.definition.units.length} finite components.`);
70
+ return numbers;
71
+ }
72
+ get() {
73
+ this.alive();
74
+ return this.definition.decode(nativePropertyDriver().read(this.sink));
75
+ }
76
+ set(value) {
77
+ this.alive();
78
+ const vector = this.vector(value);
79
+ this.owner()?.stop();
80
+ nativePropertyDriver().write(this.sink, vector);
81
+ }
82
+ owner() {
83
+ return this.target ? owners.get(this.target)?.get(this.name) : undefined;
84
+ }
85
+ claim(owner) {
86
+ this.owner()?.stop();
87
+ let map = owners.get(this.target);
88
+ if (!map)
89
+ owners.set(this.target, (map = new Map()));
90
+ map.set(this.name, owner);
91
+ this.owned.add(owner);
92
+ }
93
+ release(owner) {
94
+ if (this.target && this.owner() === owner)
95
+ owners.get(this.target)?.delete(this.name);
96
+ this.owned.delete(owner);
97
+ }
98
+ animate(to, options = {}) {
99
+ this.alive();
100
+ const from = this.get(), first = this.vector(from), last = this.vector(to);
101
+ if (typeof options === 'object' && 'layer' in options)
102
+ throw new TypeError('Native property adapters do not support layers; bind a layered scalar value instead.');
103
+ if (typeof options === 'string' && !Object.hasOwn(springs, options))
104
+ throw new TypeError(`Unknown spring "${options}".`);
105
+ const transition = resolveTransition(typeof options === 'string' ? springs[options] : options, 'opacity', 2);
106
+ const velocity = this.owner()?.velocity();
107
+ const delta = last.map((v, i) => v - first[i]);
108
+ const length = delta.reduce((s, v) => s + v * v, 0);
109
+ const speed = length && velocity
110
+ ? delta.reduce((s, v, i) => s + v * (velocity[i] ?? 0), 0) / length
111
+ : 0;
112
+ const track = dense(this.definition.spatial && reducedMotion()
113
+ ? instantTrack('opacity', 1)
114
+ : createTrack('opacity', [0, 1], transition, speed));
115
+ const at = (fraction) => this.vector(this.definition.interpolate
116
+ ? this.definition.interpolate(from, to, fraction)
117
+ : this.definition.decode(first.map((v, i) => v + delta[i] * fraction)));
118
+ const samples = track.values.map(at);
119
+ const final = at(track.to);
120
+ let player;
121
+ const animation = new TimedAnimation(track.end, track.arrival, (time, paused) => {
122
+ player?.control(time, paused);
123
+ }, (completed) => {
124
+ try {
125
+ if (completed && nativePropertyDriver().alive(this.sink))
126
+ nativePropertyDriver().write(this.sink, final);
127
+ }
128
+ finally {
129
+ player?.cancel();
130
+ player = undefined;
131
+ this.release(owner);
132
+ }
133
+ });
134
+ const owner = {
135
+ stop: () => animation.stop(),
136
+ velocity: () => animation.paused
137
+ ? first.map(() => 0)
138
+ : at(track.valueAt(animation.time + 0.5)).map((v, i) => (v - at(track.valueAt(animation.time - 0.5))[i]) * 1000),
139
+ };
140
+ this.claim(owner);
141
+ try {
142
+ if (track.end > 0) {
143
+ player = nativePropertyDriver().play(this.sink, track, samples, final, (completed) => {
144
+ if (!completed)
145
+ animation.stop();
146
+ });
147
+ if (animation.done) {
148
+ player.cancel();
149
+ player = undefined;
150
+ }
151
+ else
152
+ player.control(animation.time, false);
153
+ }
154
+ animation.start();
155
+ }
156
+ catch (error) {
157
+ animation.stop();
158
+ throw error;
159
+ }
160
+ return animation;
161
+ }
162
+ bind(value, map) {
163
+ this.alive();
164
+ if (typeof map !== 'function')
165
+ throw new TypeError('A native binding needs a pure value mapping.');
166
+ const source = valuePlayback(value);
167
+ let player;
168
+ let off = () => { };
169
+ let stopped = false;
170
+ const prepare = () => {
171
+ const state = source.snapshot();
172
+ state.track = dense(state.track);
173
+ const spatial = this.definition.spatial && reducedMotion();
174
+ const samples = state.track.values.map((v) => this.vector(map(v)));
175
+ const current = this.vector(map(spatial ? state.track.to : state.value));
176
+ const final = this.vector(map(state.track.to));
177
+ return { ...state, samples, current, final, running: state.running && !spatial };
178
+ };
179
+ const initial = prepare(); // Validate all samples before interrupting another owner.
180
+ const owner = {
181
+ stop: () => {
182
+ if (stopped)
183
+ return;
184
+ stopped = true;
185
+ off();
186
+ player?.cancel();
187
+ player = undefined;
188
+ this.release(owner);
189
+ },
190
+ velocity: () => this.definition.units.map(() => 0),
191
+ };
192
+ const apply = (state) => {
193
+ player?.cancel();
194
+ player = undefined;
195
+ if (!state.running)
196
+ nativePropertyDriver().write(this.sink, state.current);
197
+ else {
198
+ player = nativePropertyDriver().play(this.sink, state.track, state.samples, state.final, (completed) => {
199
+ if (!completed)
200
+ owner.stop();
201
+ });
202
+ if (stopped) {
203
+ player.cancel();
204
+ player = undefined;
205
+ }
206
+ else
207
+ player.control(source.snapshot().elapsed, state.paused);
208
+ }
209
+ };
210
+ this.claim(owner);
211
+ try {
212
+ off = source.subscribe(() => {
213
+ if (stopped)
214
+ return;
215
+ try {
216
+ this.alive();
217
+ apply(prepare());
218
+ }
219
+ catch (error) {
220
+ owner.stop();
221
+ Trace.write(`Jolt native binding failed: ${String(error)}`, Trace.categories.Error, Trace.messageType.error);
222
+ }
223
+ });
224
+ apply(initial);
225
+ }
226
+ catch (error) {
227
+ owner.stop();
228
+ throw error;
229
+ }
230
+ return owner.stop;
231
+ }
232
+ stop() {
233
+ for (const owner of [...this.owned])
234
+ owner.stop();
235
+ }
236
+ dispose() {
237
+ if (this.disposed)
238
+ return;
239
+ this.stop();
240
+ this.disposed = true;
241
+ nativePropertyDriver().dispose(this.sink);
242
+ this.target = undefined;
243
+ }
244
+ }
245
+ /** Reusable conformance checks for setup/command behavior; frame/lifecycle checks require a native app. */
246
+ export function checkNativeProperty(property, value) {
247
+ const previous = property.get();
248
+ try {
249
+ property.set(value);
250
+ return property.get();
251
+ }
252
+ finally {
253
+ property.set(previous);
254
+ }
255
+ }
256
+ /** Uniform samples also capture nonlinear compound interpolation and pure binding maps. */
257
+ function dense(track) {
258
+ if (track.duration === 0)
259
+ return track;
260
+ const count = Math.max(1, Math.min(6000, Math.ceil((track.duration * 60) / 1000)));
261
+ const times = [
262
+ ...new Set([
263
+ ...track.times,
264
+ ...Array.from({ length: count + 1 }, (_, i) => i / count),
265
+ ]),
266
+ ].sort((a, b) => a - b);
267
+ return {
268
+ ...track,
269
+ times,
270
+ values: times.map((time) => time === 1
271
+ ? track.values.at(-1)
272
+ : time === 0
273
+ ? track.values[0]
274
+ : track.valueAt(track.delay + time * track.duration)),
275
+ };
276
+ }
277
+ //# sourceMappingURL=native-property.js.map