@tamagui/animations-css 1.22.12 → 1.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/createAnimations.js +45 -1
- package/dist/cjs/createAnimations.js.map +1 -1
- package/dist/esm/createAnimations.js +47 -2
- package/dist/esm/createAnimations.js.map +1 -1
- package/dist/esm/createAnimations.mjs +47 -2
- package/dist/esm/createAnimations.mjs.map +1 -1
- package/package.json +4 -4
- package/src/createAnimations.tsx +65 -2
- package/types/createAnimations.d.ts.map +1 -1
|
@@ -21,6 +21,7 @@ __export(createAnimations_exports, {
|
|
|
21
21
|
createAnimations: () => createAnimations
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(createAnimations_exports);
|
|
24
|
+
var import_cubic_bezier_animator = require("@tamagui/cubic-bezier-animator");
|
|
24
25
|
var import_use_presence = require("@tamagui/use-presence");
|
|
25
26
|
var import_web = require("@tamagui/web");
|
|
26
27
|
var import_react = require("react");
|
|
@@ -71,6 +72,7 @@ function createAnimations(animations) {
|
|
|
71
72
|
const isEntering = !!state.unmounted;
|
|
72
73
|
const isExiting = (presence == null ? void 0 : presence[0]) === false;
|
|
73
74
|
const sendExitComplete = presence == null ? void 0 : presence[1];
|
|
75
|
+
const initialPositionRef = (0, import_web.useSafeRef)(null);
|
|
74
76
|
const animationKey = Array.isArray(props.animation) ? props.animation[0] : props.animation;
|
|
75
77
|
const animation = animations[animationKey];
|
|
76
78
|
if (!animation) {
|
|
@@ -91,7 +93,32 @@ function createAnimations(animations) {
|
|
|
91
93
|
node.addEventListener("transitioncancel", onFinishAnimation);
|
|
92
94
|
};
|
|
93
95
|
}, [sendExitComplete, isExiting]);
|
|
94
|
-
|
|
96
|
+
(0, import_web.useIsomorphicLayoutEffect)(() => {
|
|
97
|
+
var _a;
|
|
98
|
+
if (!hostRef.current || !props.layout) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const boundingBox = (_a = hostRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
102
|
+
if (isChanged(initialPositionRef.current, boundingBox)) {
|
|
103
|
+
const transform = invert(
|
|
104
|
+
hostRef.current,
|
|
105
|
+
boundingBox,
|
|
106
|
+
initialPositionRef.current
|
|
107
|
+
);
|
|
108
|
+
(0, import_cubic_bezier_animator.animate)({
|
|
109
|
+
from: transform,
|
|
110
|
+
to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },
|
|
111
|
+
duration: 1e3,
|
|
112
|
+
onUpdate: ({ x, y, scaleX, scaleY }) => {
|
|
113
|
+
hostRef.current.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`;
|
|
114
|
+
},
|
|
115
|
+
// TODO: extract ease-in from string and convert/map it to a cubicBezier array
|
|
116
|
+
cubicBezier: [0, 1.38, 1, -0.41]
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
initialPositionRef.current = boundingBox;
|
|
120
|
+
});
|
|
121
|
+
style.transition = `${keys} ${animation}${props.layout ? ",width 0s, height 0s, margin 0s, padding 0s, transform" : ""}`;
|
|
95
122
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
96
123
|
console.log("CSS animation", style, { isEntering, isExiting });
|
|
97
124
|
}
|
|
@@ -101,6 +128,23 @@ function createAnimations(animations) {
|
|
|
101
128
|
}
|
|
102
129
|
};
|
|
103
130
|
}
|
|
131
|
+
const isChanged = (initialBox, finalBox) => {
|
|
132
|
+
if (!initialBox || !finalBox)
|
|
133
|
+
return false;
|
|
134
|
+
return JSON.stringify(initialBox) !== JSON.stringify(finalBox);
|
|
135
|
+
};
|
|
136
|
+
const invert = (el, from, to) => {
|
|
137
|
+
const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from;
|
|
138
|
+
const { x, y, width, height } = to;
|
|
139
|
+
const transform = {
|
|
140
|
+
x: x - fromX - (fromWidth - width) / 2,
|
|
141
|
+
y: y - fromY - (fromHeight - height) / 2,
|
|
142
|
+
scaleX: width / fromWidth,
|
|
143
|
+
scaleY: height / fromHeight
|
|
144
|
+
};
|
|
145
|
+
el.style.transform = `translate(${transform.x}px, ${transform.y}px) scaleX(${transform.scaleX}) scaleY(${transform.scaleY})`;
|
|
146
|
+
return transform;
|
|
147
|
+
};
|
|
104
148
|
// Annotate the CommonJS export names for ESM import in node:
|
|
105
149
|
0 && (module.exports = {
|
|
106
150
|
createAnimations
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA4B;AAC5B,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { animate } from "@tamagui/cubic-bezier-animator";
|
|
1
2
|
import { usePresence } from "@tamagui/use-presence";
|
|
2
3
|
import {
|
|
3
4
|
Stack,
|
|
4
5
|
Text,
|
|
5
|
-
useIsomorphicLayoutEffect
|
|
6
|
+
useIsomorphicLayoutEffect,
|
|
7
|
+
useSafeRef
|
|
6
8
|
} from "@tamagui/web";
|
|
7
9
|
import { useMemo, useState } from "react";
|
|
8
10
|
function createAnimations(animations) {
|
|
@@ -52,6 +54,7 @@ function createAnimations(animations) {
|
|
|
52
54
|
const isEntering = !!state.unmounted;
|
|
53
55
|
const isExiting = (presence == null ? void 0 : presence[0]) === false;
|
|
54
56
|
const sendExitComplete = presence == null ? void 0 : presence[1];
|
|
57
|
+
const initialPositionRef = useSafeRef(null);
|
|
55
58
|
const animationKey = Array.isArray(props.animation) ? props.animation[0] : props.animation;
|
|
56
59
|
const animation = animations[animationKey];
|
|
57
60
|
if (!animation) {
|
|
@@ -72,7 +75,32 @@ function createAnimations(animations) {
|
|
|
72
75
|
node.addEventListener("transitioncancel", onFinishAnimation);
|
|
73
76
|
};
|
|
74
77
|
}, [sendExitComplete, isExiting]);
|
|
75
|
-
|
|
78
|
+
useIsomorphicLayoutEffect(() => {
|
|
79
|
+
var _a;
|
|
80
|
+
if (!hostRef.current || !props.layout) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const boundingBox = (_a = hostRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
84
|
+
if (isChanged(initialPositionRef.current, boundingBox)) {
|
|
85
|
+
const transform = invert(
|
|
86
|
+
hostRef.current,
|
|
87
|
+
boundingBox,
|
|
88
|
+
initialPositionRef.current
|
|
89
|
+
);
|
|
90
|
+
animate({
|
|
91
|
+
from: transform,
|
|
92
|
+
to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },
|
|
93
|
+
duration: 1e3,
|
|
94
|
+
onUpdate: ({ x, y, scaleX, scaleY }) => {
|
|
95
|
+
hostRef.current.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`;
|
|
96
|
+
},
|
|
97
|
+
// TODO: extract ease-in from string and convert/map it to a cubicBezier array
|
|
98
|
+
cubicBezier: [0, 1.38, 1, -0.41]
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
initialPositionRef.current = boundingBox;
|
|
102
|
+
});
|
|
103
|
+
style.transition = `${keys} ${animation}${props.layout ? ",width 0s, height 0s, margin 0s, padding 0s, transform" : ""}`;
|
|
76
104
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
77
105
|
console.log("CSS animation", style, { isEntering, isExiting });
|
|
78
106
|
}
|
|
@@ -82,6 +110,23 @@ function createAnimations(animations) {
|
|
|
82
110
|
}
|
|
83
111
|
};
|
|
84
112
|
}
|
|
113
|
+
const isChanged = (initialBox, finalBox) => {
|
|
114
|
+
if (!initialBox || !finalBox)
|
|
115
|
+
return false;
|
|
116
|
+
return JSON.stringify(initialBox) !== JSON.stringify(finalBox);
|
|
117
|
+
};
|
|
118
|
+
const invert = (el, from, to) => {
|
|
119
|
+
const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from;
|
|
120
|
+
const { x, y, width, height } = to;
|
|
121
|
+
const transform = {
|
|
122
|
+
x: x - fromX - (fromWidth - width) / 2,
|
|
123
|
+
y: y - fromY - (fromHeight - height) / 2,
|
|
124
|
+
scaleX: width / fromWidth,
|
|
125
|
+
scaleY: height / fromHeight
|
|
126
|
+
};
|
|
127
|
+
el.style.transform = `translate(${transform.x}px, ${transform.y}px) scaleX(${transform.scaleX}) scaleY(${transform.scaleY})`;
|
|
128
|
+
return transform;
|
|
129
|
+
};
|
|
85
130
|
export {
|
|
86
131
|
createAnimations
|
|
87
132
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"mappings": "AAAA,SAAS,mBAAmB;AAC5B;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { animate } from "@tamagui/cubic-bezier-animator";
|
|
1
2
|
import { usePresence } from "@tamagui/use-presence";
|
|
2
3
|
import {
|
|
3
4
|
Stack,
|
|
4
5
|
Text,
|
|
5
|
-
useIsomorphicLayoutEffect
|
|
6
|
+
useIsomorphicLayoutEffect,
|
|
7
|
+
useSafeRef
|
|
6
8
|
} from "@tamagui/web";
|
|
7
9
|
import { useMemo, useState } from "react";
|
|
8
10
|
function createAnimations(animations) {
|
|
@@ -52,6 +54,7 @@ function createAnimations(animations) {
|
|
|
52
54
|
const isEntering = !!state.unmounted;
|
|
53
55
|
const isExiting = (presence == null ? void 0 : presence[0]) === false;
|
|
54
56
|
const sendExitComplete = presence == null ? void 0 : presence[1];
|
|
57
|
+
const initialPositionRef = useSafeRef(null);
|
|
55
58
|
const animationKey = Array.isArray(props.animation) ? props.animation[0] : props.animation;
|
|
56
59
|
const animation = animations[animationKey];
|
|
57
60
|
if (!animation) {
|
|
@@ -72,7 +75,32 @@ function createAnimations(animations) {
|
|
|
72
75
|
node.addEventListener("transitioncancel", onFinishAnimation);
|
|
73
76
|
};
|
|
74
77
|
}, [sendExitComplete, isExiting]);
|
|
75
|
-
|
|
78
|
+
useIsomorphicLayoutEffect(() => {
|
|
79
|
+
var _a;
|
|
80
|
+
if (!hostRef.current || !props.layout) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const boundingBox = (_a = hostRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
84
|
+
if (isChanged(initialPositionRef.current, boundingBox)) {
|
|
85
|
+
const transform = invert(
|
|
86
|
+
hostRef.current,
|
|
87
|
+
boundingBox,
|
|
88
|
+
initialPositionRef.current
|
|
89
|
+
);
|
|
90
|
+
animate({
|
|
91
|
+
from: transform,
|
|
92
|
+
to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },
|
|
93
|
+
duration: 1e3,
|
|
94
|
+
onUpdate: ({ x, y, scaleX, scaleY }) => {
|
|
95
|
+
hostRef.current.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`;
|
|
96
|
+
},
|
|
97
|
+
// TODO: extract ease-in from string and convert/map it to a cubicBezier array
|
|
98
|
+
cubicBezier: [0, 1.38, 1, -0.41]
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
initialPositionRef.current = boundingBox;
|
|
102
|
+
});
|
|
103
|
+
style.transition = `${keys} ${animation}${props.layout ? ",width 0s, height 0s, margin 0s, padding 0s, transform" : ""}`;
|
|
76
104
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
77
105
|
console.log("CSS animation", style, { isEntering, isExiting });
|
|
78
106
|
}
|
|
@@ -82,6 +110,23 @@ function createAnimations(animations) {
|
|
|
82
110
|
}
|
|
83
111
|
};
|
|
84
112
|
}
|
|
113
|
+
const isChanged = (initialBox, finalBox) => {
|
|
114
|
+
if (!initialBox || !finalBox)
|
|
115
|
+
return false;
|
|
116
|
+
return JSON.stringify(initialBox) !== JSON.stringify(finalBox);
|
|
117
|
+
};
|
|
118
|
+
const invert = (el, from, to) => {
|
|
119
|
+
const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from;
|
|
120
|
+
const { x, y, width, height } = to;
|
|
121
|
+
const transform = {
|
|
122
|
+
x: x - fromX - (fromWidth - width) / 2,
|
|
123
|
+
y: y - fromY - (fromHeight - height) / 2,
|
|
124
|
+
scaleX: width / fromWidth,
|
|
125
|
+
scaleY: height / fromHeight
|
|
126
|
+
};
|
|
127
|
+
el.style.transform = `translate(${transform.x}px, ${transform.y}px) scaleX(${transform.scaleX}) scaleY(${transform.scaleY})`;
|
|
128
|
+
return transform;
|
|
129
|
+
};
|
|
85
130
|
export {
|
|
86
131
|
createAnimations
|
|
87
132
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"mappings": "AAAA,SAAS,mBAAmB;AAC5B;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/animations-css",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.1",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
"dist"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@tamagui/use-presence": "1.
|
|
17
|
-
"@tamagui/web": "1.
|
|
16
|
+
"@tamagui/use-presence": "1.23.1",
|
|
17
|
+
"@tamagui/web": "1.23.1"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@tamagui/build": "1.
|
|
20
|
+
"@tamagui/build": "1.23.1"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tamagui-build",
|
package/src/createAnimations.tsx
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { animate } from '@tamagui/cubic-bezier-animator'
|
|
1
2
|
import { usePresence } from '@tamagui/use-presence'
|
|
2
3
|
import {
|
|
3
4
|
AnimationDriver,
|
|
@@ -5,8 +6,9 @@ import {
|
|
|
5
6
|
Text,
|
|
6
7
|
UniversalAnimatedNumber,
|
|
7
8
|
useIsomorphicLayoutEffect,
|
|
9
|
+
useSafeRef,
|
|
8
10
|
} from '@tamagui/web'
|
|
9
|
-
import { useMemo,
|
|
11
|
+
import { useMemo, useState } from 'react'
|
|
10
12
|
|
|
11
13
|
export function createAnimations<A extends Object>(animations: A): AnimationDriver<A> {
|
|
12
14
|
return {
|
|
@@ -60,6 +62,7 @@ export function createAnimations<A extends Object>(animations: A): AnimationDriv
|
|
|
60
62
|
const isEntering = !!state.unmounted
|
|
61
63
|
const isExiting = presence?.[0] === false
|
|
62
64
|
const sendExitComplete = presence?.[1]
|
|
65
|
+
const initialPositionRef = useSafeRef<any>(null)
|
|
63
66
|
const animationKey = Array.isArray(props.animation)
|
|
64
67
|
? props.animation[0]
|
|
65
68
|
: props.animation
|
|
@@ -84,8 +87,44 @@ export function createAnimations<A extends Object>(animations: A): AnimationDriv
|
|
|
84
87
|
}
|
|
85
88
|
}, [sendExitComplete, isExiting])
|
|
86
89
|
|
|
90
|
+
useIsomorphicLayoutEffect(() => {
|
|
91
|
+
if (!hostRef.current || !props.layout) {
|
|
92
|
+
return
|
|
93
|
+
}
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
const boundingBox = hostRef.current?.getBoundingClientRect()
|
|
96
|
+
if (isChanged(initialPositionRef.current, boundingBox)) {
|
|
97
|
+
const transform = invert(
|
|
98
|
+
hostRef.current,
|
|
99
|
+
boundingBox,
|
|
100
|
+
initialPositionRef.current
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
animate({
|
|
104
|
+
from: transform,
|
|
105
|
+
to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },
|
|
106
|
+
duration: 1000,
|
|
107
|
+
onUpdate: ({ x, y, scaleX, scaleY }) => {
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
hostRef.current.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`
|
|
110
|
+
// TODO: handle childRef inverse scale
|
|
111
|
+
// childRef.current.style.transform = `scaleX(${1 / scaleX}) scaleY(${
|
|
112
|
+
// 1 / scaleY
|
|
113
|
+
// })`
|
|
114
|
+
},
|
|
115
|
+
// TODO: extract ease-in from string and convert/map it to a cubicBezier array
|
|
116
|
+
cubicBezier: [0, 1.38, 1, -0.41],
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
initialPositionRef.current = boundingBox
|
|
120
|
+
})
|
|
121
|
+
|
|
87
122
|
// add css transition
|
|
88
|
-
|
|
123
|
+
// TODO: we disabled the transform transition, because it will create issue for inverse function and animate function
|
|
124
|
+
// for non layout transform properties either use animate function or find a workaround to do it with css
|
|
125
|
+
style.transition = `${keys} ${animation}${
|
|
126
|
+
props.layout ? ',width 0s, height 0s, margin 0s, padding 0s, transform' : ''
|
|
127
|
+
}`
|
|
89
128
|
|
|
90
129
|
if (process.env.NODE_ENV === 'development' && props['debug']) {
|
|
91
130
|
// rome-ignore lint/nursery/noConsoleLog: ok
|
|
@@ -99,3 +138,27 @@ export function createAnimations<A extends Object>(animations: A): AnimationDriv
|
|
|
99
138
|
},
|
|
100
139
|
}
|
|
101
140
|
}
|
|
141
|
+
|
|
142
|
+
const isChanged = (initialBox: any, finalBox: any) => {
|
|
143
|
+
// we just mounted, so we don't have complete data yet
|
|
144
|
+
if (!initialBox || !finalBox) return false
|
|
145
|
+
|
|
146
|
+
// deep compare the two boxes
|
|
147
|
+
return JSON.stringify(initialBox) !== JSON.stringify(finalBox)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const invert = (el, from, to) => {
|
|
151
|
+
const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from
|
|
152
|
+
const { x, y, width, height } = to
|
|
153
|
+
|
|
154
|
+
const transform = {
|
|
155
|
+
x: x - fromX - (fromWidth - width) / 2,
|
|
156
|
+
y: y - fromY - (fromHeight - height) / 2,
|
|
157
|
+
scaleX: width / fromWidth,
|
|
158
|
+
scaleY: height / fromHeight,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
el.style.transform = `translate(${transform.x}px, ${transform.y}px) scaleX(${transform.scaleX}) scaleY(${transform.scaleY})`
|
|
162
|
+
|
|
163
|
+
return transform
|
|
164
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAnimations.d.ts","sourceRoot":"","sources":["../src/createAnimations.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createAnimations.d.ts","sourceRoot":"","sources":["../src/createAnimations.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EAMhB,MAAM,cAAc,CAAA;AAGrB,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CA+HpF"}
|