react-native-divkit 1.6.5 → 1.8.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 (97) hide show
  1. package/README.md +18 -15
  2. package/dist/DivKit.d.ts.map +1 -1
  3. package/dist/DivKit.js +115 -4
  4. package/dist/DivKit.js.map +1 -1
  5. package/dist/components/DivComponent.d.ts.map +1 -1
  6. package/dist/components/DivComponent.js +6 -2
  7. package/dist/components/DivComponent.js.map +1 -1
  8. package/dist/components/index.d.ts +4 -0
  9. package/dist/components/index.d.ts.map +1 -1
  10. package/dist/components/index.js +2 -0
  11. package/dist/components/index.js.map +1 -1
  12. package/dist/components/indicator/DivIndicator.d.ts +19 -0
  13. package/dist/components/indicator/DivIndicator.d.ts.map +1 -0
  14. package/dist/components/indicator/DivIndicator.js +112 -0
  15. package/dist/components/indicator/DivIndicator.js.map +1 -0
  16. package/dist/components/indicator/index.d.ts +3 -0
  17. package/dist/components/indicator/index.d.ts.map +1 -0
  18. package/dist/components/indicator/index.js +2 -0
  19. package/dist/components/indicator/index.js.map +1 -0
  20. package/dist/components/indicator/utils.d.ts +61 -0
  21. package/dist/components/indicator/utils.d.ts.map +1 -0
  22. package/dist/components/indicator/utils.js +104 -0
  23. package/dist/components/indicator/utils.js.map +1 -0
  24. package/dist/components/pager/DivPager.d.ts +22 -0
  25. package/dist/components/pager/DivPager.d.ts.map +1 -0
  26. package/dist/components/pager/DivPager.js +269 -0
  27. package/dist/components/pager/DivPager.js.map +1 -0
  28. package/dist/components/pager/index.d.ts +3 -0
  29. package/dist/components/pager/index.d.ts.map +1 -0
  30. package/dist/components/pager/index.js +2 -0
  31. package/dist/components/pager/index.js.map +1 -0
  32. package/dist/components/pager/utils.d.ts +96 -0
  33. package/dist/components/pager/utils.d.ts.map +1 -0
  34. package/dist/components/pager/utils.js +142 -0
  35. package/dist/components/pager/utils.js.map +1 -0
  36. package/dist/components/state/DivState.d.ts +11 -12
  37. package/dist/components/state/DivState.d.ts.map +1 -1
  38. package/dist/components/state/DivState.js +263 -35
  39. package/dist/components/state/DivState.js.map +1 -1
  40. package/dist/components/utilities/Background.d.ts.map +1 -1
  41. package/dist/components/utilities/Background.js +4 -3
  42. package/dist/components/utilities/Background.js.map +1 -1
  43. package/dist/components/utilities/Outer.d.ts.map +1 -1
  44. package/dist/components/utilities/Outer.js +175 -78
  45. package/dist/components/utilities/Outer.js.map +1 -1
  46. package/dist/context/DivStateScopeContext.d.ts +18 -0
  47. package/dist/context/DivStateScopeContext.d.ts.map +1 -0
  48. package/dist/context/DivStateScopeContext.js +7 -0
  49. package/dist/context/DivStateScopeContext.js.map +1 -0
  50. package/dist/context/PagerContext.d.ts +30 -0
  51. package/dist/context/PagerContext.d.ts.map +1 -0
  52. package/dist/context/PagerContext.js +76 -0
  53. package/dist/context/PagerContext.js.map +1 -0
  54. package/dist/context/index.d.ts +1 -0
  55. package/dist/context/index.d.ts.map +1 -1
  56. package/dist/context/index.js +1 -0
  57. package/dist/context/index.js.map +1 -1
  58. package/dist/hooks/useAppearanceTransition.d.ts +86 -0
  59. package/dist/hooks/useAppearanceTransition.d.ts.map +1 -0
  60. package/dist/hooks/useAppearanceTransition.js +490 -0
  61. package/dist/hooks/useAppearanceTransition.js.map +1 -0
  62. package/dist/hooks/useChangeBoundsTransition.d.ts +46 -0
  63. package/dist/hooks/useChangeBoundsTransition.d.ts.map +1 -0
  64. package/dist/hooks/useChangeBoundsTransition.js +151 -0
  65. package/dist/hooks/useChangeBoundsTransition.js.map +1 -0
  66. package/dist/utils/configureChangeBoundsLayout.d.ts +11 -0
  67. package/dist/utils/configureChangeBoundsLayout.d.ts.map +1 -0
  68. package/dist/utils/configureChangeBoundsLayout.js +65 -0
  69. package/dist/utils/configureChangeBoundsLayout.js.map +1 -0
  70. package/dist/utils/flattenTransition.d.ts +5 -0
  71. package/dist/utils/flattenTransition.d.ts.map +1 -0
  72. package/dist/utils/flattenTransition.js +27 -0
  73. package/dist/utils/flattenTransition.js.map +1 -0
  74. package/package.json +3 -1
  75. package/src/DivKit.tsx +131 -5
  76. package/src/components/DivComponent.tsx +8 -2
  77. package/src/components/README.md +59 -5
  78. package/src/components/index.ts +4 -0
  79. package/src/components/indicator/DivIndicator.tsx +175 -0
  80. package/src/components/indicator/index.ts +2 -0
  81. package/src/components/indicator/utils.ts +149 -0
  82. package/src/components/pager/DivPager.tsx +393 -0
  83. package/src/components/pager/index.ts +2 -0
  84. package/src/components/pager/utils.ts +214 -0
  85. package/src/components/state/DivState.tsx +308 -39
  86. package/src/components/utilities/Background.tsx +4 -3
  87. package/src/components/utilities/Outer.tsx +192 -75
  88. package/src/context/DivStateScopeContext.tsx +23 -0
  89. package/src/context/PagerContext.tsx +108 -0
  90. package/src/context/index.ts +8 -0
  91. package/src/hooks/useAppearanceTransition.ts +621 -0
  92. package/src/hooks/useChangeBoundsTransition.ts +193 -0
  93. package/src/types/indicator.d.ts +32 -0
  94. package/src/types/pager.d.ts +36 -0
  95. package/src/types/shape.d.ts +26 -0
  96. package/src/utils/configureChangeBoundsLayout.ts +74 -0
  97. package/src/utils/flattenTransition.ts +36 -0
