react-native-smooth-clip-view 0.3.0 → 0.4.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.
Files changed (199) hide show
  1. package/README.md +132 -388
  2. package/android/build.gradle +3 -3
  3. package/android/proguard-rules.pro +2 -2
  4. package/android/src/main/cpp/SmoothClipAndroid.h +9 -12
  5. package/android/src/main/cpp/SmoothClipBindings.cpp +300 -704
  6. package/android/src/main/cpp/SmoothClipRegistry.cpp +348 -594
  7. package/android/src/main/java/com/smoothclipview/ClipGeometryNormalizer.kt +36 -227
  8. package/android/src/main/java/com/smoothclipview/SmoothClipBindings.kt +16 -19
  9. package/android/src/main/java/com/smoothclipview/SmoothClipModule.kt +36 -294
  10. package/android/src/main/java/com/smoothclipview/SmoothClipView.kt +344 -488
  11. package/android/src/main/java/com/smoothclipview/SmoothClipViewManager.kt +75 -77
  12. package/cpp/SmoothClipAnimationCurve.h +237 -346
  13. package/cpp/SmoothClipRegistry.h +24 -52
  14. package/cpp/SmoothClipSharedGeometry.h +64 -94
  15. package/cpp/SmoothClipVelocityTracker.h +5 -5
  16. package/ios/SmoothClipGeometry.h +23 -34
  17. package/ios/SmoothClipRegistry.mm +206 -711
  18. package/ios/SmoothClipTurboModule.cpp +217 -715
  19. package/ios/SmoothClipTurboModule.h +54 -297
  20. package/ios/SmoothClipView.mm +599 -505
  21. package/ios/SmoothClipViewRegistry.h +2 -7
  22. package/lib/module/NativeSmoothClipModule.js.map +1 -1
  23. package/lib/module/SmoothClipView.ios.js +84 -17
  24. package/lib/module/SmoothClipView.ios.js.map +1 -1
  25. package/lib/module/SmoothClipView.js +1 -1
  26. package/lib/module/SmoothClipView.js.map +1 -1
  27. package/lib/module/SmoothClipViewNativeComponent.ts +20 -26
  28. package/lib/module/capabilities.native.js +1 -19
  29. package/lib/module/capabilities.native.js.map +1 -1
  30. package/lib/module/capabilityTypes.js +0 -9
  31. package/lib/module/capabilityTypes.js.map +1 -1
  32. package/lib/module/controllerInternals.js +28 -0
  33. package/lib/module/controllerInternals.js.map +1 -0
  34. package/lib/module/controllerLifecycle.js +9 -0
  35. package/lib/module/controllerLifecycle.js.map +1 -0
  36. package/lib/module/controllerTypes.js +4 -0
  37. package/lib/module/controllerTypes.js.map +1 -0
  38. package/lib/module/controllers.android.js +4 -0
  39. package/lib/module/controllers.android.js.map +1 -0
  40. package/lib/module/controllers.ios.js +4 -0
  41. package/lib/module/controllers.ios.js.map +1 -0
  42. package/lib/module/controllers.js +4 -0
  43. package/lib/module/controllers.js.map +1 -0
  44. package/lib/module/controllers.native.js +89 -0
  45. package/lib/module/controllers.native.js.map +1 -0
  46. package/lib/module/geometry.js +71 -51
  47. package/lib/module/geometry.js.map +1 -1
  48. package/lib/module/groupTypes.js +4 -0
  49. package/lib/module/{groupDriverTypes.js.map → groupTypes.js.map} +1 -1
  50. package/lib/module/groups.android.js +4 -0
  51. package/lib/module/groups.android.js.map +1 -0
  52. package/lib/module/groups.ios.js +4 -0
  53. package/lib/module/groups.ios.js.map +1 -0
  54. package/lib/module/groups.js +4 -0
  55. package/lib/module/groups.js.map +1 -0
  56. package/lib/module/groups.native.js +399 -0
  57. package/lib/module/groups.native.js.map +1 -0
  58. package/lib/module/ids.js +8 -0
  59. package/lib/module/ids.js.map +1 -0
  60. package/lib/module/index.js +3 -3
  61. package/lib/module/index.js.map +1 -1
  62. package/lib/module/nativeCompletion.js +37 -16
  63. package/lib/module/nativeCompletion.js.map +1 -1
  64. package/lib/module/presentationCodec.js +81 -0
  65. package/lib/module/presentationCodec.js.map +1 -0
  66. package/lib/typescript/src/NativeSmoothClipModule.d.ts +14 -23
  67. package/lib/typescript/src/NativeSmoothClipModule.d.ts.map +1 -1
  68. package/lib/typescript/src/SmoothClipView.d.ts +1 -1
  69. package/lib/typescript/src/SmoothClipView.d.ts.map +1 -1
  70. package/lib/typescript/src/SmoothClipView.ios.d.ts +18 -14
  71. package/lib/typescript/src/SmoothClipView.ios.d.ts.map +1 -1
  72. package/lib/typescript/src/SmoothClipViewNativeComponent.d.ts +10 -5
  73. package/lib/typescript/src/SmoothClipViewNativeComponent.d.ts.map +1 -1
  74. package/lib/typescript/src/capabilities.native.d.ts +1 -1
  75. package/lib/typescript/src/capabilities.native.d.ts.map +1 -1
  76. package/lib/typescript/src/capabilityTypes.d.ts +0 -6
  77. package/lib/typescript/src/capabilityTypes.d.ts.map +1 -1
  78. package/lib/typescript/src/controllerInternals.d.ts +14 -0
  79. package/lib/typescript/src/controllerInternals.d.ts.map +1 -0
  80. package/lib/typescript/src/controllerLifecycle.d.ts +3 -0
  81. package/lib/typescript/src/controllerLifecycle.d.ts.map +1 -0
  82. package/lib/typescript/src/controllerTypes.d.ts +62 -0
  83. package/lib/typescript/src/controllerTypes.d.ts.map +1 -0
  84. package/lib/typescript/src/controllers.android.d.ts +2 -0
  85. package/lib/typescript/src/controllers.android.d.ts.map +1 -0
  86. package/lib/typescript/src/controllers.d.ts +2 -0
  87. package/lib/typescript/src/controllers.d.ts.map +1 -0
  88. package/lib/typescript/src/controllers.ios.d.ts +2 -0
  89. package/lib/typescript/src/controllers.ios.d.ts.map +1 -0
  90. package/lib/typescript/src/controllers.native.d.ts +3 -0
  91. package/lib/typescript/src/controllers.native.d.ts.map +1 -0
  92. package/lib/typescript/src/geometry.d.ts +22 -12
  93. package/lib/typescript/src/geometry.d.ts.map +1 -1
  94. package/lib/typescript/src/groupTypes.d.ts +31 -0
  95. package/lib/typescript/src/groupTypes.d.ts.map +1 -0
  96. package/lib/typescript/src/groups.android.d.ts +2 -0
  97. package/lib/typescript/src/groups.android.d.ts.map +1 -0
  98. package/lib/typescript/src/groups.d.ts +2 -0
  99. package/lib/typescript/src/groups.d.ts.map +1 -0
  100. package/lib/typescript/src/groups.ios.d.ts +2 -0
  101. package/lib/typescript/src/groups.ios.d.ts.map +1 -0
  102. package/lib/typescript/src/groups.native.d.ts +3 -0
  103. package/lib/typescript/src/groups.native.d.ts.map +1 -0
  104. package/lib/typescript/src/ids.d.ts +2 -0
  105. package/lib/typescript/src/ids.d.ts.map +1 -0
  106. package/lib/typescript/src/index.d.ts +6 -6
  107. package/lib/typescript/src/index.d.ts.map +1 -1
  108. package/lib/typescript/src/nativeCompletion.d.ts +16 -6
  109. package/lib/typescript/src/nativeCompletion.d.ts.map +1 -1
  110. package/lib/typescript/src/presentationCodec.d.ts +10 -0
  111. package/lib/typescript/src/presentationCodec.d.ts.map +1 -0
  112. package/package.json +8 -3
  113. package/src/NativeSmoothClipModule.ts +41 -292
  114. package/src/SmoothClipView.ios.tsx +130 -23
  115. package/src/SmoothClipView.tsx +5 -1
  116. package/src/SmoothClipViewNativeComponent.ts +20 -26
  117. package/src/capabilities.native.ts +2 -52
  118. package/src/capabilityTypes.ts +0 -14
  119. package/src/controllerInternals.ts +52 -0
  120. package/src/controllerLifecycle.ts +6 -0
  121. package/src/controllerTypes.ts +87 -0
  122. package/src/controllers.android.ts +1 -0
  123. package/src/controllers.ios.ts +1 -0
  124. package/src/controllers.native.ts +104 -0
  125. package/src/controllers.ts +1 -0
  126. package/src/geometry.ts +118 -74
  127. package/src/groupTypes.ts +53 -0
  128. package/src/groups.android.ts +1 -0
  129. package/src/groups.ios.ts +1 -0
  130. package/src/groups.native.ts +604 -0
  131. package/src/groups.ts +1 -0
  132. package/src/ids.ts +6 -0
  133. package/src/index.ts +20 -28
  134. package/src/nativeCompletion.ts +67 -32
  135. package/src/presentationCodec.ts +134 -0
  136. package/lib/module/driverState.js +0 -82
  137. package/lib/module/driverState.js.map +0 -1
  138. package/lib/module/driverTypes.js +0 -4
  139. package/lib/module/driverTypes.js.map +0 -1
  140. package/lib/module/drivers.android.js +0 -6
  141. package/lib/module/drivers.android.js.map +0 -1
  142. package/lib/module/drivers.ios.js +0 -6
  143. package/lib/module/drivers.ios.js.map +0 -1
  144. package/lib/module/drivers.js +0 -4
  145. package/lib/module/drivers.js.map +0 -1
  146. package/lib/module/drivers.native.js +0 -756
  147. package/lib/module/drivers.native.js.map +0 -1
  148. package/lib/module/groupDriverTypes.js +0 -4
  149. package/lib/module/groupDrivers.android.js +0 -4
  150. package/lib/module/groupDrivers.android.js.map +0 -1
  151. package/lib/module/groupDrivers.ios.js +0 -4
  152. package/lib/module/groupDrivers.ios.js.map +0 -1
  153. package/lib/module/groupDrivers.js +0 -4
  154. package/lib/module/groupDrivers.js.map +0 -1
  155. package/lib/module/groupDrivers.native.js +0 -799
  156. package/lib/module/groupDrivers.native.js.map +0 -1
  157. package/lib/module/presentationProtocol.js +0 -15
  158. package/lib/module/presentationProtocol.js.map +0 -1
  159. package/lib/module/reactRequests.js +0 -56
  160. package/lib/module/reactRequests.js.map +0 -1
  161. package/lib/typescript/src/driverState.d.ts +0 -26
  162. package/lib/typescript/src/driverState.d.ts.map +0 -1
  163. package/lib/typescript/src/driverTypes.d.ts +0 -121
  164. package/lib/typescript/src/driverTypes.d.ts.map +0 -1
  165. package/lib/typescript/src/drivers.android.d.ts +0 -3
  166. package/lib/typescript/src/drivers.android.d.ts.map +0 -1
  167. package/lib/typescript/src/drivers.d.ts +0 -3
  168. package/lib/typescript/src/drivers.d.ts.map +0 -1
  169. package/lib/typescript/src/drivers.ios.d.ts +0 -3
  170. package/lib/typescript/src/drivers.ios.d.ts.map +0 -1
  171. package/lib/typescript/src/drivers.native.d.ts +0 -5
  172. package/lib/typescript/src/drivers.native.d.ts.map +0 -1
  173. package/lib/typescript/src/groupDriverTypes.d.ts +0 -66
  174. package/lib/typescript/src/groupDriverTypes.d.ts.map +0 -1
  175. package/lib/typescript/src/groupDrivers.android.d.ts +0 -2
  176. package/lib/typescript/src/groupDrivers.android.d.ts.map +0 -1
  177. package/lib/typescript/src/groupDrivers.d.ts +0 -2
  178. package/lib/typescript/src/groupDrivers.d.ts.map +0 -1
  179. package/lib/typescript/src/groupDrivers.ios.d.ts +0 -2
  180. package/lib/typescript/src/groupDrivers.ios.d.ts.map +0 -1
  181. package/lib/typescript/src/groupDrivers.native.d.ts +0 -4
  182. package/lib/typescript/src/groupDrivers.native.d.ts.map +0 -1
  183. package/lib/typescript/src/presentationProtocol.d.ts +0 -4
  184. package/lib/typescript/src/presentationProtocol.d.ts.map +0 -1
  185. package/lib/typescript/src/reactRequests.d.ts +0 -9
  186. package/lib/typescript/src/reactRequests.d.ts.map +0 -1
  187. package/src/driverState.ts +0 -118
  188. package/src/driverTypes.ts +0 -171
  189. package/src/drivers.android.ts +0 -8
  190. package/src/drivers.ios.ts +0 -8
  191. package/src/drivers.native.ts +0 -1599
  192. package/src/drivers.ts +0 -6
  193. package/src/groupDriverTypes.ts +0 -117
  194. package/src/groupDrivers.android.ts +0 -1
  195. package/src/groupDrivers.ios.ts +0 -1
  196. package/src/groupDrivers.native.ts +0 -1189
  197. package/src/groupDrivers.ts +0 -1
  198. package/src/presentationProtocol.ts +0 -28
  199. package/src/reactRequests.ts +0 -76
