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
package/src/index.ts CHANGED
@@ -1,51 +1,43 @@
1
1
  export { SmoothClipView } from './SmoothClipView';
2
2
  export type { SmoothClipViewProps } from './SmoothClipView';
3
- export { useSmoothClipDriver } from './drivers';
4
- export { useSmoothClipGroupDriver } from './groupDrivers';
3
+ export { useSmoothClipController } from './controllers';
4
+ export { useSmoothClipGroup } from './groups';
5
5
  export { getSmoothClipCapabilities } from './capabilities';
6
6
  export type { SmoothClipCapabilities } from './capabilityTypes';
7
7
  export type {
8
- ClipAnimationResult,
9
8
  ClipReduceMotion,
10
- KeyframedClipAnimation,
11
- SmoothClipDriver,
12
- SmoothClipDriverOptions,
13
- SmoothClipReactControls,
14
- SmoothClipUIControls,
15
- SmoothClipAnimation,
16
9
  SpringClipAnimation,
17
10
  TimingClipAnimation,
18
- } from './driverTypes';
11
+ SmoothClipAnimation,
12
+ SmoothClipCompletion,
13
+ SmoothClipController,
14
+ SmoothClipControllerOptions,
15
+ SmoothClipControllerReact,
16
+ SmoothClipControllerUI,
17
+ SmoothClipInitialFrame,
18
+ SmoothClipReactRun,
19
+ SmoothClipRef,
20
+ SmoothClipRunHandle,
21
+ } from './controllerTypes';
19
22
  export type {
20
- SmoothClipBatchEntry,
21
- SmoothClipGroupAnimationResult,
22
- SmoothClipGroupCancelBehavior,
23
- SmoothClipGroupDriver,
24
- SmoothClipGroupDriverOptions,
25
- SmoothClipGroupKeyframeAnimation,
26
- SmoothClipGroupKeyframeEntry,
27
- SmoothClipGroupMotionAnimation,
28
- SmoothClipGroupMotionEntry,
29
- SmoothClipGroupReactControls,
23
+ SmoothClipGroup,
24
+ SmoothClipGroupFrame,
25
+ SmoothClipGroupOptions,
30
26
  SmoothClipGroupSnapshot,
31
- SmoothClipGroupSpringAnimation,
32
- SmoothClipGroupSuspensionPolicy,
33
- SmoothClipGroupTimingAnimation,
34
- SmoothClipGroupUIControls,
35
- } from './groupDriverTypes';
27
+ SmoothClipGroupTarget,
28
+ } from './groupTypes';
36
29
  export { ClipEasings } from './easings';
37
30
  export {
38
31
  canonicalizeClipGeometry,
39
32
  canonicalizeClipPresentation,
40
33
  createClipPresentation,
41
- normalizeClipGeometry,
42
- normalizeClipPresentation,
43
34
  } from './geometry';
44
35
  export type {
45
36
  CanonicalClipGeometry,
37
+ CanonicalClipBoxShadow,
46
38
  CanonicalSmoothClipPresentation,
47
- ClipBounds,
48
39
  ClipCurve,
49
40
  ClipGeometry,
41
+ ClipBoxShadow,
50
42
  SmoothClipPresentation,
51
43
  } from './geometry';
@@ -1,37 +1,72 @@
1
- import { scheduleOnUI } from 'react-native-worklets';
2
- import { deliverDriverCompletion } from './driverState';
1
+ import NativeSmoothClipModule from './smoothClipNative';
3
2
 