@@ -0,0 +1,86 @@
1
+ import { Animated } from 'react-native';
2
+ import type { MaybeMissing } from '../expressions/json';
3
+ import type { AppearanceTransition, Visibility } from '../types/base';
4
+ export interface AppearanceTransitionOptions {
5
+ visibility: Visibility;
6
+ transitionIn?: MaybeMissing<AppearanceTransition>;
7
+ transitionOut?: MaybeMissing<AppearanceTransition>;
8
+ /**
9
+ * When false, transitions are skipped (used during initial mount when visibility starts as 'visible'
10
+ * and you don't want a flicker). Default: true.
11
+ */
12
+ enabled?: boolean;
13
+ /**
14
+ * 'visibility' (default) — transitions are driven by the visibility prop changing.
15
+ * 'imperative' — visibility changes do not auto-play; the consumer must call playOut/playIn.
16
+ * 'auto-in' — like 'imperative' but transition_in is played automatically on first mount.
17
+ */
18
+ mode?: 'visibility' | 'imperative' | 'auto-in';
19
+ /**
20
+ * Called once right before the wrapper collapses layout (target visibility 'gone'
21
+ * and out animation just finished). Use to queue LayoutAnimation for parents.
22
+ */
23
+ onBeforeCollapse?: () => void;
24
+ /**
25
+ * Called once right before the wrapper mounts after being collapsed
26
+ * (visibility goes back to 'visible'). Use to queue LayoutAnimation for parents.
27
+ */
28
+ onBeforeExpand?: () => void;
29
+ /**
30
+ * Measured width of the element (from onLayout). Used to emulate off-center pivot for scale
31
+ * via translate-scale-translate. If absent, scale is applied from the view center (pivot 0.5/0.5).
32
+ */
33
+ layoutWidth?: number;
34
+ /** Measured height of the element. */
35
+ layoutHeight?: number;
36
+ }
37
+ type AnyTransformValue = number | Animated.AnimatedInterpolation<number> | Animated.Value;
38
+ export interface AppearanceTransitionResult {
39
+ /**
40
+ * True while the children should be present in the tree.
41
+ * Goes false only AFTER transition_out completed and target visibility is 'gone'/'invisible'.
42
+ */
43
+ rendered: boolean;
44
+ /** True after transition_out completed; the wrapper should collapse layout (return null). */
45
+ collapsed: boolean;
46
+ /** Animated opacity value (or constant). */
47
+ opacity: Animated.Value | number;
48
+ /**
49
+ * Ready-to-use transform array for Animated.View. Combines slide translate, scale, and
50
+ * pivot translate-scale-translate compensation. Empty array if no transition produces transforms.
51
+ */
52
+ transform: Array<{
53
+ translateX?: AnyTransformValue;
54
+ translateY?: AnyTransformValue;
55
+ scale?: AnyTransformValue;
56
+ }>;
57
+ /**
58
+ * Imperatively play transition_out (without affecting rendered/collapsed state).
59
+ * Resolves when animation finishes (or immediately if no transition_out is specified).
60
+ */
61
+ playOut: () => Promise<void>;
62
+ /**
63
+ * Imperatively reset values to transition_in start, then animate to identity.
64
+ * Resolves when animation finishes (or immediately if no transition_in is specified).
65
+ */
66
+ playIn: () => Promise<void>;
67
+ /** Whether transition_out is specified (helps consumers decide whether to wait for playOut). */
68
+ hasTransitionOut: boolean;
69
+ /** Whether transition_in is specified. */
70
+ hasTransitionIn: boolean;
71
+ }
72
+ /**
73
+ * Hook that drives transition_in / transition_out for an Outer wrapper.
74
+ *
75
+ * - On first mount: NO transition_in is played (matches Web Outer.svelte behavior with
76
+ * isVisibilityInited). Use mode='auto-in' if you do want a first-mount play (DivState
77
+ * uses this for newly-mounted children of a switched state).
78
+ * - On change visible→gone/invisible with a transition_out: animates identity → end values,
79
+ * then collapses.
80
+ * - On change gone/invisible→visible: re-mounts and plays transition_in.
81
+ *
82
+ * Only fade/scale/slide are supported here (AppearanceTransition).
83
+ */
84
+ export declare function useAppearanceTransition(opts: AppearanceTransitionOptions): AppearanceTransitionResult;
85
+ export {};
86
+ //# sourceMappingURL=useAppearanceTransition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppearanceTransition.d.ts","sourceRoot":"","sources":["../../src/hooks/useAppearanceTransition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAsC,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAER,oBAAoB,EAIpB,UAAU,EACb,MAAM,eAAe,CAAC;AA2HvB,MAAM,WAAW,2BAA2B;IACxC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IACnD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;IAC/C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAE1F,MAAM,WAAW,0BAA0B;IACvC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,OAAO,EAAE,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;IACjC;;;OAGG;IACH,SAAS,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAChH;;;OAGG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B;;;OAGG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gGAAgG;IAChG,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACnC,IAAI,EAAE,2BAA2B,GAClC,0BAA0B,CAsZ5B"}
@@ -0,0 +1,490 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { Animated, Dimensions, Easing } from 'react-native';
3
+ import { flattenAppearanceTransition } from '../utils/flattenTransition';
4
+ function interpolationToEasing(interpolator) {
5
+ switch (interpolator) {
6
+ case 'linear': return Easing.linear;
7
+ case 'ease': return Easing.ease;
8
+ case 'ease_in': return Easing.in(Easing.ease);
9
+ case 'ease_out': return Easing.out(Easing.ease);
10
+ case 'ease_in_out': return Easing.inOut(Easing.ease);
11
+ case 'spring': return Easing.inOut(Easing.ease);
12
+ default: return Easing.inOut(Easing.ease);
13
+ }
14
+ }
15
+ function normalize(transition) {
16
+ const res = {
17
+ hasFade: false,
18
+ hasScale: false,
19
+ hasSlide: false,
20
+ fadeAlpha: 0,
21
+ scaleValue: 0,
22
+ scalePivotX: 0.5,
23
+ scalePivotY: 0.5,
24
+ slideEdge: 'bottom',
25
+ slideDistance: null,
26
+ fadeDuration: 0,
27
+ fadeDelay: 0,
28
+ fadeEasing: Easing.inOut(Easing.ease),
29
+ scaleDuration: 0,
30
+ scaleDelay: 0,
31
+ scaleEasing: Easing.inOut(Easing.ease),
32
+ slideDuration: 0,
33
+ slideDelay: 0,
34
+ slideEasing: Easing.inOut(Easing.ease),
35
+ totalDuration: 0
36
+ };
37
+ if (!transition)
38
+ return res;
39
+ const items = flattenAppearanceTransition(transition);
40
+ for (const itAny of items) {
41
+ const it = itAny;
42
+ const duration = Math.max(0, it.duration ?? 300);
43
+ const delay = Math.max(0, it.start_delay ?? 0);
44
+ const easing = interpolationToEasing(it.interpolator);
45
+ res.totalDuration = Math.max(res.totalDuration, duration + delay);
46
+ if (it.type === 'fade') {
47
+ res.hasFade = true;
48
+ const fade = it;
49
+ res.fadeAlpha = typeof fade.alpha === 'number' ? fade.alpha : 0;
50
+ res.fadeDuration = duration;
51
+ res.fadeDelay = delay;
52
+ res.fadeEasing = easing;
53
+ }
54
+ else if (it.type === 'scale') {
55
+ res.hasScale = true;
56
+ const sc = it;
57
+ res.scaleValue = typeof sc.scale === 'number' ? sc.scale : 0;
58
+ res.scalePivotX = typeof sc.pivot_x === 'number' ? sc.pivot_x : 0.5;
59
+ res.scalePivotY = typeof sc.pivot_y === 'number' ? sc.pivot_y : 0.5;
60
+ res.scaleDuration = duration;
61
+ res.scaleDelay = delay;
62
+ res.scaleEasing = easing;
63
+ }
64
+ else if (it.type === 'slide') {
65
+ res.hasSlide = true;
66
+ const sl = it;
67
+ res.slideEdge = (sl.edge ?? 'bottom');
68
+ const dim = sl.distance;
69
+ const distVal = dim && typeof dim.value === 'number' ? dim.value : null;
70
+ res.slideDistance = distVal;
71
+ res.slideDuration = duration;
72
+ res.slideDelay = delay;
73
+ res.slideEasing = easing;
74
+ }
75
+ }
76
+ return res;
77
+ }
78
+ function slideOffsetFor(edge, distance) {
79
+ const win = Dimensions.get('window');
80
+ const dx = distance ?? win.width;
81
+ const dy = distance ?? win.height;
82
+ switch (edge) {
83
+ case 'left': return { tx: -dx, ty: 0 };
84
+ case 'right': return { tx: dx, ty: 0 };
85
+ case 'top': return { tx: 0, ty: -dy };
86
+ case 'bottom':
87
+ default: return { tx: 0, ty: dy };
88
+ }
89
+ }
90
+ /**
91
+ * Hook that drives transition_in / transition_out for an Outer wrapper.
92
+ *
93
+ * - On first mount: NO transition_in is played (matches Web Outer.svelte behavior with
94
+ * isVisibilityInited). Use mode='auto-in' if you do want a first-mount play (DivState
95
+ * uses this for newly-mounted children of a switched state).
96
+ * - On change visible→gone/invisible with a transition_out: animates identity → end values,
97
+ * then collapses.
98
+ * - On change gone/invisible→visible: re-mounts and plays transition_in.
99
+ *
100
+ * Only fade/scale/slide are supported here (AppearanceTransition).
101
+ */
102
+ export function useAppearanceTransition(opts) {
103
+ const { visibility, transitionIn, transitionOut, enabled = true, mode = 'visibility', onBeforeCollapse, onBeforeExpand, layoutWidth, layoutHeight } = opts;
104
+ const onBeforeCollapseRef = useRef(onBeforeCollapse);
105
+ const onBeforeExpandRef = useRef(onBeforeExpand);
106
+ onBeforeCollapseRef.current = onBeforeCollapse;
107
+ onBeforeExpandRef.current = onBeforeExpand;
108
+ const inSpec = useMemo(() => normalize(transitionIn), [transitionIn]);
109
+ const outSpec = useMemo(() => normalize(transitionOut), [transitionOut]);
110
+ // Refs to Animated values — created once
111
+ const opacity = useRef(new Animated.Value(visibility === 'visible' ? 1 : 0)).current;
112
+ const scale = useRef(new Animated.Value(1)).current;
113
+ const slideTx = useRef(new Animated.Value(0)).current;
114
+ const slideTy = useRef(new Animated.Value(0)).current;
115
+ const prevVisibilityRef = useRef(visibility);
116
+ const isFirstRunRef = useRef(true);
117
+ const inFlightRef = useRef(null);
118
+ const [rendered, setRendered] = useState(visibility !== 'gone');
119
+ const [collapsed, setCollapsed] = useState(visibility === 'gone');
120
+ // Active scale spec for transform composition (pivot + endpoint).
121
+ // Updated when we start an "in" or "out" scale animation; used to build interpolated transform.
122
+ const [activeScale, setActiveScale] = useState(() => {
123
+ if (visibility === 'visible' && (inSpec.hasScale)) {
124
+ return { value: inSpec.scaleValue, pivotX: inSpec.scalePivotX, pivotY: inSpec.scalePivotY };
125
+ }
126
+ return null;
127
+ });
128
+ useEffect(() => {
129
+ const prev = prevVisibilityRef.current;
130
+ prevVisibilityRef.current = visibility;
131
+ // Imperative mode: visibility prop is ignored for transitions — consumer drives via playOut/playIn.
132
+ // Only sync rendered/collapsed for static defaults; never auto-play.
133
+ if (mode === 'imperative') {
134
+ if (isFirstRunRef.current) {
135
+ isFirstRunRef.current = false;
136
+ if (visibility === 'visible') {
137
+ opacity.setValue(1);
138
+ scale.setValue(1);
139
+ slideTx.setValue(0);
140
+ slideTy.setValue(0);
141
+ }
142
+ }
143
+ return;
144
+ }
145
+ // auto-in mode: play transition_in on first mount, then ignore visibility changes
146
+ // (the consumer — e.g. DivState — drives transition_out programmatically).
147
+ if (mode === 'auto-in' && !isFirstRunRef.current) {
148
+ return;
149
+ }
150
+ if (isFirstRunRef.current) {
151
+ isFirstRunRef.current = false;
152
+ // Matches Web Outer.svelte: на первом монтаже не играем transition_in —
153
+ // он запускается только при последующем изменении visibility (см. isVisibilityInited).
154
+ if (visibility === 'visible') {
155
+ opacity.setValue(1);
156
+ scale.setValue(1);
157
+ slideTx.setValue(0);
158
+ slideTy.setValue(0);
159
+ }
160
+ else {
161
+ opacity.setValue(0);
162
+ }
163
+ return;
164
+ }
165
+ // visible → gone/invisible
166
+ if (prev === 'visible' && visibility !== 'visible') {
167
+ if (enabled && (outSpec.hasFade || outSpec.hasScale || outSpec.hasSlide)) {
168
+ setRendered(true);
169
+ setCollapsed(false);
170
+ if (outSpec.hasScale) {
171
+ setActiveScale({ value: outSpec.scaleValue, pivotX: outSpec.scalePivotX, pivotY: outSpec.scalePivotY });
172
+ }
173
+ runOut(visibility);
174
+ }
175
+ else {
176
+ opacity.setValue(visibility === 'invisible' ? 0 : 0);
177
+ if (visibility === 'gone') {
178
+ onBeforeCollapseRef.current?.();
179
+ setRendered(false);
180
+ setCollapsed(true);
181
+ }
182
+ }
183
+ return;
184
+ }
185
+ // gone/invisible → visible
186
+ if (prev !== 'visible' && visibility === 'visible') {
187
+ if (prev === 'gone') {
188
+ onBeforeExpandRef.current?.();
189
+ }
190
+ setRendered(true);
191
+ setCollapsed(false);
192
+ if (enabled && (inSpec.hasFade || inSpec.hasScale || inSpec.hasSlide)) {
193
+ if (inSpec.hasFade)
194
+ opacity.setValue(inSpec.fadeAlpha);
195
+ else
196
+ opacity.setValue(1);
197
+ if (inSpec.hasScale) {
198
+ scale.setValue(inSpec.scaleValue);
199
+ setActiveScale({ value: inSpec.scaleValue, pivotX: inSpec.scalePivotX, pivotY: inSpec.scalePivotY });
200
+ }
201
+ else {
202
+ scale.setValue(1);
203
+ setActiveScale(null);
204
+ }
205
+ if (inSpec.hasSlide) {
206
+ const off = slideOffsetFor(inSpec.slideEdge, inSpec.slideDistance);
207
+ slideTx.setValue(off.tx);
208
+ slideTy.setValue(off.ty);
209
+ }
210
+ else {
211
+ slideTx.setValue(0);
212
+ slideTy.setValue(0);
213
+ }
214
+ runIn();
215
+ }
216
+ else {
217
+ opacity.setValue(1);
218
+ scale.setValue(1);
219
+ slideTx.setValue(0);
220
+ slideTy.setValue(0);
221
+ setActiveScale(null);
222
+ }
223
+ return;
224
+ }
225
+ if (prev !== 'visible' && visibility !== 'visible') {
226
+ setRendered(visibility !== 'gone');
227
+ setCollapsed(visibility === 'gone');
228
+ }
229
+ // eslint-disable-next-line react-hooks/exhaustive-deps
230
+ }, [visibility, inSpec, outSpec, enabled, mode]);
231
+ function stopInFlight() {
232
+ if (inFlightRef.current) {
233
+ inFlightRef.current.stop();
234
+ inFlightRef.current = null;
235
+ }
236
+ }
237
+ /** Build the list of timings for a transition_in (target = identity). */
238
+ function buildInAnimations() {
239
+ const anims = [];
240
+ if (inSpec.hasFade) {
241
+ anims.push(Animated.timing(opacity, {
242
+ toValue: 1, duration: inSpec.fadeDuration, delay: inSpec.fadeDelay,
243
+ easing: inSpec.fadeEasing, useNativeDriver: true
244
+ }));
245
+ }
246
+ if (inSpec.hasScale) {
247
+ anims.push(Animated.timing(scale, {
248
+ toValue: 1, duration: inSpec.scaleDuration, delay: inSpec.scaleDelay,
249
+ easing: inSpec.scaleEasing, useNativeDriver: true
250
+ }));
251
+ }
252
+ if (inSpec.hasSlide) {
253
+ anims.push(Animated.timing(slideTx, {
254
+ toValue: 0, duration: inSpec.slideDuration, delay: inSpec.slideDelay,
255
+ easing: inSpec.slideEasing, useNativeDriver: true
256
+ }));
257
+ anims.push(Animated.timing(slideTy, {
258
+ toValue: 0, duration: inSpec.slideDuration, delay: inSpec.slideDelay,
259
+ easing: inSpec.slideEasing, useNativeDriver: true
260
+ }));
261
+ }
262
+ return anims;
263
+ }
264
+ /** Build the list of timings for a transition_out (target = end values). */
265
+ function buildOutAnimations() {
266
+ const anims = [];
267
+ if (outSpec.hasFade) {
268
+ anims.push(Animated.timing(opacity, {
269
+ toValue: outSpec.fadeAlpha, duration: outSpec.fadeDuration, delay: outSpec.fadeDelay,
270
+ easing: outSpec.fadeEasing, useNativeDriver: true
271
+ }));
272
+ }
273
+ if (outSpec.hasScale) {
274
+ anims.push(Animated.timing(scale, {
275
+ toValue: outSpec.scaleValue, duration: outSpec.scaleDuration, delay: outSpec.scaleDelay,
276
+ easing: outSpec.scaleEasing, useNativeDriver: true
277
+ }));
278
+ }
279
+ if (outSpec.hasSlide) {
280
+ const off = slideOffsetFor(outSpec.slideEdge, outSpec.slideDistance);
281
+ anims.push(Animated.timing(slideTx, {
282
+ toValue: off.tx, duration: outSpec.slideDuration, delay: outSpec.slideDelay,
283
+ easing: outSpec.slideEasing, useNativeDriver: true
284
+ }));
285
+ anims.push(Animated.timing(slideTy, {
286
+ toValue: off.ty, duration: outSpec.slideDuration, delay: outSpec.slideDelay,
287
+ easing: outSpec.slideEasing, useNativeDriver: true
288
+ }));
289
+ }
290
+ return anims;
291
+ }
292
+ function runIn() {
293
+ stopInFlight();
294
+ const anims = buildInAnimations();
295
+ if (anims.length === 0)
296
+ return Promise.resolve();
297
+ const comp = Animated.parallel(anims);
298
+ inFlightRef.current = comp;
299
+ return new Promise(resolve => {
300
+ comp.start(({ finished }) => {
301
+ if (inFlightRef.current === comp)
302
+ inFlightRef.current = null;
303
+ if (finished) {
304
+ if (inSpec.hasFade)
305
+ opacity.setValue(1);
306
+ if (inSpec.hasScale)
307
+ scale.setValue(1);
308
+ if (inSpec.hasSlide) {
309
+ slideTx.setValue(0);
310
+ slideTy.setValue(0);
311
+ }
312
+ }
313
+ resolve();
314
+ });
315
+ });
316
+ }
317
+ function runOut(target) {
318
+ stopInFlight();
319
+ const anims = buildOutAnimations();
320
+ if (anims.length === 0) {
321
+ if (target === 'gone') {
322
+ onBeforeCollapseRef.current?.();
323
+ setRendered(false);
324
+ setCollapsed(true);
325
+ }
326
+ return Promise.resolve();
327
+ }
328
+ const comp = Animated.parallel(anims);
329
+ inFlightRef.current = comp;
330
+ return new Promise(resolve => {
331
+ comp.start(({ finished }) => {
332
+ if (inFlightRef.current === comp)
333
+ inFlightRef.current = null;
334
+ if (!finished) {
335
+ resolve();
336
+ return;
337
+ }
338
+ if (target === 'gone') {
339
+ onBeforeCollapseRef.current?.();
340
+ setRendered(false);
341
+ setCollapsed(true);
342
+ }
343
+ resolve();
344
+ });
345
+ });
346
+ }
347
+ /**
348
+ * Imperative API: play transition_out without touching rendered/collapsed state.
349
+ * Caller decides whether to unmount the element after the promise resolves.
350
+ */
351
+ const playOut = useCallback(() => {
352
+ stopInFlight();
353
+ const anims = buildOutAnimations();
354
+ if (anims.length === 0)
355
+ return Promise.resolve();
356
+ const comp = Animated.parallel(anims);
357
+ inFlightRef.current = comp;
358
+ if (outSpec.hasScale) {
359
+ setActiveScale({
360
+ value: outSpec.scaleValue,
361
+ pivotX: outSpec.scalePivotX,
362
+ pivotY: outSpec.scalePivotY
363
+ });
364
+ }
365
+ return new Promise(resolve => {
366
+ comp.start(() => {
367
+ if (inFlightRef.current === comp)
368
+ inFlightRef.current = null;
369
+ resolve();
370
+ });
371
+ });
372
+ // eslint-disable-next-line react-hooks/exhaustive-deps
373
+ }, [outSpec]);
374
+ /**
375
+ * Imperative API: reset values to transition_in start, then animate to identity.
376
+ */
377
+ const playIn = useCallback(() => {
378
+ stopInFlight();
379
+ // Reset values to start
380
+ if (inSpec.hasFade)
381
+ opacity.setValue(inSpec.fadeAlpha);
382
+ if (inSpec.hasScale) {
383
+ scale.setValue(inSpec.scaleValue);
384
+ setActiveScale({
385
+ value: inSpec.scaleValue,
386
+ pivotX: inSpec.scalePivotX,
387
+ pivotY: inSpec.scalePivotY
388
+ });
389
+ }
390
+ if (inSpec.hasSlide) {
391
+ const off = slideOffsetFor(inSpec.slideEdge, inSpec.slideDistance);
392
+ slideTx.setValue(off.tx);
393
+ slideTy.setValue(off.ty);
394
+ }
395
+ const anims = buildInAnimations();
396
+ if (anims.length === 0)
397
+ return Promise.resolve();
398
+ const comp = Animated.parallel(anims);
399
+ inFlightRef.current = comp;
400
+ return new Promise(resolve => {
401
+ comp.start(({ finished }) => {
402
+ if (inFlightRef.current === comp)
403
+ inFlightRef.current = null;
404
+ if (finished) {
405
+ if (inSpec.hasFade)
406
+ opacity.setValue(1);
407
+ if (inSpec.hasScale)
408
+ scale.setValue(1);
409
+ if (inSpec.hasSlide) {
410
+ slideTx.setValue(0);
411
+ slideTy.setValue(0);
412
+ }
413
+ }
414
+ resolve();
415
+ });
416
+ });
417
+ // eslint-disable-next-line react-hooks/exhaustive-deps
418
+ }, [inSpec]);
419
+ const hasTransitionIn = inSpec.hasFade || inSpec.hasScale || inSpec.hasSlide;
420
+ const hasTransitionOut = outSpec.hasFade || outSpec.hasScale || outSpec.hasSlide;
421
+ useEffect(() => {
422
+ return () => {
423
+ if (inFlightRef.current) {
424
+ inFlightRef.current.stop();
425
+ inFlightRef.current = null;
426
+ }
427
+ };
428
+ }, []);
429
+ // Build the final transform array, combining slide translate + scale + pivot compensation.
430
+ const transform = useMemo(() => {
431
+ const out = [];
432
+ const hasAnySlide = inSpec.hasSlide || outSpec.hasSlide;
433
+ const hasAnyScale = inSpec.hasScale || outSpec.hasScale;
434
+ if (!hasAnySlide && !hasAnyScale)
435
+ return out;
436
+ // Build translateX/Y from slide + pivot interpolation.
437
+ let txExpr = hasAnySlide ? slideTx : null;
438
+ let tyExpr = hasAnySlide ? slideTy : null;
439
+ if (hasAnyScale &&
440
+ activeScale &&
441
+ (activeScale.pivotX !== 0.5 || activeScale.pivotY !== 0.5) &&
442
+ typeof layoutWidth === 'number' &&
443
+ typeof layoutHeight === 'number' &&
444
+ layoutWidth > 0 &&
445
+ layoutHeight > 0) {
446
+ // pivotTx = (pivotX - 0.5) * width * (1 - scale)
447
+ // Interpolate over [min(value,1), max(value,1)] mapped to corresponding endpoints.
448
+ const a = Math.min(activeScale.value, 1);
449
+ const b = Math.max(activeScale.value, 1);
450
+ if (a !== b && activeScale.pivotX !== 0.5) {
451
+ const offsetA = (activeScale.pivotX - 0.5) * layoutWidth * (1 - a);
452
+ const offsetB = (activeScale.pivotX - 0.5) * layoutWidth * (1 - b);
453
+ const pivotTx = scale.interpolate({
454
+ inputRange: [a, b],
455
+ outputRange: [offsetA, offsetB],
456
+ extrapolate: 'clamp'
457
+ });
458
+ txExpr = txExpr !== null ? Animated.add(txExpr, pivotTx) : pivotTx;
459
+ }
460
+ if (a !== b && activeScale.pivotY !== 0.5) {
461
+ const offsetA = (activeScale.pivotY - 0.5) * layoutHeight * (1 - a);
462
+ const offsetB = (activeScale.pivotY - 0.5) * layoutHeight * (1 - b);
463
+ const pivotTy = scale.interpolate({
464
+ inputRange: [a, b],
465
+ outputRange: [offsetA, offsetB],
466
+ extrapolate: 'clamp'
467
+ });
468
+ tyExpr = tyExpr !== null ? Animated.add(tyExpr, pivotTy) : pivotTy;
469
+ }
470
+ }
471
+ if (txExpr !== null)
472
+ out.push({ translateX: txExpr });
473
+ if (tyExpr !== null)
474
+ out.push({ translateY: tyExpr });
475
+ if (hasAnyScale)
476
+ out.push({ scale });
477
+ return out;
478
+ }, [inSpec, outSpec, activeScale, layoutWidth, layoutHeight, slideTx, slideTy, scale]);
479
+ return {
480
+ rendered,
481
+ collapsed,
482
+ opacity,
483
+ transform,
484
+ playIn,
485
+ playOut,
486
+ hasTransitionIn,
487
+ hasTransitionOut
488
+ };
489
+ }
490
+ //# sourceMappingURL=useAppearanceTransition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppearanceTransition.js","sourceRoot":"","sources":["../../src/hooks/useAppearanceTransition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { LayoutChangeEvent } from 'react-native';
2
+ import type { MaybeMissing } from '../expressions/json';
3
+ import type { TransitionChange } from '../types/base';
4
+ export interface ChangeBoundsTransitionOptions {
5
+ transitionChange?: MaybeMissing<TransitionChange>;
6
+ /**
7
+ * When true, the element is being unmounted/collapsed and we should NOT play a FLIP transition
8
+ * from previous bounds (the element is going away — that's handled by transition_out).
9
+ */
10
+ suspended?: boolean;
11
+ }
12
+ export interface ChangeBoundsTransitionResult {
13
+ /** Plug onto Animated.View. Computes delta vs prev layout and starts FLIP timing. */
14
+ onLayout: (e: LayoutChangeEvent) => void;
15
+ /**
16
+ * Transform array to merge into Animated.View style. Empty if no change_bounds spec.
17
+ * Returns translateX/translateY/scaleX/scaleY animated values that ride to identity.
18
+ */
19
+ transform: Array<{
20
+ translateX?: any;
21
+ translateY?: any;
22
+ scaleX?: any;
23
+ scaleY?: any;
24
+ }>;
25
+ /** Width measured by onLayout (handy for pivot calc in appearance hook). */
26
+ layoutWidth: number | undefined;
27
+ layoutHeight: number | undefined;
28
+ }
29
+ /**
30
+ * FLIP (First-Last-Invert-Play) hook for transition_change with custom cubic easing.
31
+ *
32
+ * On each layout change:
33
+ * 1. Capture previous (First) and new (Last) bounds via onLayout.
34
+ * 2. Set transform to translate(-dx, -dy) * scale(prevW/newW, prevH/newH) so the element
35
+ * visually stays at its old position/size (Invert).
36
+ * 3. Animate transform to identity over the spec duration (Play).
37
+ *
38
+ * Limitations:
39
+ * - onLayout reports coords relative to the parent. If the parent itself moves, we will
40
+ * see a position change but interpret it as our own movement — usually fine for items
41
+ * inside a stable container.
42
+ * - useNativeDriver is enabled (transform-only props), so the animation runs on the UI thread.
43
+ * - First layout is treated as the baseline and is not animated.
44
+ */
45
+ export declare function useChangeBoundsTransition(opts: ChangeBoundsTransitionOptions): ChangeBoundsTransitionResult;
46
+ //# sourceMappingURL=useChangeBoundsTransition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChangeBoundsTransition.d.ts","sourceRoot":"","sources":["../../src/hooks/useChangeBoundsTransition.ts"],"names":[],"mappings":"AACA,OAAO,EAAoC,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAA0B,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA2C9E,MAAM,WAAW,6BAA6B;IAC1C,gBAAgB,CAAC,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAClD;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IACzC,qFAAqF;IACrF,QAAQ,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,SAAS,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,GAAG,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACrF,4EAA4E;IAC5E,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACrC,IAAI,EAAE,6BAA6B,GACpC,4BAA4B,CA0G9B"}