@@ -0,0 +1,399 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useRef } from 'react';
4
+ import { Platform } from 'react-native';
5
+ import { scheduleOnRN, scheduleOnUI } from 'react-native-worklets';
6
+ import { unwrapSmoothClipRef } from "./controllerInternals.js";
7
+ import { allocateSmoothClipId } from "./ids.js";
8
+ import { canonicalizeClipPresentation } from "./geometry.js";
9
+ import { subscribeGroupCompletion } from "./nativeCompletion.js";
10
+ import { appendPresentationPacket, PRESENTATION_STRIDE, presentationFromPacket } from "./presentationCodec.js";
11
+ import NativeSmoothClipModule from './smoothClipNative';
12
+ const beginGroupInteractionHostFunction = NativeSmoothClipModule.beginGroupInteraction;
13
+ const snapshotGroupHostFunction = NativeSmoothClipModule.snapshotGroup;
14
+ const setClipPresentationBatchHostFunction = NativeSmoothClipModule.setClipPresentationBatch;
15
+ const animateTimingGroupHostFunction = NativeSmoothClipModule.animateTimingGroup;
16
+ const animateSpringGroupHostFunction = NativeSmoothClipModule.animateSpringGroup;
17
+ const cancelAnimationGroupHostFunction = NativeSmoothClipModule.cancelAnimationGroup;
18
+ const SNAPSHOT_STRIDE = PRESENTATION_STRIDE + 1;
19
+ const MOTION_ENTRY_STRIDE = PRESENTATION_STRIDE * 2 + 2;
20
+ const NEEDS_START_STAMP = Platform.OS === 'android';
21
+ const DEFAULT_MASS = 4;
22
+ const DEFAULT_STIFFNESS = 900;
23
+ const DEFAULT_DAMPING = 120;
24
+ const DEFAULT_ENERGY_THRESHOLD = 6e-9;
25
+ const groupStates = new Map();
26
+ const clientRuns = new Map();
27
+ let nextClientRunId = 0;
28
+ function internalRef(ref) {
29
+ 'worklet';
30
+
31
+ const internal = unwrapSmoothClipRef(ref);
32
+ if (!internal) {
33
+ throw new Error('[SmoothClipView] A group received an invalid clip ref.');
34
+ }
35
+ return internal;
36
+ }
37
+ function validatedRefs(refs) {
38
+ 'worklet';
39
+
40
+ if (refs.length === 0) {
41
+ throw new Error('[SmoothClipView] A group must contain a clip.');
42
+ }
43
+ const seen = {};
44
+ return refs.map(ref => {
45
+ const internal = internalRef(ref);
46
+ const key = String(internal.id);
47
+ if (seen[key]) {
48
+ throw new Error('[SmoothClipView] A group cannot contain duplicate clips.');
49
+ }
50
+ seen[key] = true;
51
+ return internal;
52
+ });
53
+ }
54
+ function snapshotsFromPacket(refs, values) {
55
+ 'worklet';
56
+
57
+ if (values.length !== refs.length * SNAPSHOT_STRIDE) {
58
+ throw new Error('[SmoothClipView] Native returned an invalid group snapshot.');
59
+ }
60
+ return refs.map((clip, index) => {
61
+ const offset = index * SNAPSHOT_STRIDE;
62
+ const ready = values[offset];
63
+ const frame = presentationFromPacket(values, offset + 1);
64
+ if (ready !== 0 && ready !== 1 || frame === null) {
65
+ throw new Error('[SmoothClipView] Native returned an invalid group snapshot.');
66
+ }
67
+ return {
68
+ clip,
69
+ frame,
70
+ ready: ready === 1
71
+ };
72
+ });
73
+ }
74
+ function beginGroupOnUI(refs) {
75
+ 'worklet';
76
+
77
+ const internals = validatedRefs(refs);
78
+ return snapshotsFromPacket(refs, beginGroupInteractionHostFunction(internals.map(ref => ref.id)));
79
+ }
80
+ function setFramesOnUI(entries) {
81
+ 'worklet';
82
+
83
+ const internals = validatedRefs(entries.map(entry => entry.clip));
84
+ const packet = [];
85
+ entries.forEach((entry, index) => {
86
+ const frame = canonicalizeClipPresentation(entry.frame);
87
+ if (frame === null) {
88
+ throw new Error('[SmoothClipView] A group frame is invalid.');
89
+ }
90
+ packet.push(internals[index]?.id ?? 0);
91
+ appendPresentationPacket(packet, frame);
92
+ });
93
+ // A UI frame can race the Fabric host's first native registration (or its
94
+ // teardown). That is an availability result, not malformed input. The next
95
+ // streamed frame retries, while beginInteraction remains the explicit
96
+ // readiness gate for an atomic handoff.
97
+ setClipPresentationBatchHostFunction(packet);
98
+ }
99
+ function reduceMotionCode(value) {
100
+ 'worklet';
101
+
102
+ if (value === 'always') return 1;
103
+ if (value === 'never') return 2;
104
+ return 0;
105
+ }
106
+ function startTimestamp() {
107
+ 'worklet';
108
+
109
+ if (!NEEDS_START_STAMP) return Number.NaN;
110
+ const runtime = globalThis;
111
+ return runtime.__frameTimestamp || (typeof runtime._getAnimationTimestamp === 'function' ? runtime._getAnimationTimestamp() : Number.NaN);
112
+ }
113
+ function animationIsValid(animation) {
114
+ 'worklet';
115
+
116
+ if (animation.type === 'timing') {
117
+ const [x1,, x2] = animation.controlPoints;
118
+ return Number.isFinite(animation.duration) && animation.duration >= 0 && animation.controlPoints.every(Number.isFinite) && x1 >= 0 && x1 <= 1 && x2 >= 0 && x2 <= 1;
119
+ }
120
+ const mass = animation.mass ?? DEFAULT_MASS;
121
+ const stiffness = animation.stiffness ?? DEFAULT_STIFFNESS;
122
+ const damping = animation.damping ?? DEFAULT_DAMPING;
123
+ const velocity = animation.velocity ?? 0;
124
+ const energyThreshold = animation.energyThreshold ?? DEFAULT_ENERGY_THRESHOLD;
125
+ return [mass, stiffness, damping, velocity, energyThreshold].every(Number.isFinite) && mass > 0 && stiffness > 0 && damping >= 0 && energyThreshold > 0;
126
+ }
127
+ function validCompletionTag(completionTag) {
128
+ 'worklet';
129
+
130
+ return Number.isInteger(completionTag) && completionTag >= 0 && completionTag <= 0x7fffffff;
131
+ }
132
+ function validInternalCompletionTag(completionTag) {
133
+ 'worklet';
134
+
135
+ return Number.isInteger(completionTag) && completionTag >= -0x7fffffff && completionTag <= 0x7fffffff;
136
+ }
137
+ function animateGroupOnUI(controllerId, entries, animation, completionTag, allowInternalCompletionTag = false) {
138
+ 'worklet';
139
+
140
+ const completionTagIsValid = allowInternalCompletionTag ? validInternalCompletionTag(completionTag) : validCompletionTag(completionTag);
141
+ if (!animationIsValid(animation) || !completionTagIsValid) {
142
+ return null;
143
+ }
144
+ let internals;
145
+ try {
146
+ internals = validatedRefs(entries.map(entry => entry.clip));
147
+ } catch {
148
+ return null;
149
+ }
150
+ const packet = [];
151
+ for (let index = 0; index < entries.length; index += 1) {
152
+ const entry = entries[index];
153
+ const target = entry === undefined ? null : canonicalizeClipPresentation(entry.target);
154
+ if (entry === undefined || target === null) return null;
155
+ packet.push(internals[index]?.id ?? 0, 0);
156
+ // Fixed native packets retain a start slot. With hasFrom=0 its contents
157
+ // are ignored; duplicating the target avoids a second sentinel format.
158
+ appendPresentationPacket(packet, target);
159
+ appendPresentationPacket(packet, target);
160
+ }
161
+ if (packet.length !== entries.length * MOTION_ENTRY_STRIDE) return null;
162
+ const timestamp = startTimestamp();
163
+ let id;
164
+ if (animation.type === 'timing') {
165
+ const [x1, y1, x2, y2] = animation.controlPoints;
166
+ id = animateTimingGroupHostFunction(controllerId, packet, animation.duration, x1, y1, x2, y2, reduceMotionCode(animation.reduceMotion), completionTag, timestamp);
167
+ } else {
168
+ id = animateSpringGroupHostFunction(controllerId, packet, animation.mass ?? DEFAULT_MASS, animation.stiffness ?? DEFAULT_STIFFNESS, animation.damping ?? DEFAULT_DAMPING, animation.velocity ?? 0, animation.energyThreshold ?? DEFAULT_ENERGY_THRESHOLD, reduceMotionCode(animation.reduceMotion), completionTag, timestamp);
169
+ }
170
+ if (id <= 0) return null;
171
+ return {
172
+ controllerId,
173
+ id,
174
+ refs: entries.map(entry => entry.clip)
175
+ };
176
+ }
177
+ function cancelGroupOnUI(controllerId, handle) {
178
+ 'worklet';
179
+
180
+ const internal = handle;
181
+ if (internal.controllerId !== controllerId || !Number.isInteger(internal.id) || internal.id <= 0 || !Array.isArray(internal.refs)) {
182
+ return [];
183
+ }
184
+ let internals;
185
+ try {
186
+ internals = validatedRefs(internal.refs);
187
+ } catch {
188
+ return [];
189
+ }
190
+ const values = cancelAnimationGroupHostFunction(internal.id, 0);
191
+ if (values.length > 0) {
192
+ return snapshotsFromPacket(internal.refs, values);
193
+ }
194
+ const snapshots = snapshotGroupHostFunction(internals.map(internalRefValue => internalRefValue.id));
195
+ return snapshots.length === 0 ? [] : snapshotsFromPacket(internal.refs, snapshots);
196
+ }
197
+ function validReactEntries(entries) {
198
+ if (entries.length === 0) return false;
199
+ const seen = new Set();
200
+ for (const entry of entries) {
201
+ const ref = unwrapSmoothClipRef(entry.clip);
202
+ if (ref === undefined || seen.has(ref.id) || canonicalizeClipPresentation(entry.target) === null) {
203
+ return false;
204
+ }
205
+ seen.add(ref.id);
206
+ }
207
+ return true;
208
+ }
209
+ function settleRun(run, finished) {
210
+ if (run.settled) return;
211
+ run.settled = true;
212
+ run.resolve(finished);
213
+ }
214
+ function registerNativeGroupRun(controllerId, clientRunId, groupId) {
215
+ const run = clientRuns.get(clientRunId);
216
+ clientRuns.delete(clientRunId);
217
+ if (!run) return;
218
+ run.resolveNativeId(groupId);
219
+ const state = groupStates.get(controllerId);
220
+ if (!state || groupId <= 0) {
221
+ settleRun(run, false);
222
+ state?.callbackRef.current?.({
223
+ finished: false
224
+ });
225
+ return;
226
+ }
227
+ state.runs.set(groupId, run);
228
+ const deferred = state.deferredCompletions.get(groupId);
229
+ if (deferred !== undefined) {
230
+ state.deferredCompletions.delete(groupId);
231
+ handleNativeGroupCompletion(controllerId, groupId, deferred.completionTag, deferred.finished, deferred.snapshots);
232
+ }
233
+ }
234
+ function handleNativeGroupCompletion(controllerId, groupId, completionTag, finished, values) {
235
+ const state = groupStates.get(controllerId);
236
+ if (!state || state.deliveredCompletions.has(groupId)) return;
237
+ const run = state.runs.get(groupId);
238
+ if (!run) {
239
+ // Non-negative tags belong to UI-runtime runs, which deliberately have no
240
+ // Promise registry on React. Negative tags are private correlation keys
241
+ // for React runs and may arrive before scheduleOnRN registers the run.
242
+ if (completionTag >= 0) {
243
+ state.deliveredCompletions.add(groupId);
244
+ state.callbackRef.current?.({
245
+ finished,
246
+ ...(completionTag > 0 ? {
247
+ completionTag
248
+ } : {})
249
+ });
250
+ return;
251
+ }
252
+ state.deferredCompletions.set(groupId, {
253
+ completionTag,
254
+ finished,
255
+ snapshots: values
256
+ });
257
+ return;
258
+ }
259
+ state.deliveredCompletions.add(groupId);
260
+ state.runs.delete(groupId);
261
+ settleRun(run, finished);
262
+ state.callbackRef.current?.({
263
+ finished,
264
+ ...(completionTag > 0 ? {
265
+ completionTag
266
+ } : {})
267
+ });
268
+ }
269
+ function cancelRegisteredRun(controllerId, groupId, refs) {
270
+ scheduleOnUI((ownerId, id, clips) => {
271
+ 'worklet';
272
+
273
+ cancelGroupOnUI(ownerId, {
274
+ controllerId: ownerId,
275
+ id,
276
+ refs: clips
277
+ });
278
+ }, controllerId, groupId, refs);
279
+ }
280
+ export function useSmoothClipGroup(options = {}) {
281
+ const controllerIdRef = useRef(0);
282
+ const groupRef = useRef(null);
283
+ const callbackRef = useRef(options.onAnimationComplete);
284
+ callbackRef.current = options.onAnimationComplete;
285
+ if (controllerIdRef.current === 0) {
286
+ controllerIdRef.current = allocateSmoothClipId();
287
+ }
288
+ const controllerId = controllerIdRef.current;
289
+ if (groupRef.current === null) {
290
+ groupRef.current = {
291
+ ui: {
292
+ setFrames(entries) {
293
+ 'worklet';
294
+
295
+ setFramesOnUI(entries);
296
+ },
297
+ beginInteraction(refs) {
298
+ 'worklet';
299
+
300
+ return beginGroupOnUI(refs);
301
+ },
302
+ animateTo(entries, animation, completionTag = 0) {
303
+ 'worklet';
304
+
305
+ return animateGroupOnUI(controllerId, entries, animation, completionTag);
306
+ },
307
+ cancel(run) {
308
+ 'worklet';
309
+
310
+ return cancelGroupOnUI(controllerId, run);
311
+ }
312
+ },
313
+ react: {
314
+ animateTo(entries, animation) {
315
+ if (!validReactEntries(entries) || !animationIsValid(animation)) {
316
+ callbackRef.current?.({
317
+ finished: false
318
+ });
319
+ return {
320
+ finished: Promise.resolve(false),
321
+ cancel() {}
322
+ };
323
+ }
324
+ let resolve;
325
+ let resolveNativeId;
326
+ const finished = new Promise(accept => {
327
+ resolve = accept;
328
+ });
329
+ const nativeId = new Promise(accept => {
330
+ resolveNativeId = accept;
331
+ });
332
+ const run = {
333
+ controllerId,
334
+ settled: false,
335
+ cancelRequested: false,
336
+ refs: entries.map(entry => entry.clip),
337
+ resolve,
338
+ resolveNativeId,
339
+ nativeId
340
+ };
341
+ nextClientRunId = nextClientRunId % 0x7ffffffe + 1;
342
+ const clientRunId = nextClientRunId;
343
+ clientRuns.set(clientRunId, run);
344
+ scheduleOnUI((id, motionEntries, spec, pendingRunId) => {
345
+ 'worklet';
346
+
347
+ const handle = animateGroupOnUI(id, motionEntries, spec, -pendingRunId, true);
348
+ scheduleOnRN(registerNativeGroupRun, id, pendingRunId, handle?.id ?? 0);
349
+ }, controllerId, entries, animation, clientRunId);
350
+ return {
351
+ finished,
352
+ cancel() {
353
+ if (run.settled || run.cancelRequested) return;
354
+ run.cancelRequested = true;
355
+ nativeId.then(groupId => {
356
+ if (groupId > 0 && !run.settled) {
357
+ cancelRegisteredRun(run.controllerId, groupId, run.refs);
358
+ }
359
+ });
360
+ }
361
+ };
362
+ }
363
+ }
364
+ };
365
+ }
366
+ useEffect(() => {
367
+ const state = {
368
+ callbackRef,
369
+ runs: new Map(),
370
+ deferredCompletions: new Map(),
371
+ deliveredCompletions: new Set()
372
+ };
373
+ groupStates.set(controllerId, state);
374
+ const unsubscribe = subscribeGroupCompletion(controllerId, ({
375
+ groupId,
376
+ completionTag,
377
+ finished,
378
+ snapshots
379
+ }) => {
380
+ handleNativeGroupCompletion(controllerId, groupId, completionTag, finished, snapshots);
381
+ });
382
+ return () => {
383
+ unsubscribe();
384
+ if (groupStates.get(controllerId) === state) {
385
+ groupStates.delete(controllerId);
386
+ }
387
+ for (const run of state.runs.values()) settleRun(run, false);
388
+ state.runs.clear();
389
+ for (const [clientRunId, run] of clientRuns) {
390
+ if (run.controllerId !== controllerId) continue;
391
+ clientRuns.delete(clientRunId);
392
+ run.resolveNativeId(0);
393
+ settleRun(run, false);
394
+ }
395
+ };
396
+ }, [controllerId]);
397
+ return groupRef.current;
398
+ }
399
+ //# sourceMappingURL=groups.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useRef","Platform","scheduleOnRN","scheduleOnUI","unwrapSmoothClipRef","allocateSmoothClipId","canonicalizeClipPresentation","subscribeGroupCompletion","appendPresentationPacket","PRESENTATION_STRIDE","presentationFromPacket","NativeSmoothClipModule","beginGroupInteractionHostFunction","beginGroupInteraction","snapshotGroupHostFunction","snapshotGroup","setClipPresentationBatchHostFunction","setClipPresentationBatch","animateTimingGroupHostFunction","animateTimingGroup","animateSpringGroupHostFunction","animateSpringGroup","cancelAnimationGroupHostFunction","cancelAnimationGroup","SNAPSHOT_STRIDE","MOTION_ENTRY_STRIDE","NEEDS_START_STAMP","OS","DEFAULT_MASS","DEFAULT_STIFFNESS","DEFAULT_DAMPING","DEFAULT_ENERGY_THRESHOLD","groupStates","Map","clientRuns","nextClientRunId","internalRef","ref","internal","Error","validatedRefs","refs","length","seen","map","key","String","id","snapshotsFromPacket","values","clip","index","offset","ready","frame","beginGroupOnUI","internals","setFramesOnUI","entries","entry","packet","forEach","push","reduceMotionCode","value","startTimestamp","Number","NaN","runtime","globalThis","__frameTimestamp","_getAnimationTimestamp","animationIsValid","animation","type","x1","x2","controlPoints","isFinite","duration","every","mass","stiffness","damping","velocity","energyThreshold","validCompletionTag","completionTag","isInteger","validInternalCompletionTag","animateGroupOnUI","controllerId","allowInternalCompletionTag","completionTagIsValid","target","undefined","timestamp","y1","y2","reduceMotion","cancelGroupOnUI","handle","Array","isArray","snapshots","internalRefValue","validReactEntries","Set","has","add","settleRun","run","finished","settled","resolve","registerNativeGroupRun","clientRunId","groupId","get","delete","resolveNativeId","state","callbackRef","current","runs","set","deferred","deferredCompletions","handleNativeGroupCompletion","deliveredCompletions","cancelRegisteredRun","ownerId","clips","useSmoothClipGroup","options","controllerIdRef","groupRef","onAnimationComplete","ui","setFrames","beginInteraction","animateTo","cancel","react","Promise","accept","nativeId","cancelRequested","motionEntries","spec","pendingRunId","then","unsubscribe","clear"],"sourceRoot":"../../src","sources":["groups.native.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,QAAQ,QAAQ,cAAc;AACvC,SAASC,YAAY,EAAEC,YAAY,QAAQ,uBAAuB;AASlE,SACEC,mBAAmB,QAEd,0BAAuB;AAC9B,SAASC,oBAAoB,QAAQ,UAAO;AAC5C,SAASC,4BAA4B,QAAQ,eAAY;AAQzD,SAASC,wBAAwB,QAAQ,uBAAoB;AAC7D,SACEC,wBAAwB,EACxBC,mBAAmB,EACnBC,sBAAsB,QACjB,wBAAqB;AAC5B,OAAOC,sBAAsB,MAAM,oBAAoB;AAEvD,MAAMC,iCAAiC,GACrCD,sBAAsB,CAACE,qBAAqB;AAC9C,MAAMC,yBAAyB,GAAGH,sBAAsB,CAACI,aAAa;AACtE,MAAMC,oCAAoC,GACxCL,sBAAsB,CAACM,wBAAwB;AACjD,MAAMC,8BAA8B,GAClCP,sBAAsB,CAACQ,kBAAkB;AAC3C,MAAMC,8BAA8B,GAClCT,sBAAsB,CAACU,kBAAkB;AAC3C,MAAMC,gCAAgC,GACpCX,sBAAsB,CAACY,oBAAoB;AAE7C,MAAMC,eAAe,GAAGf,mBAAmB,GAAG,CAAC;AAC/C,MAAMgB,mBAAmB,GAAGhB,mBAAmB,GAAG,CAAC,GAAG,CAAC;AACvD,MAAMiB,iBAAiB,GAAGzB,QAAQ,CAAC0B,EAAE,KAAK,SAAS;AACnD,MAAMC,YAAY,GAAG,CAAC;AACtB,MAAMC,iBAAiB,GAAG,GAAG;AAC7B,MAAMC,eAAe,GAAG,GAAG;AAC3B,MAAMC,wBAAwB,GAAG,IAAI;AAmCrC,MAAMC,WAAW,GAAG,IAAIC,GAAG,CAAqB,CAAC;AACjD,MAAMC,UAAU,GAAG,IAAID,GAAG,CAAqB,CAAC;AAChD,IAAIE,eAAe,GAAG,CAAC;AAEvB,SAASC,WAAWA,CAACC,GAAkB,EAAyB;EAC9D,SAAS;;EACT,MAAMC,QAAQ,GAAGlC,mBAAmB,CAACiC,GAAG,CAAC;EACzC,IAAI,CAACC,QAAQ,EAAE;IACb,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;EAC3E;EACA,OAAOD,QAAQ;AACjB;AAEA,SAASE,aAAaA,CACpBC,IAA8B,EACI;EAClC,SAAS;;EACT,IAAIA,IAAI,CAACC,MAAM,KAAK,CAAC,EAAE;IACrB,MAAM,IAAIH,KAAK,CAAC,+CAA+C,CAAC;EAClE;EACA,MAAMI,IAA0B,GAAG,CAAC,CAAC;EACrC,OAAOF,IAAI,CAACG,GAAG,CAAEP,GAAG,IAAK;IACvB,MAAMC,QAAQ,GAAGF,WAAW,CAACC,GAAG,CAAC;IACjC,MAAMQ,GAAG,GAAGC,MAAM,CAACR,QAAQ,CAACS,EAAE,CAAC;IAC/B,IAAIJ,IAAI,CAACE,GAAG,CAAC,EAAE;MACb,MAAM,IAAIN,KAAK,CACb,0DACF,CAAC;IACH;IACAI,IAAI,CAACE,GAAG,CAAC,GAAG,IAAI;IAChB,OAAOP,QAAQ;EACjB,CAAC,CAAC;AACJ;AAEA,SAASU,mBAAmBA,CAC1BP,IAA8B,EAC9BQ,MAAyB,EACW;EACpC,SAAS;;EACT,IAAIA,MAAM,CAACP,MAAM,KAAKD,IAAI,CAACC,MAAM,GAAGlB,eAAe,EAAE;IACnD,MAAM,IAAIe,KAAK,CACb,6DACF,CAAC;EACH;EACA,OAAOE,IAAI,CAACG,GAAG,CAAC,CAACM,IAAI,EAAEC,KAAK,KAAK;IAC/B,MAAMC,MAAM,GAAGD,KAAK,GAAG3B,eAAe;IACtC,MAAM6B,KAAK,GAAGJ,MAAM,CAACG,MAAM,CAAC;IAC5B,MAAME,KAAK,GAAG5C,sBAAsB,CAACuC,MAAM,EAAEG,MAAM,GAAG,CAAC,CAAC;IACxD,IAAKC,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,CAAC,IAAKC,KAAK,KAAK,IAAI,EAAE;MAClD,MAAM,IAAIf,KAAK,CACb,6DACF,CAAC;IACH;IACA,OAAO;MAAEW,IAAI;MAAEI,KAAK;MAAED,KAAK,EAAEA,KAAK,KAAK;IAAE,CAAC;EAC5C,CAAC,CAAC;AACJ;AAEA,SAASE,cAAcA,CACrBd,IAA8B,EACM;EACpC,SAAS;;EACT,MAAMe,SAAS,GAAGhB,aAAa,CAACC,IAAI,CAAC;EACrC,OAAOO,mBAAmB,CACxBP,IAAI,EACJ7B,iCAAiC,CAAC4C,SAAS,CAACZ,GAAG,CAAEP,GAAG,IAAKA,GAAG,CAACU,EAAE,CAAC,CAClE,CAAC;AACH;AAEA,SAASU,aAAaA,CAACC,OAAwC,EAAQ;EACrE,SAAS;;EACT,MAAMF,SAAS,GAAGhB,aAAa,CAACkB,OAAO,CAACd,GAAG,CAAEe,KAAK,IAAKA,KAAK,CAACT,IAAI,CAAC,CAAC;EACnE,MAAMU,MAAgB,GAAG,EAAE;EAC3BF,OAAO,CAACG,OAAO,CAAC,CAACF,KAAK,EAAER,KAAK,KAAK;IAChC,MAAMG,KAAK,GAAGhD,4BAA4B,CAACqD,KAAK,CAACL,KAAK,CAAC;IACvD,IAAIA,KAAK,KAAK,IAAI,EAAE;MAClB,MAAM,IAAIf,KAAK,CAAC,4CAA4C,CAAC;IAC/D;IACAqB,MAAM,CAACE,IAAI,CAACN,SAAS,CAACL,KAAK,CAAC,EAAEJ,EAAE,IAAI,CAAC,CAAC;IACtCvC,wBAAwB,CAACoD,MAAM,EAAEN,KAAK,CAAC;EACzC,CAAC,CAAC;EACF;EACA;EACA;EACA;EACAtC,oCAAoC,CAAC4C,MAAM,CAAC;AAC9C;AAEA,SAASG,gBAAgBA,CAACC,KAAmC,EAAU;EACrE,SAAS;;EACT,IAAIA,KAAK,KAAK,QAAQ,EAAE,OAAO,CAAC;EAChC,IAAIA,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC;EAC/B,OAAO,CAAC;AACV;AAEA,SAASC,cAAcA,CAAA,EAAW;EAChC,SAAS;;EACT,IAAI,CAACvC,iBAAiB,EAAE,OAAOwC,MAAM,CAACC,GAAG;EACzC,MAAMC,OAAO,GAAGC,UAGf;EACD,OACED,OAAO,CAACE,gBAAgB,KACvB,OAAOF,OAAO,CAACG,sBAAsB,KAAK,UAAU,GACjDH,OAAO,CAACG,sBAAsB,CAAC,CAAC,GAChCL,MAAM,CAACC,GAAG,CAAC;AAEnB;AAEA,SAASK,gBAAgBA,CAACC,SAA8B,EAAW;EACjE,SAAS;;EACT,IAAIA,SAAS,CAACC,IAAI,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAACC,EAAE,GAAIC,EAAE,CAAC,GAAGH,SAAS,CAACI,aAAa;IAC1C,OACEX,MAAM,CAACY,QAAQ,CAACL,SAAS,CAACM,QAAQ,CAAC,IACnCN,SAAS,CAACM,QAAQ,IAAI,CAAC,IACvBN,SAAS,CAACI,aAAa,CAACG,KAAK,CAACd,MAAM,CAACY,QAAQ,CAAC,IAC9CH,EAAE,IAAI,CAAC,IACPA,EAAE,IAAI,CAAC,IACPC,EAAE,IAAI,CAAC,IACPA,EAAE,IAAI,CAAC;EAEX;EACA,MAAMK,IAAI,GAAGR,SAAS,CAACQ,IAAI,IAAIrD,YAAY;EAC3C,MAAMsD,SAAS,GAAGT,SAAS,CAACS,SAAS,IAAIrD,iBAAiB;EAC1D,MAAMsD,OAAO,GAAGV,SAAS,CAACU,OAAO,IAAIrD,eAAe;EACpD,MAAMsD,QAAQ,GAAGX,SAAS,CAACW,QAAQ,IAAI,CAAC;EACxC,MAAMC,eAAe,GAAGZ,SAAS,CAACY,eAAe,IAAItD,wBAAwB;EAC7E,OACE,CAACkD,IAAI,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,eAAe,CAAC,CAACL,KAAK,CACzDd,MAAM,CAACY,QACT,CAAC,IACDG,IAAI,GAAG,CAAC,IACRC,SAAS,GAAG,CAAC,IACbC,OAAO,IAAI,CAAC,IACZE,eAAe,GAAG,CAAC;AAEvB;AAEA,SAASC,kBAAkBA,CAACC,aAAqB,EAAW;EAC1D,SAAS;;EACT,OACErB,MAAM,CAACsB,SAAS,CAACD,aAAa,CAAC,IAC/BA,aAAa,IAAI,CAAC,IAClBA,aAAa,IAAI,UAAU;AAE/B;AAEA,SAASE,0BAA0BA,CAACF,aAAqB,EAAW;EAClE,SAAS;;EACT,OACErB,MAAM,CAACsB,SAAS,CAACD,aAAa,CAAC,IAC/BA,aAAa,IAAI,CAAC,UAAU,IAC5BA,aAAa,IAAI,UAAU;AAE/B;AAEA,SAASG,gBAAgBA,CACvBC,YAAoB,EACpBjC,OAAyC,EACzCe,SAA8B,EAC9Bc,aAAqB,EACrBK,0BAA0B,GAAG,KAAK,EACN;EAC5B,SAAS;;EACT,MAAMC,oBAAoB,GAAGD,0BAA0B,GACnDH,0BAA0B,CAACF,aAAa,CAAC,GACzCD,kBAAkB,CAACC,aAAa,CAAC;EACrC,IAAI,CAACf,gBAAgB,CAACC,SAAS,CAAC,IAAI,CAACoB,oBAAoB,EAAE;IACzD,OAAO,IAAI;EACb;EACA,IAAIrC,SAA2C;EAC/C,IAAI;IACFA,SAAS,GAAGhB,aAAa,CAACkB,OAAO,CAACd,GAAG,CAAEe,KAAK,IAAKA,KAAK,CAACT,IAAI,CAAC,CAAC;EAC/D,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;EACA,MAAMU,MAAgB,GAAG,EAAE;EAC3B,KAAK,IAAIT,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGO,OAAO,CAAChB,MAAM,EAAES,KAAK,IAAI,CAAC,EAAE;IACtD,MAAMQ,KAAK,GAAGD,OAAO,CAACP,KAAK,CAAC;IAC5B,MAAM2C,MAAM,GACVnC,KAAK,KAAKoC,SAAS,GAAG,IAAI,GAAGzF,4BAA4B,CAACqD,KAAK,CAACmC,MAAM,CAAC;IACzE,IAAInC,KAAK,KAAKoC,SAAS,IAAID,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;IACvDlC,MAAM,CAACE,IAAI,CAACN,SAAS,CAACL,KAAK,CAAC,EAAEJ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC;IACA;IACAvC,wBAAwB,CAACoD,MAAM,EAAEkC,MAAM,CAAC;IACxCtF,wBAAwB,CAACoD,MAAM,EAAEkC,MAAM,CAAC;EAC1C;EACA,IAAIlC,MAAM,CAAClB,MAAM,KAAKgB,OAAO,CAAChB,MAAM,GAAGjB,mBAAmB,EAAE,OAAO,IAAI;EAEvE,MAAMuE,SAAS,GAAG/B,cAAc,CAAC,CAAC;EAClC,IAAIlB,EAAU;EACd,IAAI0B,SAAS,CAACC,IAAI,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAACC,EAAE,EAAEsB,EAAE,EAAErB,EAAE,EAAEsB,EAAE,CAAC,GAAGzB,SAAS,CAACI,aAAa;IAChD9B,EAAE,GAAG7B,8BAA8B,CACjCyE,YAAY,EACZ/B,MAAM,EACNa,SAAS,CAACM,QAAQ,EAClBJ,EAAE,EACFsB,EAAE,EACFrB,EAAE,EACFsB,EAAE,EACFnC,gBAAgB,CAACU,SAAS,CAAC0B,YAAY,CAAC,EACxCZ,aAAa,EACbS,SACF,CAAC;EACH,CAAC,MAAM;IACLjD,EAAE,GAAG3B,8BAA8B,CACjCuE,YAAY,EACZ/B,MAAM,EACNa,SAAS,CAACQ,IAAI,IAAIrD,YAAY,EAC9B6C,SAAS,CAACS,SAAS,IAAIrD,iBAAiB,EACxC4C,SAAS,CAACU,OAAO,IAAIrD,eAAe,EACpC2C,SAAS,CAACW,QAAQ,IAAI,CAAC,EACvBX,SAAS,CAACY,eAAe,IAAItD,wBAAwB,EACrDgC,gBAAgB,CAACU,SAAS,CAAC0B,YAAY,CAAC,EACxCZ,aAAa,EACbS,SACF,CAAC;EACH;EACA,IAAIjD,EAAE,IAAI,CAAC,EAAE,OAAO,IAAI;EACxB,OAAO;IACL4C,YAAY;IACZ5C,EAAE;IACFN,IAAI,EAAEiB,OAAO,CAACd,GAAG,CAAEe,KAAK,IAAKA,KAAK,CAACT,IAAI;EACzC,CAAC;AACH;AAEA,SAASkD,eAAeA,CACtBT,YAAoB,EACpBU,MAA2B,EACS;EACpC,SAAS;;EACT,MAAM/D,QAAQ,GAAG+D,MAA2B;EAC5C,IACE/D,QAAQ,CAACqD,YAAY,KAAKA,YAAY,IACtC,CAACzB,MAAM,CAACsB,SAAS,CAAClD,QAAQ,CAACS,EAAE,CAAC,IAC9BT,QAAQ,CAACS,EAAE,IAAI,CAAC,IAChB,CAACuD,KAAK,CAACC,OAAO,CAACjE,QAAQ,CAACG,IAAI,CAAC,EAC7B;IACA,OAAO,EAAE;EACX;EACA,IAAIe,SAA2C;EAC/C,IAAI;IACFA,SAAS,GAAGhB,aAAa,CAACF,QAAQ,CAACG,IAAI,CAAC;EAC1C,CAAC,CAAC,MAAM;IACN,OAAO,EAAE;EACX;EACA,MAAMQ,MAAM,GAAG3B,gCAAgC,CAACgB,QAAQ,CAACS,EAAE,EAAE,CAAC,CAAC;EAC/D,IAAIE,MAAM,CAACP,MAAM,GAAG,CAAC,EAAE;IACrB,OAAOM,mBAAmB,CAACV,QAAQ,CAACG,IAAI,EAAEQ,MAAM,CAAC;EACnD;EACA,MAAMuD,SAAS,GAAG1F,yBAAyB,CACzC0C,SAAS,CAACZ,GAAG,CAAE6D,gBAAgB,IAAKA,gBAAgB,CAAC1D,EAAE,CACzD,CAAC;EACD,OAAOyD,SAAS,CAAC9D,MAAM,KAAK,CAAC,GACzB,EAAE,GACFM,mBAAmB,CAACV,QAAQ,CAACG,IAAI,EAAE+D,SAAS,CAAC;AACnD;AAEA,SAASE,iBAAiBA,CAAChD,OAAyC,EAAW;EAC7E,IAAIA,OAAO,CAAChB,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK;EACtC,MAAMC,IAAI,GAAG,IAAIgE,GAAG,CAAS,CAAC;EAC9B,KAAK,MAAMhD,KAAK,IAAID,OAAO,EAAE;IAC3B,MAAMrB,GAAG,GAAGjC,mBAAmB,CAACuD,KAAK,CAACT,IAAI,CAAC;IAC3C,IACEb,GAAG,KAAK0D,SAAS,IACjBpD,IAAI,CAACiE,GAAG,CAACvE,GAAG,CAACU,EAAE,CAAC,IAChBzC,4BAA4B,CAACqD,KAAK,CAACmC,MAAM,CAAC,KAAK,IAAI,EACnD;MACA,OAAO,KAAK;IACd;IACAnD,IAAI,CAACkE,GAAG,CAACxE,GAAG,CAACU,EAAE,CAAC;EAClB;EACA,OAAO,IAAI;AACb;AAEA,SAAS+D,SAASA,CAACC,GAAe,EAAEC,QAAiB,EAAQ;EAC3D,IAAID,GAAG,CAACE,OAAO,EAAE;EACjBF,GAAG,CAACE,OAAO,GAAG,IAAI;EAClBF,GAAG,CAACG,OAAO,CAACF,QAAQ,CAAC;AACvB;AAEA,SAASG,sBAAsBA,CAC7BxB,YAAoB,EACpByB,WAAmB,EACnBC,OAAe,EACT;EACN,MAAMN,GAAG,GAAG7E,UAAU,CAACoF,GAAG,CAACF,WAAW,CAAC;EACvClF,UAAU,CAACqF,MAAM,CAACH,WAAW,CAAC;EAC9B,IAAI,CAACL,GAAG,EAAE;EACVA,GAAG,CAACS,eAAe,CAACH,OAAO,CAAC;EAC5B,MAAMI,KAAK,GAAGzF,WAAW,CAACsF,GAAG,CAAC3B,YAAY,CAAC;EAC3C,IAAI,CAAC8B,KAAK,IAAIJ,OAAO,IAAI,CAAC,EAAE;IAC1BP,SAAS,CAACC,GAAG,EAAE,KAAK,CAAC;IACrBU,KAAK,EAAEC,WAAW,CAACC,OAAO,GAAG;MAAEX,QAAQ,EAAE;IAAM,CAAC,CAAC;IACjD;EACF;EACAS,KAAK,CAACG,IAAI,CAACC,GAAG,CAACR,OAAO,EAAEN,GAAG,CAAC;EAC5B,MAAMe,QAAQ,GAAGL,KAAK,CAACM,mBAAmB,CAACT,GAAG,CAACD,OAAO,CAAC;EACvD,IAAIS,QAAQ,KAAK/B,SAAS,EAAE;IAC1B0B,KAAK,CAACM,mBAAmB,CAACR,MAAM,CAACF,OAAO,CAAC;IACzCW,2BAA2B,CACzBrC,YAAY,EACZ0B,OAAO,EACPS,QAAQ,CAACvC,aAAa,EACtBuC,QAAQ,CAACd,QAAQ,EACjBc,QAAQ,CAACtB,SACX,CAAC;EACH;AACF;AAEA,SAASwB,2BAA2BA,CAClCrC,YAAoB,EACpB0B,OAAe,EACf9B,aAAqB,EACrByB,QAAiB,EACjB/D,MAAyB,EACnB;EACN,MAAMwE,KAAK,GAAGzF,WAAW,CAACsF,GAAG,CAAC3B,YAAY,CAAC;EAC3C,IAAI,CAAC8B,KAAK,IAAIA,KAAK,CAACQ,oBAAoB,CAACrB,GAAG,CAACS,OAAO,CAAC,EAAE;EACvD,MAAMN,GAAG,GAAGU,KAAK,CAACG,IAAI,CAACN,GAAG,CAACD,OAAO,CAAC;EACnC,IAAI,CAACN,GAAG,EAAE;IACR;IACA;IACA;IACA,IAAIxB,aAAa,IAAI,CAAC,EAAE;MACtBkC,KAAK,CAACQ,oBAAoB,CAACpB,GAAG,CAACQ,OAAO,CAAC;MACvCI,KAAK,CAACC,WAAW,CAACC,OAAO,GAAG;QAC1BX,QAAQ;QACR,IAAIzB,aAAa,GAAG,CAAC,GAAG;UAAEA;QAAc,CAAC,GAAG,CAAC,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IACAkC,KAAK,CAACM,mBAAmB,CAACF,GAAG,CAACR,OAAO,EAAE;MACrC9B,aAAa;MACbyB,QAAQ;MACRR,SAAS,EAAEvD;IACb,CAAC,CAAC;IACF;EACF;EACAwE,KAAK,CAACQ,oBAAoB,CAACpB,GAAG,CAACQ,OAAO,CAAC;EACvCI,KAAK,CAACG,IAAI,CAACL,MAAM,CAACF,OAAO,CAAC;EAC1BP,SAAS,CAACC,GAAG,EAAEC,QAAQ,CAAC;EACxBS,KAAK,CAACC,WAAW,CAACC,OAAO,GAAG;IAC1BX,QAAQ;IACR,IAAIzB,aAAa,GAAG,CAAC,GAAG;MAAEA;IAAc,CAAC,GAAG,CAAC,CAAC;EAChD,CAAC,CAAC;AACJ;AAEA,SAAS2C,mBAAmBA,CAC1BvC,YAAoB,EACpB0B,OAAe,EACf5E,IAA8B,EACxB;EACNtC,YAAY,CACV,CAACgI,OAAe,EAAEpF,EAAU,EAAEqF,KAA+B,KAAK;IAChE,SAAS;;IACThC,eAAe,CAAC+B,OAAO,EAAE;MACvBxC,YAAY,EAAEwC,OAAO;MACrBpF,EAAE;MACFN,IAAI,EAAE2F;IACR,CAAiC,CAAC;EACpC,CAAC,EACDzC,YAAY,EACZ0B,OAAO,EACP5E,IACF,CAAC;AACH;AAEA,OAAO,SAAS4F,kBAAkBA,CAChCC,OAA+B,GAAG,CAAC,CAAC,EACnB;EACjB,MAAMC,eAAe,GAAGvI,MAAM,CAAC,CAAC,CAAC;EACjC,MAAMwI,QAAQ,GAAGxI,MAAM,CAAyB,IAAI,CAAC;EACrD,MAAM0H,WAAW,GAAG1H,MAAM,CAACsI,OAAO,CAACG,mBAAmB,CAAC;EACvDf,WAAW,CAACC,OAAO,GAAGW,OAAO,CAACG,mBAAmB;EACjD,IAAIF,eAAe,CAACZ,OAAO,KAAK,CAAC,EAAE;IACjCY,eAAe,CAACZ,OAAO,GAAGtH,oBAAoB,CAAC,CAAC;EAClD;EACA,MAAMsF,YAAY,GAAG4C,eAAe,CAACZ,OAAO;EAE5C,IAAIa,QAAQ,CAACb,OAAO,KAAK,IAAI,EAAE;IAC7Ba,QAAQ,CAACb,OAAO,GAAG;MACjBe,EAAE,EAAE;QACFC,SAASA,CAACjF,OAAO,EAAE;UACjB,SAAS;;UACTD,aAAa,CAACC,OAAO,CAAC;QACxB,CAAC;QACDkF,gBAAgBA,CAACnG,IAAI,EAAE;UACrB,SAAS;;UACT,OAAOc,cAAc,CAACd,IAAI,CAAC;QAC7B,CAAC;QACDoG,SAASA,CAACnF,OAAO,EAAEe,SAAS,EAAEc,aAAa,GAAG,CAAC,EAAE;UAC/C,SAAS;;UACT,OAAOG,gBAAgB,CACrBC,YAAY,EACZjC,OAAO,EACPe,SAAS,EACTc,aACF,CAAC;QACH,CAAC;QACDuD,MAAMA,CAAC/B,GAAG,EAAE;UACV,SAAS;;UACT,OAAOX,eAAe,CAACT,YAAY,EAAEoB,GAAG,CAAC;QAC3C;MACF,CAAC;MACDgC,KAAK,EAAE;QACLF,SAASA,CAACnF,OAAO,EAAEe,SAAS,EAAsB;UAChD,IAAI,CAACiC,iBAAiB,CAAChD,OAAO,CAAC,IAAI,CAACc,gBAAgB,CAACC,SAAS,CAAC,EAAE;YAC/DiD,WAAW,CAACC,OAAO,GAAG;cAAEX,QAAQ,EAAE;YAAM,CAAC,CAAC;YAC1C,OAAO;cACLA,QAAQ,EAAEgC,OAAO,CAAC9B,OAAO,CAAC,KAAK,CAAC;cAChC4B,MAAMA,CAAA,EAAG,CAAC;YACZ,CAAC;UACH;UACA,IAAI5B,OAAqC;UACzC,IAAIM,eAAsC;UAC1C,MAAMR,QAAQ,GAAG,IAAIgC,OAAO,CAAWC,MAAM,IAAK;YAChD/B,OAAO,GAAG+B,MAAM;UAClB,CAAC,CAAC;UACF,MAAMC,QAAQ,GAAG,IAAIF,OAAO,CAAUC,MAAM,IAAK;YAC/CzB,eAAe,GAAGyB,MAAM;UAC1B,CAAC,CAAC;UACF,MAAMlC,GAAe,GAAG;YACtBpB,YAAY;YACZsB,OAAO,EAAE,KAAK;YACdkC,eAAe,EAAE,KAAK;YACtB1G,IAAI,EAAEiB,OAAO,CAACd,GAAG,CAAEe,KAAK,IAAKA,KAAK,CAACT,IAAI,CAAC;YACxCgE,OAAO;YACPM,eAAe;YACf0B;UACF,CAAC;UACD/G,eAAe,GAAIA,eAAe,GAAG,UAAU,GAAI,CAAC;UACpD,MAAMiF,WAAW,GAAGjF,eAAe;UACnCD,UAAU,CAAC2F,GAAG,CAACT,WAAW,EAAEL,GAAG,CAAC;UAChC5G,YAAY,CACV,CACE4C,EAAU,EACVqG,aAA+C,EAC/CC,IAAyB,EACzBC,YAAoB,KACjB;YACH,SAAS;;YACT,MAAMjD,MAAM,GAAGX,gBAAgB,CAC7B3C,EAAE,EACFqG,aAAa,EACbC,IAAI,EACJ,CAACC,YAAY,EACb,IACF,CAAC;YACDpJ,YAAY,CACViH,sBAAsB,EACtBpE,EAAE,EACFuG,YAAY,EACXjD,MAAM,EAA+BtD,EAAE,IAAI,CAC9C,CAAC;UACH,CAAC,EACD4C,YAAY,EACZjC,OAAO,EACPe,SAAS,EACT2C,WACF,CAAC;UACD,OAAO;YACLJ,QAAQ;YACR8B,MAAMA,CAAA,EAAG;cACP,IAAI/B,GAAG,CAACE,OAAO,IAAIF,GAAG,CAACoC,eAAe,EAAE;cACxCpC,GAAG,CAACoC,eAAe,GAAG,IAAI;cAC1BD,QAAQ,CAACK,IAAI,CAAElC,OAAO,IAAK;gBACzB,IAAIA,OAAO,GAAG,CAAC,IAAI,CAACN,GAAG,CAACE,OAAO,EAAE;kBAC/BiB,mBAAmB,CAACnB,GAAG,CAACpB,YAAY,EAAE0B,OAAO,EAAEN,GAAG,CAACtE,IAAI,CAAC;gBAC1D;cACF,CAAC,CAAC;YACJ;UACF,CAAC;QACH;MACF;IACF,CAAC;EACH;EAEA1C,SAAS,CAAC,MAAM;IACd,MAAM0H,KAAiB,GAAG;MACxBC,WAAW;MACXE,IAAI,EAAE,IAAI3F,GAAG,CAAC,CAAC;MACf8F,mBAAmB,EAAE,IAAI9F,GAAG,CAAC,CAAC;MAC9BgG,oBAAoB,EAAE,IAAItB,GAAG,CAAC;IAChC,CAAC;IACD3E,WAAW,CAAC6F,GAAG,CAAClC,YAAY,EAAE8B,KAAK,CAAC;IACpC,MAAM+B,WAAW,GAAGjJ,wBAAwB,CAC1CoF,YAAY,EACZ,CAAC;MAAE0B,OAAO;MAAE9B,aAAa;MAAEyB,QAAQ;MAAER;IAAU,CAAC,KAAK;MACnDwB,2BAA2B,CACzBrC,YAAY,EACZ0B,OAAO,EACP9B,aAAa,EACbyB,QAAQ,EACRR,SACF,CAAC;IACH,CACF,CAAC;IACD,OAAO,MAAM;MACXgD,WAAW,CAAC,CAAC;MACb,IAAIxH,WAAW,CAACsF,GAAG,CAAC3B,YAAY,CAAC,KAAK8B,KAAK,EAAE;QAC3CzF,WAAW,CAACuF,MAAM,CAAC5B,YAAY,CAAC;MAClC;MACA,KAAK,MAAMoB,GAAG,IAAIU,KAAK,CAACG,IAAI,CAAC3E,MAAM,CAAC,CAAC,EAAE6D,SAAS,CAACC,GAAG,EAAE,KAAK,CAAC;MAC5DU,KAAK,CAACG,IAAI,CAAC6B,KAAK,CAAC,CAAC;MAClB,KAAK,MAAM,CAACrC,WAAW,EAAEL,GAAG,CAAC,IAAI7E,UAAU,EAAE;QAC3C,IAAI6E,GAAG,CAACpB,YAAY,KAAKA,YAAY,EAAE;QACvCzD,UAAU,CAACqF,MAAM,CAACH,WAAW,CAAC;QAC9BL,GAAG,CAACS,eAAe,CAAC,CAAC,CAAC;QACtBV,SAAS,CAACC,GAAG,EAAE,KAAK,CAAC;MACvB;IACF,CAAC;EACH,CAAC,EAAE,CAACpB,YAAY,CAAC,CAAC;EAElB,OAAO6C,QAAQ,CAACb,OAAO;AACzB","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ let nextSmoothClipId = Date.now() * 1024;
4
+ export function allocateSmoothClipId() {
5
+ nextSmoothClipId += 1;
6
+ return nextSmoothClipId;
7
+ }
8
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["nextSmoothClipId","Date","now","allocateSmoothClipId"],"sourceRoot":"../../src","sources":["ids.ts"],"mappings":";;AAAA,IAAIA,gBAAgB,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI;AAExC,OAAO,SAASC,oBAAoBA,CAAA,EAAW;EAC7CH,gBAAgB,IAAI,CAAC;EACrB,OAAOA,gBAAgB;AACzB","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  export { SmoothClipView } from './SmoothClipView';
4
- export { useSmoothClipDriver } from './drivers';
5
- export { useSmoothClipGroupDriver } from './groupDrivers';
4
+ export { useSmoothClipController } from './controllers';
5
+ export { useSmoothClipGroup } from './groups';
6
6
  export { getSmoothClipCapabilities } from './capabilities';