4
- export function completeNativeAnimation(
5
- driverId: number,
6
- animationId: number,
7
- finished: boolean
8
- ): void {
9
- deliverDriverCompletion(driverId, animationId, finished);
3
+ type DriverCompletion = Readonly<{
4
+ driverId: number;
5
+ animationId: number;
6
+ completionTag: number;
7
+ finished: boolean;
8
+ }>;
9
+
10
+ type GroupCompletion = Readonly<{
11
+ controllerId: number;
12
+ groupId: number;
13
+ completionTag: number;
14
+ finished: boolean;
15
+ snapshots: readonly number[];
16
+ }>;
17
+
18
+ const driverListeners = new Map<
19
+ number,
20
+ Set<(event: DriverCompletion) => void>
21
+ >();
22
+ const groupListeners = new Map<number, Set<(event: GroupCompletion) => void>>();
23
+ let driverSubscription: { remove(): void } | undefined;
24
+ let groupSubscription: { remove(): void } | undefined;
25
+
26
+ function ensureDriverSubscription(): void {
27
+ driverSubscription ??= NativeSmoothClipModule.onClipAnimationComplete(
28
+ (event) => {
29
+ const listeners = driverListeners.get(event.driverId);
30
+ if (!listeners) return;
31
+ for (const listener of listeners) listener(event);
32
+ }
33
+ );
10
34
  }
11
35
 
12
- export function synchronizeNativeCompletion(
13
- activeAnimationId: { value: number },
14
- ownership: { value: number },
15
- animationId: number,
16
- _finished: boolean
17
- ): void {
18
- // Unfinished completions must also release ownership: native emits
19
- // finished:false when the last participating view unmounts or the system
20
- // strips the animation. Superseded ids are already filtered by the
21
- // active-id comparison below, so no finished-based gate is needed.
22
- scheduleOnUI(
23
- (
24
- active: { value: number },
25
- owner: { value: number },
26
- completedId: number
27
- ) => {
28
- 'worklet';
29
- if (active.value !== completedId) return;
30
- active.value = 0;
31
- owner.value = 0;
32
- },
33
- activeAnimationId,
34
- ownership,
35
- animationId
36
+ function ensureGroupSubscription(): void {
37
+ groupSubscription ??= NativeSmoothClipModule.onClipGroupAnimationComplete(
38
+ (event) => {
39
+ const listeners = groupListeners.get(event.controllerId);
40
+ if (!listeners) return;
41
+ for (const listener of listeners) listener(event);
42
+ }
36
43
  );
37
44
  }
45
+
46
+ export function subscribeDriverCompletion(
47
+ driverId: number,
48
+ listener: (event: DriverCompletion) => void
49
+ ): () => void {
50
+ const listeners = driverListeners.get(driverId) ?? new Set();
51
+ listeners.add(listener);
52
+ driverListeners.set(driverId, listeners);
53
+ ensureDriverSubscription();
54
+ return () => {
55
+ listeners.delete(listener);
56
+ if (listeners.size === 0) driverListeners.delete(driverId);
57
+ };
58
+ }
59
+
60
+ export function subscribeGroupCompletion(
61
+ controllerId: number,
62
+ listener: (event: GroupCompletion) => void
63
+ ): () => void {
64
+ const listeners = groupListeners.get(controllerId) ?? new Set();
65
+ listeners.add(listener);
66
+ groupListeners.set(controllerId, listeners);
67
+ ensureGroupSubscription();
68
+ return () => {
69
+ listeners.delete(listener);
70
+ if (listeners.size === 0) groupListeners.delete(controllerId);
71
+ };
72
+ }
@@ -0,0 +1,134 @@
1
+ /* eslint-disable no-bitwise -- the native packet carries packed RRGGBBAA colors */
2
+ import type { CanonicalSmoothClipPresentation } from './geometry';
3
+
4
+ /**
5
+ * Versionless native packet layout. Keep this as the single JS codec used by
6
+ * drivers, groups, snapshots, and cancellation.
7
+ */
8
+ export const PRESENTATION_STRIDE = 21;
9
+
10
+ export function appendPresentationPacket(
11
+ values: number[],
12
+ presentation: CanonicalSmoothClipPresentation
13
+ ): void {
14
+ 'worklet';
15
+ const {
16
+ clip,
17
+ contentTranslateX,
18
+ contentTranslateY,
19
+ contentScale,
20
+ boxShadow,
21
+ } = presentation;
22
+ const color = ((boxShadow?.color as unknown as number) ?? 0x000000ff) >>> 0;
23
+ values.push(
24
+ clip.x,
25
+ clip.y,
26
+ clip.width,
27
+ clip.height,
28
+ clip.topLeftRadius,
29
+ clip.topRightRadius,
30
+ clip.bottomRightRadius,
31
+ clip.bottomLeftRadius,
32
+ clip.curve === 'continuous' ? 1 : 0,
33
+ contentTranslateX,
34
+ contentTranslateY,
35
+ contentScale,
36
+ boxShadow === undefined ? 0 : 1,
37
+ ((color >>> 24) & 0xff) / 255,
38
+ ((color >>> 16) & 0xff) / 255,
39
+ ((color >>> 8) & 0xff) / 255,
40
+ (color & 0xff) / 255,
41
+ boxShadow?.offsetX ?? 0,
42
+ boxShadow?.offsetY ?? 0,
43
+ boxShadow?.blurRadius ?? 0,
44
+ boxShadow?.spreadDistance ?? 0
45
+ );
46
+ }
47
+
48
+ export function presentationPacket(
49
+ presentation: CanonicalSmoothClipPresentation
50
+ ): number[] {
51
+ 'worklet';
52
+ const values: number[] = [];
53
+ appendPresentationPacket(values, presentation);
54
+ return values;
55
+ }
56
+
57
+ export function presentationFromPacket(
58
+ values: readonly number[],
59
+ offset = 0
60
+ ): CanonicalSmoothClipPresentation | null {
61
+ 'worklet';
62
+ if (values.length < offset + PRESENTATION_STRIDE) return null;
63
+ for (let index = offset; index < offset + PRESENTATION_STRIDE; index += 1) {
64
+ if (!Number.isFinite(values[index])) return null;
65
+ }
66
+ const topLeftRadius = values[offset + 4] as number;
67
+ const topRightRadius = values[offset + 5] as number;
68
+ const bottomRightRadius = values[offset + 6] as number;
69
+ const bottomLeftRadius = values[offset + 7] as number;
70
+ const curveCode = values[offset + 8] as number;
71
+ const contentScale = values[offset + 11] as number;
72
+ const shadowEnabledCode = values[offset + 12] as number;
73
+ const red = values[offset + 13] as number;
74
+ const green = values[offset + 14] as number;
75
+ const blue = values[offset + 15] as number;
76
+ const alpha = values[offset + 16] as number;
77
+ const blurRadius = values[offset + 19] as number;
78
+ if (
79
+ (curveCode !== 0 && curveCode !== 1) ||
80
+ contentScale <= 0 ||
81
+ (shadowEnabledCode !== 0 && shadowEnabledCode !== 1) ||
82
+ red < 0 ||
83
+ red > 1 ||
84
+ green < 0 ||
85
+ green > 1 ||
86
+ blue < 0 ||
87
+ blue > 1 ||
88
+ alpha < 0 ||
89
+ alpha > 1 ||
90
+ blurRadius < 0
91
+ ) {
92
+ return null;
93
+ }
94
+ const shadowEnabled = shadowEnabledCode === 1;
95
+ const color =
96
+ ((Math.round(red * 255) << 24) |
97
+ (Math.round(green * 255) << 16) |
98
+ (Math.round(blue * 255) << 8) |
99
+ Math.round(alpha * 255)) >>>
100
+ 0;
101
+ return {
102
+ clip: {
103
+ x: values[offset] as number,
104
+ y: values[offset + 1] as number,
105
+ width: values[offset + 2] as number,
106
+ height: values[offset + 3] as number,
107
+ radius:
108
+ topLeftRadius === topRightRadius &&
109
+ topLeftRadius === bottomRightRadius &&
110
+ topLeftRadius === bottomLeftRadius
111
+ ? topLeftRadius
112
+ : 0,
113
+ topLeftRadius,
114
+ topRightRadius,
115
+ bottomRightRadius,
116
+ bottomLeftRadius,
117
+ curve: curveCode === 1 ? 'continuous' : 'circular',
118
+ },
119
+ contentTranslateX: values[offset + 9] as number,
120
+ contentTranslateY: values[offset + 10] as number,
121
+ contentScale,
122
+ ...(shadowEnabled
123
+ ? {
124
+ boxShadow: {
125
+ color,
126
+ offsetX: values[offset + 17] as number,
127
+ offsetY: values[offset + 18] as number,
128
+ blurRadius,
129
+ spreadDistance: values[offset + 20] as number,
130
+ },
131
+ }
132
+ : {}),
133
+ };
134
+ }
@@ -1,82 +0,0 @@
1
- "use strict";
2
-
3
- const states = new WeakMap();
4
- const statesById = new Map();
5
- let nextDriverId = Date.now() * 1024;
6
- export function allocateDriverId() {
7
- nextDriverId += 1;
8
- if (!Number.isSafeInteger(nextDriverId)) nextDriverId = 1;
9
- return nextDriverId;
10
- }
11
- export function setDriverState(driver, state) {
12
- // WeakMap-only: safe to call from render (discarded renders leave nothing
13
- // reachable) and survives effect replays so getDriverState keeps working.
14
- states.set(driver, state);
15
- }
16
-
17
- // The strong by-id index is attached in the driver hook's effect and detached
18
- // in its cleanup, so discarded renders never leak entries and StrictMode /
19
- // <Activity> effect replays can re-attach the same state.
20
- export function attachDriverState(state) {
21
- statesById.set(state.driverId, state);
22
- }
23
- export function detachDriverState(state) {
24
- if (statesById.get(state.driverId) === state) {
25
- statesById.delete(state.driverId);
26
- }
27
- // Requests pending at teardown were settled by rejectDriverRequests, but
28
- // their completion deferrals can no longer be released: the late-scheduled
29
- // resolver's releaseDriverCompletions no-ops against a detached state. An
30
- // effect replay reattaches THIS same object, so a stale positive count
31
- // would queue every future completion forever. The deferrals died with
32
- // their requests — reset them.
33
- state.completionDeferrals = 0;
34
- state.deferredCompletions.length = 0;
35
- }
36
- export function createDriverState(driverId, initialPresentation, source, onAnimationComplete, activeAnimationId, ownership) {
37
- return {
38
- driverId,
39
- initialPresentation,
40
- source,
41
- activeAnimationId,
42
- ownership,
43
- onAnimationComplete,
44
- completionDeferrals: 0,
45
- deferredCompletions: []
46
- };
47
- }
48
- export function deliverDriverCompletion(driverId, animationId, finished) {
49
- const state = statesById.get(driverId);
50
- if (!state) return;
51
- const result = {
52
- animationId,
53
- finished
54
- };
55
- if (state.completionDeferrals > 0) {
56
- state.deferredCompletions.push(result);
57
- return;
58
- }
59
- state.onAnimationComplete.current?.(result);
60
- }
61
- export function deferDriverCompletions(driverId) {
62
- const state = statesById.get(driverId);
63
- if (state) state.completionDeferrals += 1;
64
- }
65
- export function releaseDriverCompletions(driverId) {
66
- const state = statesById.get(driverId);
67
- if (!state || state.completionDeferrals === 0) return;
68
- state.completionDeferrals -= 1;
69
- if (state.completionDeferrals !== 0) return;
70
- const deferred = state.deferredCompletions.splice(0);
71
- for (const result of deferred) {
72
- state.onAnimationComplete.current?.(result);
73
- }
74
- }
75
- export function getDriverState(driver) {
76
- const state = states.get(driver);
77
- if (!state) {
78
- throw new Error('[SmoothClipView] Drivers must be created by useSmoothClipDriver.');
79
- }
80
- return state;
81
- }
82
- //# sourceMappingURL=driverState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["states","WeakMap","statesById","Map","nextDriverId","Date","now","allocateDriverId","Number","isSafeInteger","setDriverState","driver","state","set","attachDriverState","driverId","detachDriverState","get","delete","completionDeferrals","deferredCompletions","length","createDriverState","initialPresentation","source","onAnimationComplete","activeAnimationId","ownership","deliverDriverCompletion","animationId","finished","result","push","current","deferDriverCompletions","releaseDriverCompletions","deferred","splice","getDriverState","Error"],"sourceRoot":"../../src","sources":["driverState.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export {};
4
- //# sourceMappingURL=driverTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../src","sources":["driverTypes.ts"],"mappings":"","ignoreList":[]}
@@ -1,6 +0,0 @@
1
- "use strict";
2
-
3
- // Platform re-export only — the implementation is shared with iOS.
4
- // Edit drivers.native.ts, not this file.
5
- export { useSmoothClipDriver } from "./drivers.native.js";
6
- //# sourceMappingURL=drivers.android.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useSmoothClipDriver"],"sourceRoot":"../../src","sources":["drivers.android.ts"],"mappings":";;AAAA;AACA;AACA,SAASA,mBAAmB,QAAQ,qBAAkB","ignoreList":[]}
@@ -1,6 +0,0 @@
1
- "use strict";
2
-
3
- // Platform re-export only — the implementation is shared with Android.
4
- // Edit drivers.native.ts, not this file.
5
- export { useSmoothClipDriver } from "./drivers.native.js";
6
- //# sourceMappingURL=drivers.ios.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useSmoothClipDriver"],"sourceRoot":"../../src","sources":["drivers.ios.ts"],"mappings":";;AAAA;AACA;AACA,SAASA,mBAAmB,QAAQ,qBAAkB","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export { useSmoothClipDriver } from "./drivers.native.js";
4
- //# sourceMappingURL=drivers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useSmoothClipDriver"],"sourceRoot":"../../src","sources":["drivers.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,qBAAkB","ignoreList":[]}