7
7
  export { ClipEasings } from "./easings.js";
8
- export { canonicalizeClipGeometry, canonicalizeClipPresentation, createClipPresentation, normalizeClipGeometry, normalizeClipPresentation } from "./geometry.js";
8
+ export { canonicalizeClipGeometry, canonicalizeClipPresentation, createClipPresentation } from "./geometry.js";
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SmoothClipView","useSmoothClipDriver","useSmoothClipGroupDriver","getSmoothClipCapabilities","ClipEasings","canonicalizeClipGeometry","canonicalizeClipPresentation","createClipPresentation","normalizeClipGeometry","normalizeClipPresentation"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,kBAAkB;AAEjD,SAASC,mBAAmB,QAAQ,WAAW;AAC/C,SAASC,wBAAwB,QAAQ,gBAAgB;AACzD,SAASC,yBAAyB,QAAQ,gBAAgB;AA+B1D,SAASC,WAAW,QAAQ,cAAW;AACvC,SACEC,wBAAwB,EACxBC,4BAA4B,EAC5BC,sBAAsB,EACtBC,qBAAqB,EACrBC,yBAAyB,QACpB,eAAY","ignoreList":[]}
1
+ {"version":3,"names":["SmoothClipView","useSmoothClipController","useSmoothClipGroup","getSmoothClipCapabilities","ClipEasings","canonicalizeClipGeometry","canonicalizeClipPresentation","createClipPresentation"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,kBAAkB;AAEjD,SAASC,uBAAuB,QAAQ,eAAe;AACvD,SAASC,kBAAkB,QAAQ,UAAU;AAC7C,SAASC,yBAAyB,QAAQ,gBAAgB;AAwB1D,SAASC,WAAW,QAAQ,cAAW;AACvC,SACEC,wBAAwB,EACxBC,4BAA4B,EAC5BC,sBAAsB,QACjB,eAAY","ignoreList":[]}
@@ -1,21 +1,42 @@
1
1
  "use strict";
2
2
 
3
- import { scheduleOnUI } from 'react-native-worklets';
4
- import { deliverDriverCompletion } from "./driverState.js";
5
- export function completeNativeAnimation(driverId, animationId, finished) {
6
- deliverDriverCompletion(driverId, animationId, finished);
3
+ import NativeSmoothClipModule from './smoothClipNative';
4
+ const driverListeners = new Map();
5
+ const groupListeners = new Map();
6
+ let driverSubscription;
7
+ let groupSubscription;
8
+ function ensureDriverSubscription() {
9
+ driverSubscription ??= NativeSmoothClipModule.onClipAnimationComplete(event => {
10
+ const listeners = driverListeners.get(event.driverId);
11
+ if (!listeners) return;
12
+ for (const listener of listeners) listener(event);
13
+ });
7
14
  }
8
- export function synchronizeNativeCompletion(activeAnimationId, ownership, animationId, _finished) {
9
- // Unfinished completions must also release ownership: native emits
10
- // finished:false when the last participating view unmounts or the system
11
- // strips the animation. Superseded ids are already filtered by the
12
- // active-id comparison below, so no finished-based gate is needed.
13
- scheduleOnUI((active, owner, completedId) => {
14
- 'worklet';
15
-
16
- if (active.value !== completedId) return;
17
- active.value = 0;
18
- owner.value = 0;
19
- }, activeAnimationId, ownership, animationId);
15
+ function ensureGroupSubscription() {
16
+ groupSubscription ??= NativeSmoothClipModule.onClipGroupAnimationComplete(event => {
17
+ const listeners = groupListeners.get(event.controllerId);
18
+ if (!listeners) return;
19
+ for (const listener of listeners) listener(event);
20
+ });
21
+ }
22
+ export function subscribeDriverCompletion(driverId, listener) {
23
+ const listeners = driverListeners.get(driverId) ?? new Set();
24
+ listeners.add(listener);
25
+ driverListeners.set(driverId, listeners);
26
+ ensureDriverSubscription();
27
+ return () => {
28
+ listeners.delete(listener);
29
+ if (listeners.size === 0) driverListeners.delete(driverId);
30
+ };
31
+ }
32
+ export function subscribeGroupCompletion(controllerId, listener) {
33
+ const listeners = groupListeners.get(controllerId) ?? new Set();
34
+ listeners.add(listener);
35
+ groupListeners.set(controllerId, listeners);
36
+ ensureGroupSubscription();
37
+ return () => {
38
+ listeners.delete(listener);
39
+ if (listeners.size === 0) groupListeners.delete(controllerId);
40
+ };
20
41
  }
21
42
  //# sourceMappingURL=nativeCompletion.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["scheduleOnUI","deliverDriverCompletion","completeNativeAnimation","driverId","animationId","finished","synchronizeNativeCompletion","activeAnimationId","ownership","_finished","active","owner","completedId","value"],"sourceRoot":"../../src","sources":["nativeCompletion.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,uBAAuB;AACpD,SAASC,uBAAuB,QAAQ,kBAAe;AAEvD,OAAO,SAASC,uBAAuBA,CACrCC,QAAgB,EAChBC,WAAmB,EACnBC,QAAiB,EACX;EACNJ,uBAAuB,CAACE,QAAQ,EAAEC,WAAW,EAAEC,QAAQ,CAAC;AAC1D;AAEA,OAAO,SAASC,2BAA2BA,CACzCC,iBAAoC,EACpCC,SAA4B,EAC5BJ,WAAmB,EACnBK,SAAkB,EACZ;EACN;EACA;EACA;EACA;EACAT,YAAY,CACV,CACEU,MAAyB,EACzBC,KAAwB,EACxBC,WAAmB,KAChB;IACH,SAAS;;IACT,IAAIF,MAAM,CAACG,KAAK,KAAKD,WAAW,EAAE;IAClCF,MAAM,CAACG,KAAK,GAAG,CAAC;IAChBF,KAAK,CAACE,KAAK,GAAG,CAAC;EACjB,CAAC,EACDN,iBAAiB,EACjBC,SAAS,EACTJ,WACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["NativeSmoothClipModule","driverListeners","Map","groupListeners","driverSubscription","groupSubscription","ensureDriverSubscription","onClipAnimationComplete","event","listeners","get","driverId","listener","ensureGroupSubscription","onClipGroupAnimationComplete","controllerId","subscribeDriverCompletion","Set","add","set","delete","size","subscribeGroupCompletion"],"sourceRoot":"../../src","sources":["nativeCompletion.ts"],"mappings":";;AAAA,OAAOA,sBAAsB,MAAM,oBAAoB;AAiBvD,MAAMC,eAAe,GAAG,IAAIC,GAAG,CAG7B,CAAC;AACH,MAAMC,cAAc,GAAG,IAAID,GAAG,CAAgD,CAAC;AAC/E,IAAIE,kBAAkD;AACtD,IAAIC,iBAAiD;AAErD,SAASC,wBAAwBA,CAAA,EAAS;EACxCF,kBAAkB,KAAKJ,sBAAsB,CAACO,uBAAuB,CAClEC,KAAK,IAAK;IACT,MAAMC,SAAS,GAAGR,eAAe,CAACS,GAAG,CAACF,KAAK,CAACG,QAAQ,CAAC;IACrD,IAAI,CAACF,SAAS,EAAE;IAChB,KAAK,MAAMG,QAAQ,IAAIH,SAAS,EAAEG,QAAQ,CAACJ,KAAK,CAAC;EACnD,CACF,CAAC;AACH;AAEA,SAASK,uBAAuBA,CAAA,EAAS;EACvCR,iBAAiB,KAAKL,sBAAsB,CAACc,4BAA4B,CACtEN,KAAK,IAAK;IACT,MAAMC,SAAS,GAAGN,cAAc,CAACO,GAAG,CAACF,KAAK,CAACO,YAAY,CAAC;IACxD,IAAI,CAACN,SAAS,EAAE;IAChB,KAAK,MAAMG,QAAQ,IAAIH,SAAS,EAAEG,QAAQ,CAACJ,KAAK,CAAC;EACnD,CACF,CAAC;AACH;AAEA,OAAO,SAASQ,yBAAyBA,CACvCL,QAAgB,EAChBC,QAA2C,EAC/B;EACZ,MAAMH,SAAS,GAAGR,eAAe,CAACS,GAAG,CAACC,QAAQ,CAAC,IAAI,IAAIM,GAAG,CAAC,CAAC;EAC5DR,SAAS,CAACS,GAAG,CAACN,QAAQ,CAAC;EACvBX,eAAe,CAACkB,GAAG,CAACR,QAAQ,EAAEF,SAAS,CAAC;EACxCH,wBAAwB,CAAC,CAAC;EAC1B,OAAO,MAAM;IACXG,SAAS,CAACW,MAAM,CAACR,QAAQ,CAAC;IAC1B,IAAIH,SAAS,CAACY,IAAI,KAAK,CAAC,EAAEpB,eAAe,CAACmB,MAAM,CAACT,QAAQ,CAAC;EAC5D,CAAC;AACH;AAEA,OAAO,SAASW,wBAAwBA,CACtCP,YAAoB,EACpBH,QAA0C,EAC9B;EACZ,MAAMH,SAAS,GAAGN,cAAc,CAACO,GAAG,CAACK,YAAY,CAAC,IAAI,IAAIE,GAAG,CAAC,CAAC;EAC/DR,SAAS,CAACS,GAAG,CAACN,QAAQ,CAAC;EACvBT,cAAc,CAACgB,GAAG,CAACJ,YAAY,EAAEN,SAAS,CAAC;EAC3CI,uBAAuB,CAAC,CAAC;EACzB,OAAO,MAAM;IACXJ,SAAS,CAACW,MAAM,CAACR,QAAQ,CAAC;IAC1B,IAAIH,SAAS,CAACY,IAAI,KAAK,CAAC,EAAElB,cAAc,CAACiB,MAAM,CAACL,YAAY,CAAC;EAC/D,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable no-bitwise -- the native packet carries packed RRGGBBAA colors */
4
+
5
+ /**
6
+ * Versionless native packet layout. Keep this as the single JS codec used by
7
+ * drivers, groups, snapshots, and cancellation.
8
+ */
9
+ export const PRESENTATION_STRIDE = 21;
10
+ export function appendPresentationPacket(values, presentation) {
11
+ 'worklet';
12
+
13
+ const {
14
+ clip,
15
+ contentTranslateX,
16
+ contentTranslateY,
17
+ contentScale,
18
+ boxShadow
19
+ } = presentation;
20
+ const color = (boxShadow?.color ?? 0x000000ff) >>> 0;
21
+ values.push(clip.x, clip.y, clip.width, clip.height, clip.topLeftRadius, clip.topRightRadius, clip.bottomRightRadius, clip.bottomLeftRadius, clip.curve === 'continuous' ? 1 : 0, contentTranslateX, contentTranslateY, contentScale, boxShadow === undefined ? 0 : 1, (color >>> 24 & 0xff) / 255, (color >>> 16 & 0xff) / 255, (color >>> 8 & 0xff) / 255, (color & 0xff) / 255, boxShadow?.offsetX ?? 0, boxShadow?.offsetY ?? 0, boxShadow?.blurRadius ?? 0, boxShadow?.spreadDistance ?? 0);
22
+ }
23
+ export function presentationPacket(presentation) {
24
+ 'worklet';
25
+
26
+ const values = [];
27
+ appendPresentationPacket(values, presentation);
28
+ return values;
29
+ }
30
+ export function presentationFromPacket(values, offset = 0) {
31
+ 'worklet';
32
+
33
+ if (values.length < offset + PRESENTATION_STRIDE) return null;
34
+ for (let index = offset; index < offset + PRESENTATION_STRIDE; index += 1) {
35
+ if (!Number.isFinite(values[index])) return null;
36
+ }
37
+ const topLeftRadius = values[offset + 4];
38
+ const topRightRadius = values[offset + 5];
39
+ const bottomRightRadius = values[offset + 6];
40
+ const bottomLeftRadius = values[offset + 7];
41
+ const curveCode = values[offset + 8];
42
+ const contentScale = values[offset + 11];
43
+ const shadowEnabledCode = values[offset + 12];
44
+ const red = values[offset + 13];
45
+ const green = values[offset + 14];
46
+ const blue = values[offset + 15];
47
+ const alpha = values[offset + 16];
48
+ const blurRadius = values[offset + 19];
49
+ if (curveCode !== 0 && curveCode !== 1 || contentScale <= 0 || shadowEnabledCode !== 0 && shadowEnabledCode !== 1 || red < 0 || red > 1 || green < 0 || green > 1 || blue < 0 || blue > 1 || alpha < 0 || alpha > 1 || blurRadius < 0) {
50
+ return null;
51
+ }
52
+ const shadowEnabled = shadowEnabledCode === 1;
53
+ const color = (Math.round(red * 255) << 24 | Math.round(green * 255) << 16 | Math.round(blue * 255) << 8 | Math.round(alpha * 255)) >>> 0;
54
+ return {
55
+ clip: {
56
+ x: values[offset],
57
+ y: values[offset + 1],
58
+ width: values[offset + 2],
59
+ height: values[offset + 3],
60
+ radius: topLeftRadius === topRightRadius && topLeftRadius === bottomRightRadius && topLeftRadius === bottomLeftRadius ? topLeftRadius : 0,
61
+ topLeftRadius,
62
+ topRightRadius,
63
+ bottomRightRadius,
64
+ bottomLeftRadius,
65
+ curve: curveCode === 1 ? 'continuous' : 'circular'
66
+ },
67
+ contentTranslateX: values[offset + 9],
68
+ contentTranslateY: values[offset + 10],
69
+ contentScale,
70
+ ...(shadowEnabled ? {
71
+ boxShadow: {
72
+ color,
73
+ offsetX: values[offset + 17],
74
+ offsetY: values[offset + 18],
75
+ blurRadius,
76
+ spreadDistance: values[offset + 20]
77
+ }
78
+ } : {})
79
+ };
80
+ }
81
+ //# sourceMappingURL=presentationCodec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PRESENTATION_STRIDE","appendPresentationPacket","values","presentation","clip","contentTranslateX","contentTranslateY","contentScale","boxShadow","color","push","x","y","width","height","topLeftRadius","topRightRadius","bottomRightRadius","bottomLeftRadius","curve","undefined","offsetX","offsetY","blurRadius","spreadDistance","presentationPacket","presentationFromPacket","offset","length","index","Number","isFinite","curveCode","shadowEnabledCode","red","green","blue","alpha","shadowEnabled","Math","round","radius"],"sourceRoot":"../../src","sources":["presentationCodec.ts"],"mappings":"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","ignoreList":[]}