@tamagui/animations-css 2.0.0-rc.5 → 2.0.0-rc.6
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.cjs +15 -4
- package/dist/cjs/createAnimations.js +13 -4
- package/dist/cjs/createAnimations.js.map +1 -1
- package/dist/cjs/createAnimations.native.js +16 -4
- package/dist/cjs/createAnimations.native.js.map +1 -1
- package/dist/esm/createAnimations.js +13 -4
- package/dist/esm/createAnimations.js.map +1 -1
- package/dist/esm/createAnimations.mjs +15 -4
- package/dist/esm/createAnimations.mjs.map +1 -1
- package/dist/esm/createAnimations.native.js +16 -4
- package/dist/esm/createAnimations.native.js.map +1 -1
- package/package.json +7 -7
- package/src/createAnimations.tsx +35 -2
- package/types/createAnimations.d.ts.map +2 -2
|
@@ -39,12 +39,22 @@ var import_animation_helpers = require("@tamagui/animation-helpers"),
|
|
|
39
39
|
import_use_presence = require("@tamagui/use-presence"),
|
|
40
40
|
import_web = require("@tamagui/web"),
|
|
41
41
|
import_react = __toESM(require("react"), 1);
|
|
42
|
+
const EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
43
|
+
EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
42
44
|
function extractDuration(animation) {
|
|
43
|
-
const msMatch = animation.match(
|
|
45
|
+
const msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
44
46
|
if (msMatch) return Number.parseInt(msMatch[1], 10);
|
|
45
|
-
const sMatch = animation.match(
|
|
47
|
+
const sMatch = animation.match(EXTRACT_S_REGEX);
|
|
46
48
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
47
49
|
}
|
|
50
|
+
const MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
51
|
+
S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
52
|
+
function applyDurationOverride(animation, durationMs) {
|
|
53
|
+
const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
54
|
+
if (msReplaced !== animation) return msReplaced;
|
|
55
|
+
const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
56
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
57
|
+
}
|
|
48
58
|
function createAnimations(animations) {
|
|
49
59
|
const reactionListeners = /* @__PURE__ */new WeakMap();
|
|
50
60
|
return {
|
|
@@ -133,11 +143,12 @@ function createAnimations(animations) {
|
|
|
133
143
|
};
|
|
134
144
|
}, [sendExitComplete, isExiting]), !(0, import_animation_helpers.hasAnimation)(normalized)) return null;
|
|
135
145
|
Array.isArray(style.transform) && (style.transform = (0, import_web.transformsToString)(style.transform));
|
|
136
|
-
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : ""
|
|
146
|
+
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "",
|
|
147
|
+
durationOverride = normalized.config?.duration;
|
|
137
148
|
return style.transition = keys.map(key => {
|
|
138
149
|
const propAnimation = normalized.properties[key];
|
|
139
150
|
let animationValue = null;
|
|
140
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
151
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
141
152
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
142
153
|
props,
|
|
143
154
|
animations,
|
|
@@ -26,13 +26,22 @@ __export(createAnimations_exports, {
|
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(createAnimations_exports);
|
|
28
28
|
var import_animation_helpers = require("@tamagui/animation-helpers"), import_constants = require("@tamagui/constants"), import_use_presence = require("@tamagui/use-presence"), import_web = require("@tamagui/web"), import_react = __toESM(require("react"), 1);
|
|
29
|
+
const EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/, EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
29
30
|
function extractDuration(animation) {
|
|
30
|
-
const msMatch = animation.match(
|
|
31
|
+
const msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
31
32
|
if (msMatch)
|
|
32
33
|
return Number.parseInt(msMatch[1], 10);
|
|
33
|
-
const sMatch = animation.match(
|
|
34
|
+
const sMatch = animation.match(EXTRACT_S_REGEX);
|
|
34
35
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
35
36
|
}
|
|
37
|
+
const MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/, S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
38
|
+
function applyDurationOverride(animation, durationMs) {
|
|
39
|
+
const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
40
|
+
if (msReplaced !== animation)
|
|
41
|
+
return msReplaced;
|
|
42
|
+
const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
43
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
44
|
+
}
|
|
36
45
|
function createAnimations(animations) {
|
|
37
46
|
const reactionListeners = /* @__PURE__ */ new WeakMap();
|
|
38
47
|
return {
|
|
@@ -100,11 +109,11 @@ function createAnimations(animations) {
|
|
|
100
109
|
}, [sendExitComplete, isExiting]), !(0, import_animation_helpers.hasAnimation)(normalized))
|
|
101
110
|
return null;
|
|
102
111
|
Array.isArray(style.transform) && (style.transform = (0, import_web.transformsToString)(style.transform));
|
|
103
|
-
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "";
|
|
112
|
+
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "", durationOverride = normalized.config?.duration;
|
|
104
113
|
return style.transition = keys.map((key) => {
|
|
105
114
|
const propAnimation = normalized.properties[key];
|
|
106
115
|
let animationValue = null;
|
|
107
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
116
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
108
117
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
109
118
|
props,
|
|
110
119
|
animations,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKO,uCACP,mBAA0C,+BAC1C,sBAA2C,kCAE3C,aAAmC,yBACnC,eAAgC;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["React", "onFinish", "hasNormalizedAnimation"]
|
|
6
6
|
}
|
|
@@ -46,12 +46,22 @@ function _type_of(obj) {
|
|
|
46
46
|
|
|
47
47
|
return obj && typeof Symbol < "u" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
48
48
|
}
|
|
49
|
+
var EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
50
|
+
EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
49
51
|
function extractDuration(animation) {
|
|
50
|
-
var msMatch = animation.match(
|
|
52
|
+
var msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
51
53
|
if (msMatch) return Number.parseInt(msMatch[1], 10);
|
|
52
|
-
var sMatch = animation.match(
|
|
54
|
+
var sMatch = animation.match(EXTRACT_S_REGEX);
|
|
53
55
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
54
56
|
}
|
|
57
|
+
var MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
58
|
+
S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
59
|
+
function applyDurationOverride(animation, durationMs) {
|
|
60
|
+
var msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
61
|
+
if (msReplaced !== animation) return msReplaced;
|
|
62
|
+
var sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
63
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
64
|
+
}
|
|
55
65
|
function createAnimations(animations) {
|
|
56
66
|
var reactionListeners = /* @__PURE__ */new WeakMap();
|
|
57
67
|
return {
|
|
@@ -111,6 +121,7 @@ function createAnimations(animations) {
|
|
|
111
121
|
componentState,
|
|
112
122
|
stateRef
|
|
113
123
|
} = param,
|
|
124
|
+
_normalized_config,
|
|
114
125
|
isEntering = !!componentState.unmounted,
|
|
115
126
|
isExiting = presence?.[0] === !1,
|
|
116
127
|
sendExitComplete = presence?.[1],
|
|
@@ -147,11 +158,12 @@ function createAnimations(animations) {
|
|
|
147
158
|
}
|
|
148
159
|
}, [sendExitComplete, isExiting]), !(0, import_animation_helpers.hasAnimation)(normalized)) return null;
|
|
149
160
|
Array.isArray(style.transform) && (style.transform = (0, import_web.transformsToString)(style.transform));
|
|
150
|
-
var delayStr = normalized.delay ? ` ${normalized.delay}ms` : ""
|
|
161
|
+
var delayStr = normalized.delay ? ` ${normalized.delay}ms` : "",
|
|
162
|
+
durationOverride = (_normalized_config = normalized.config) === null || _normalized_config === void 0 ? void 0 : _normalized_config.duration;
|
|
151
163
|
return style.transition = keys.map(function (key) {
|
|
152
164
|
var propAnimation = normalized.properties[key],
|
|
153
165
|
animationValue = null;
|
|
154
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && (typeof propAnimation > "u" ? "undefined" : _type_of(propAnimation)) === "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
166
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && (typeof propAnimation > "u" ? "undefined" : _type_of(propAnimation)) === "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
155
167
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
156
168
|
props,
|
|
157
169
|
animations,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createAnimations_exports","__export","createAnimations","module","exports","import_animation_helpers","require","import_constants","import_use_presence","import_web","import_react","__toESM","_type_of","obj","Symbol","constructor","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","animations","reactionListeners","WeakMap","usePresence","ResetPresence","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","default","useState","onFinish","setOnFinish","useIsomorphicLayoutEffect","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","param","onValue","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","normalizeTransition","transition","animationState","effectiveAnimationKey","getEffectiveAnimation","defaultAnimation","animatedProperties","getAnimatedProperties","hasDefault","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","_normalized_delay","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","hasAnimation","Array","isArray","transform","transformsToString"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAA;EAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;IAAAC,KAAA;EAAA,IAAAH,GAAA;AAAA,IAAAI,wBAAA;AAAAC,QAAA,CAAAD,wBAAA;EAAAE,gBAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAT,YAAA,CAAAK,wBAKO;
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createAnimations_exports","__export","createAnimations","module","exports","import_animation_helpers","require","import_constants","import_use_presence","import_web","import_react","__toESM","_type_of","obj","Symbol","constructor","EXTRACT_MS_REGEX","EXTRACT_S_REGEX","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","MS_DURATION_REGEX","S_DURATION_REGEX","applyDurationOverride","durationMs","msReplaced","replace","sReplaced","animations","reactionListeners","WeakMap","usePresence","ResetPresence","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","default","useState","onFinish","setOnFinish","useIsomorphicLayoutEffect","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","param","onValue","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","_normalized_config","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","normalizeTransition","transition","animationState","effectiveAnimationKey","getEffectiveAnimation","defaultAnimation","animatedProperties","getAnimatedProperties","hasDefault","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","_normalized_delay","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","hasAnimation","Array","isArray","transform","transformsToString"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAA;EAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;IAAAC,KAAA;EAAA,IAAAH,GAAA;AAAA,IAAAI,wBAAA;AAAAC,QAAA,CAAAD,wBAAA;EAAAE,gBAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAT,YAAA,CAAAK,wBAKO;AAOP,IAAAK,wBAAyB,GAAAC,OAAA,6BACD;EAAAC,gBAAA,GAAAD,OAAA;EAAAE,mBAAA,GAAAF,OAAA;EAAAG,UAAA,GAAAH,OAAA;EAAAI,YAAA,GAAAC,OAAA,CAAAL,OAAA;AAOxB,SAASM,SAAAC,GAAA;EAEP,uBAAgB;;EAChB,OAAIA,GAAA,WAAAC,MAAA,UAAAD,GAAA,CAAAE,WAAA,KAAAD,MAAA,qBAAAD,GAAA;AACF;AAIF,IAAAG,gBAAe,yBAAgB;EAAAC,eAAe;AAC9C,SAAIC,eACUA,CAAAC,SAAM,EAAO;EAK7B,IAAAC,OAAA,GAAAD,SAAA,CAAAE,KAAA,CAAAL,gBAAA;EAEA,IAAMI,OAAA,EAON,OAASE,MAAA,CAAAC,QAAA,CAAAH,OAAsB,QAAmB;EAEhD,IAAAI,MAAM,GAAAL,SAAa,CAAAE,KAAA,CAAUJ,eAAQ;EACrC,OAAIO,MAAA,GAAAC,IAAe,CAAAC,KAAA,CAAAJ,MAAA,CAAAK,UAAA,CAAAH,MAAA;AACjB;AAIF,IAAAI,iBAAkB,yBAAkB;EAAAC,gBAAqB,oCAAc;AACvE,SAAIC,qBAAcA,CAAAX,SACT,EAAAY,UAIC;EACZ,IAAAC,UAAA,GAAAb,SAAA,CAAAc,OAAA,CAAAL,iBAAA,KAAAG,UAAA;EAEO,IAAAC,UAAS,KAAAb,SAAmC,EACjD,OAAMa,UAAA;EAEN,IAAAE,SAAO,GAAAf,SAAA,CAAAc,OAAA,CAAAJ,gBAAA,KAAAE,UAAA;EAAA,OACLG,SAAA,KAAAf,SAAA,GAAAe,SAAA,MAAAH,UAAA,MAAAZ,SAAA;AAAA;AACA,SACAjB,iBAAAiC,UAAA;EAAA,IACAC,iBAAa,sBAAAC,OAAA;EAAA,OACb;IACAF,UAAA;IACAG,WAAA,EAAA9B,mBAAoB,CAAA8B,WAAA;IAEpBC,aAAA,EAAA/B,mBAA8D,CAAA+B,aAAA;IAC5DC,WAAO,GAAK;IAGZC,UAAA;IACEC,WAAI,OACF;IACqBC,kBAIlB;IAAAC,iBACLA,CAAcC,OAAA;MACZ,KAAAC,GAAA,EAAAC,MAAO,IAAArC,YAAA,CAAAsC,OAAA,CAAAC,QAAA,CAAAJ,OAAA;QAAA,CAAAK,QAAA,EAAAC,WAAA,QAAAzC,YAAA,CAAAuC,QAAA;MAAA,OACT,IAAA1C,gBAAA,CAAA6C,yBAAA;QACAF,QAAA,KAAWA,QAAA,MAAAC,WAAA;MACT,IACFD,QAAA,EACA;QACEG,WAAOA,CAAA,EAAI;UAGX,OAAMN,MAAA;QACN;QAGFO,SAAA;UACA,OAAOR,GAAA;QAAC;QACVS,SAAAC,IAAA,EAAAC,MAAA,EAAAC,SAAA;UACFX,MAAA,CAAAS,IAAA,GAAAL,WAAA,CAAAO,SAAA;UAEA,IAAAC,SAAA,GAAAvB,iBAAqC,CAAAwB,GAAA,CAAAb,MAAS;UAC5CY,SAAA,IAAAA,SAAM,CAAAE,OAAU,WAAMC,QAAA;YACpB,OAAMA,QAAW,CAAAN,IAAM;UACvB,EAAI;QACJ;QACEO,KAAA,GACA;MACQ;IAEV;IAEEC,yBAAcA,CAAAC,KAAO,EAAAC,OAAA;MAAA,IACvB;QAAAnE;MAAA,IAAAkE,KAAA;MACFvD,YAAK,CAAAsC,OAAA,CAAAmB,SAAA;QACP,IAAAC,QAAA,GAAArE,KAAA,CAAAsD,WAAA;UAAAgB,KAAA,GAAAjC,iBAAA,CAAAwB,GAAA,CAAAQ,QAAA;QAEA,KAAAC,KAAA;UACE,IAAOb,IAAA,kBAAuB,IAAAc,GAAA;UAChClC,iBAAA,CAAAmC,GAAA,CAAAH,QAAA,EAAAZ,IAAA,GAAAa,KAAA,GAAAb,IAAA;QAEA;QACE,OAAMa,KAAA,CAAAG,GAAA,CAAaN,OAAE,eAAe;UAQpCG,KAAA,EAAAI,MAAA,CAAAP,OAAM;QACJ;MACF,CAAC;IAGD;IAyBAQ,sBAAIA,CAAA5B,GAAA,EAAA6B,QAAA;MA0DJ,OAzDIA,QAAM,CAAA7B,GAAA,CAAAQ,QAER,GAAO;IAcP;IACAsB,aAAK,WAAAA,CAAAX,KAAoB,EAAC;MAC1B;UAAAY,KAAM;UAAAC,QAYA;UAAAC,KAAA;UAAAC,cAAoB;UAAAC;QAAA,IAAAhB,KACtB;QAAAiB,kBAAgB;QAAAC,UAChB,KACEH,cAAQ,CAAAI,SAAW;QAAAC,SACnB,GAAAP,QAAA,GAAkB;QAAAQ,gBAElB,GAAAR,QAAA,GAAY;QAAAS,cAAiB,GAAA7E,YAAA,CAAAsC,OAAA,CAAAwC,MAAA,CAAAL,UAAA;QAAAM,oBAAA,GAAAF,cAAA,CAAAG,OAAA,KAAAP,UAAA;MACjCzE,YAAA,CAAAsC,OAAA,CAAAmB,SAAmB;QACrBoB,cAAG,CAAAG,OAGG,GAAAP,UAAA;MACJ;MACmB,IACrBQ,UAAA,OAAAtF,wBAAA,CAAAuF,mBAAA,EAAAf,KAAA,CAAAgB,UAAA;QAAAC,cAAA,GAAAT,SAAA,YAAAF,UAAA,IAAAM,oBAAA;QAAAM,qBAAA,OAAA1F,wBAAA,CAAA2F,qBAAA,EAAAL,UAAA,EAAAG,cAAA;QAAAG,gBAAA,GAAAF,qBAAA,GAAA5D,UAAA,CAAA4D,qBAAA;QAAAG,kBAAA,OAAA7F,wBAAA,CAAA8F,qBAAA,EAAAR,UAAA;QAAAS,UAAA,GAAAT,UAAA,CAAA3C,OAAA,aAAA2C,UAAA,CAAAU,KAAA,aAAAV,UAAA,CAAAW,IAAA;QAAAC,qBAAA,GAAAL,kBAAA,CAAAM,MAAA;QAAAC,IAAA;MAEA,IAAA5B,KAAA,CAAA6B,WAAK,GAAAD,IAAA,GAAiB5B,KAAA,CAAA6B,WAAiB,GAAAH,qBACvC,IAAK,CAAAH,UAAA,GAAiBK,IAAA,GAAAP,kBAAoB,GAAAK,qBAE7B,IAAAH,UAAA,GAAAK,IAAA,IACX,OAGF,GAAAP,kBAAA,CACF,GAAIO,IAAA,IAIF,MAGE,MAAMlG,gBAAc,CAAA6C,yBAChB,cAAY;QAMpB,IAAMuD,IAAA,GAAA1B,QAAW,CAAAS,OAAW,CAAAiB,IAAA;QAE5B,OAAArB,gBAAM,IAAa,CAAAD,SACX,KAAQsB,IAAA;UAEZ,IAAMC,IAAA,GAAAD,IAAA;YAAAE,iBAA2B,GAAAZ,gBAAc,GAAA/E,eAAA,CAAA+E,gBAAA;YAAAa,iBAAA;YAAAC,KAAA,IAAAD,iBAAA,GAAAnB,UAAA,CAAAoB,KAAA,cAAAD,iBAAA,cAAAA,iBAAA;YAAAE,eAAA,GAAAH,iBAAA,GAAAE,KAAA;YAAAE,SAAA,GAAAC,UAAA;cAC3C5B,gBAAA,GAAgC;YAEpC,GAAA0B,eAAW;YAAAG,iBAAkB,GAC3B,SAAAA,CAAA;cAkBHC,YAAc,CACdH,SAAS,GAER3B,gBAAY;YAEZ;UACA,OAAAsB,IAAA,CAAAS,gBAAA,kBAAAF,iBAAA,GAAAP,IAAA,CAAAS,gBAAA,qBAAAF,iBAAA;YACAC,YAAA,CAAAH,SAAA,GAAAL,IAAA,CAAAU,mBAAA,kBAAAH,iBAAA,GAAAP,IAAA,CAAAU,mBAAA,qBAAAH,iBAAA;UACA;QACA;MAAA,GACA,CACA7B,gBAAA,EACDD,SAGM,CACX,QAAAhF,wBAAA,CAAAkH,YAAA,EAAA5B,UAAA,GACF;MACF6B,KAAA,CAAAC,OAAA,CAAA1C,KAAA,CAAA2C,SAAA,MAAA3C,KAAA,CAAA2C,SAAA,OAAAjH,UAAA,CAAAkH,kBAAA,EAAA5C,KAAA,CAAA2C,SAAA","ignoreList":[]}
|
|
@@ -8,13 +8,22 @@ import { useIsomorphicLayoutEffect } from "@tamagui/constants";
|
|
|
8
8
|
import { ResetPresence, usePresence } from "@tamagui/use-presence";
|
|
9
9
|
import { transformsToString } from "@tamagui/web";
|
|
10
10
|
import React, { useState } from "react";
|
|
11
|
+
const EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/, EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
11
12
|
function extractDuration(animation) {
|
|
12
|
-
const msMatch = animation.match(
|
|
13
|
+
const msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
13
14
|
if (msMatch)
|
|
14
15
|
return Number.parseInt(msMatch[1], 10);
|
|
15
|
-
const sMatch = animation.match(
|
|
16
|
+
const sMatch = animation.match(EXTRACT_S_REGEX);
|
|
16
17
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
17
18
|
}
|
|
19
|
+
const MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/, S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
20
|
+
function applyDurationOverride(animation, durationMs) {
|
|
21
|
+
const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
22
|
+
if (msReplaced !== animation)
|
|
23
|
+
return msReplaced;
|
|
24
|
+
const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
25
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
26
|
+
}
|
|
18
27
|
function createAnimations(animations) {
|
|
19
28
|
const reactionListeners = /* @__PURE__ */ new WeakMap();
|
|
20
29
|
return {
|
|
@@ -82,11 +91,11 @@ function createAnimations(animations) {
|
|
|
82
91
|
}, [sendExitComplete, isExiting]), !hasNormalizedAnimation(normalized))
|
|
83
92
|
return null;
|
|
84
93
|
Array.isArray(style.transform) && (style.transform = transformsToString(style.transform));
|
|
85
|
-
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "";
|
|
94
|
+
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "", durationOverride = normalized.config?.duration;
|
|
86
95
|
return style.transition = keys.map((key) => {
|
|
87
96
|
const propAnimation = normalized.properties[key];
|
|
88
97
|
let animationValue = null;
|
|
89
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
98
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
90
99
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
91
100
|
props,
|
|
92
101
|
animations,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C,SAAS,eAAe,mBAAmB;AAE3C,SAAS,0BAA0B;AACnC,OAAO,SAAS,gBAAgB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["onFinish"]
|
|
6
6
|
}
|
|
@@ -3,12 +3,22 @@ import { useIsomorphicLayoutEffect } from "@tamagui/constants";
|
|
|
3
3
|
import { ResetPresence, usePresence } from "@tamagui/use-presence";
|
|
4
4
|
import { transformsToString } from "@tamagui/web";
|
|
5
5
|
import React, { useState } from "react";
|
|
6
|
+
const EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
7
|
+
EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
6
8
|
function extractDuration(animation) {
|
|
7
|
-
const msMatch = animation.match(
|
|
9
|
+
const msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
8
10
|
if (msMatch) return Number.parseInt(msMatch[1], 10);
|
|
9
|
-
const sMatch = animation.match(
|
|
11
|
+
const sMatch = animation.match(EXTRACT_S_REGEX);
|
|
10
12
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
11
13
|
}
|
|
14
|
+
const MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
15
|
+
S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
16
|
+
function applyDurationOverride(animation, durationMs) {
|
|
17
|
+
const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
18
|
+
if (msReplaced !== animation) return msReplaced;
|
|
19
|
+
const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
20
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
21
|
+
}
|
|
12
22
|
function createAnimations(animations) {
|
|
13
23
|
const reactionListeners = /* @__PURE__ */new WeakMap();
|
|
14
24
|
return {
|
|
@@ -97,11 +107,12 @@ function createAnimations(animations) {
|
|
|
97
107
|
};
|
|
98
108
|
}, [sendExitComplete, isExiting]), !hasNormalizedAnimation(normalized)) return null;
|
|
99
109
|
Array.isArray(style.transform) && (style.transform = transformsToString(style.transform));
|
|
100
|
-
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : ""
|
|
110
|
+
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : "",
|
|
111
|
+
durationOverride = normalized.config?.duration;
|
|
101
112
|
return style.transition = keys.map(key => {
|
|
102
113
|
const propAnimation = normalized.properties[key];
|
|
103
114
|
let animationValue = null;
|
|
104
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
115
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && typeof propAnimation == "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
105
116
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
106
117
|
props,
|
|
107
118
|
animations,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["normalizeTransition","getAnimatedProperties","hasAnimation","hasNormalizedAnimation","getEffectiveAnimation","useIsomorphicLayoutEffect","ResetPresence","usePresence","transformsToString","React","useState","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","createAnimations","animations","reactionListeners","WeakMap","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","onFinish","setOnFinish","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","value","onValue","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","transition","effectiveAnimationKey","defaultAnimation","animatedProperties","hasDefault","default","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","Array","isArray","transform","delayStr","map","key","propAnimation","properties","animationValue","type","filter","Boolean","join","process","env","NODE_ENV","debug","console","info","className"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":"AAAA,SACEA,mBAAA,EACAC,qBAAA,EACAC,YAAA,IAAgBC,sBAAA,EAChBC,qBAAA,QACK;AACP,SAASC,yBAAA,QAAiC;AAC1C,SAASC,aAAA,EAAeC,WAAA,QAAmB;AAE3C,SAASC,kBAAA,QAA0B;AACnC,OAAOC,KAAA,IAASC,QAAA,QAAgB;
|
|
1
|
+
{"version":3,"names":["normalizeTransition","getAnimatedProperties","hasAnimation","hasNormalizedAnimation","getEffectiveAnimation","useIsomorphicLayoutEffect","ResetPresence","usePresence","transformsToString","React","useState","EXTRACT_MS_REGEX","EXTRACT_S_REGEX","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","MS_DURATION_REGEX","S_DURATION_REGEX","applyDurationOverride","durationMs","msReplaced","replace","sReplaced","createAnimations","animations","reactionListeners","WeakMap","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","onFinish","setOnFinish","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","value","onValue","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","transition","effectiveAnimationKey","defaultAnimation","animatedProperties","hasDefault","default","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","Array","isArray","transform","delayStr","durationOverride","duration","map","key","propAnimation","properties","animationValue","type","filter","Boolean","join","process","env","NODE_ENV","debug","console","info","className"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -8,12 +8,22 @@ function _type_of(obj) {
|
|
|
8
8
|
|
|
9
9
|
return obj && typeof Symbol < "u" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
10
10
|
}
|
|
11
|
+
var EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
12
|
+
EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/;
|
|
11
13
|
function extractDuration(animation) {
|
|
12
|
-
var msMatch = animation.match(
|
|
14
|
+
var msMatch = animation.match(EXTRACT_MS_REGEX);
|
|
13
15
|
if (msMatch) return Number.parseInt(msMatch[1], 10);
|
|
14
|
-
var sMatch = animation.match(
|
|
16
|
+
var sMatch = animation.match(EXTRACT_S_REGEX);
|
|
15
17
|
return sMatch ? Math.round(Number.parseFloat(sMatch[1]) * 1e3) : 300;
|
|
16
18
|
}
|
|
19
|
+
var MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/,
|
|
20
|
+
S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/;
|
|
21
|
+
function applyDurationOverride(animation, durationMs) {
|
|
22
|
+
var msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`);
|
|
23
|
+
if (msReplaced !== animation) return msReplaced;
|
|
24
|
+
var sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`);
|
|
25
|
+
return sReplaced !== animation ? sReplaced : `${durationMs}ms ${animation}`;
|
|
26
|
+
}
|
|
17
27
|
function createAnimations(animations) {
|
|
18
28
|
var reactionListeners = /* @__PURE__ */new WeakMap();
|
|
19
29
|
return {
|
|
@@ -73,6 +83,7 @@ function createAnimations(animations) {
|
|
|
73
83
|
componentState,
|
|
74
84
|
stateRef
|
|
75
85
|
} = param,
|
|
86
|
+
_normalized_config,
|
|
76
87
|
isEntering = !!componentState.unmounted,
|
|
77
88
|
isExiting = presence?.[0] === !1,
|
|
78
89
|
sendExitComplete = presence?.[1],
|
|
@@ -109,11 +120,12 @@ function createAnimations(animations) {
|
|
|
109
120
|
}
|
|
110
121
|
}, [sendExitComplete, isExiting]), !hasNormalizedAnimation(normalized)) return null;
|
|
111
122
|
Array.isArray(style.transform) && (style.transform = transformsToString(style.transform));
|
|
112
|
-
var delayStr = normalized.delay ? ` ${normalized.delay}ms` : ""
|
|
123
|
+
var delayStr = normalized.delay ? ` ${normalized.delay}ms` : "",
|
|
124
|
+
durationOverride = (_normalized_config = normalized.config) === null || _normalized_config === void 0 ? void 0 : _normalized_config.duration;
|
|
113
125
|
return style.transition = keys.map(function (key) {
|
|
114
126
|
var propAnimation = normalized.properties[key],
|
|
115
127
|
animationValue = null;
|
|
116
|
-
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && (typeof propAnimation > "u" ? "undefined" : _type_of(propAnimation)) === "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
128
|
+
return typeof propAnimation == "string" ? animationValue = animations[propAnimation] : propAnimation && (typeof propAnimation > "u" ? "undefined" : _type_of(propAnimation)) === "object" && propAnimation.type ? animationValue = animations[propAnimation.type] : defaultAnimation && (animationValue = defaultAnimation), animationValue && durationOverride && (animationValue = applyDurationOverride(animationValue, durationOverride)), animationValue ? `${key} ${animationValue}${delayStr}` : null;
|
|
117
129
|
}).filter(Boolean).join(", "), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("CSS animation", {
|
|
118
130
|
props,
|
|
119
131
|
animations,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["normalizeTransition","getAnimatedProperties","hasAnimation","hasNormalizedAnimation","getEffectiveAnimation","useIsomorphicLayoutEffect","ResetPresence","usePresence","transformsToString","React","useState","_type_of","obj","Symbol","constructor","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","createAnimations","animations","reactionListeners","WeakMap","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","onFinish","setOnFinish","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","param","onValue","value","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","transition","animationState","effectiveAnimationKey","defaultAnimation","animatedProperties","hasDefault","default","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","_normalized_delay","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","Array","isArray","transform","delayStr","map","key","propAnimation","properties","animationValue","type","filter","Boolean","join","process","env","NODE_ENV","debug","console","info"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAAA,mBAAA,EAAAC,qBAAA,EAAAC,YAAA,IAAAC,sBAAA,EAAAC,qBAAA;AAAA,SACEC,yBAAA;AAAA,SACAC,aAAA,EAAAC,WAAA;AAAA,SACAC,kBAAgB;AAAA,OAChBC,KAAA,IAAAC,QAAA;AAAA,SACKC,SAAAC,GAAA;EACP,uBAAS;;EACT,OAASA,GAAA,WAAAC,MAAe,UAAAD,GAAA,CAAmBE,WAAA,KAAAD,MAAA,qBAAAD,GAAA;AAE3C;AACA,
|
|
1
|
+
{"version":3,"names":["normalizeTransition","getAnimatedProperties","hasAnimation","hasNormalizedAnimation","getEffectiveAnimation","useIsomorphicLayoutEffect","ResetPresence","usePresence","transformsToString","React","useState","_type_of","obj","Symbol","constructor","EXTRACT_MS_REGEX","EXTRACT_S_REGEX","extractDuration","animation","msMatch","match","Number","parseInt","sMatch","Math","round","parseFloat","MS_DURATION_REGEX","S_DURATION_REGEX","applyDurationOverride","durationMs","msReplaced","replace","sReplaced","createAnimations","animations","reactionListeners","WeakMap","supportsCSS","inputStyle","outputStyle","classNameAnimation","useAnimatedNumber","initial","val","setVal","onFinish","setOnFinish","getInstance","getValue","setValue","next","config","onFinish2","listeners","get","forEach","listener","stop","useAnimatedNumberReaction","param","onValue","value","useEffect","instance","queue","Set","set","add","delete","useAnimatedNumberStyle","getStyle","useAnimations","props","presence","style","componentState","stateRef","_normalized_config","isEntering","unmounted","isExiting","sendExitComplete","wasEnteringRef","useRef","justFinishedEntering","current","normalized","transition","animationState","effectiveAnimationKey","defaultAnimation","animatedProperties","hasDefault","default","enter","exit","hasPerPropertyConfigs","length","keys","animateOnly","host","node","animationDuration","_normalized_delay","delay","fallbackTimeout","timeoutId","setTimeout","onFinishAnimation","clearTimeout","addEventListener","removeEventListener","Array","isArray","transform","delayStr","durationOverride","duration","map","key","propAnimation","properties","animationValue","type","filter","Boolean","join","process","env","NODE_ENV","debug","console","info"],"sources":["../../src/createAnimations.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/animations-css",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.6",
|
|
4
4
|
"gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
"clean:build": "tamagui-build clean:build"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@tamagui/animation-helpers": "2.0.0-rc.
|
|
43
|
-
"@tamagui/constants": "2.0.0-rc.
|
|
44
|
-
"@tamagui/cubic-bezier-animator": "2.0.0-rc.
|
|
45
|
-
"@tamagui/use-presence": "2.0.0-rc.
|
|
46
|
-
"@tamagui/web": "2.0.0-rc.
|
|
42
|
+
"@tamagui/animation-helpers": "2.0.0-rc.6",
|
|
43
|
+
"@tamagui/constants": "2.0.0-rc.6",
|
|
44
|
+
"@tamagui/cubic-bezier-animator": "2.0.0-rc.6",
|
|
45
|
+
"@tamagui/use-presence": "2.0.0-rc.6",
|
|
46
|
+
"@tamagui/web": "2.0.0-rc.6"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@tamagui/build": "2.0.0-rc.
|
|
49
|
+
"@tamagui/build": "2.0.0-rc.6",
|
|
50
50
|
"react": ">=19",
|
|
51
51
|
"react-dom": "*"
|
|
52
52
|
},
|
package/src/createAnimations.tsx
CHANGED
|
@@ -10,6 +10,9 @@ import type { AnimationDriver, UniversalAnimatedNumber } from '@tamagui/web'
|
|
|
10
10
|
import { transformsToString } from '@tamagui/web'
|
|
11
11
|
import React, { useState } from 'react' // import { animate } from '@tamagui/cubic-bezier-animator'
|
|
12
12
|
|
|
13
|
+
const EXTRACT_MS_REGEX = /(\d+(?:\.\d+)?)\s*ms/
|
|
14
|
+
const EXTRACT_S_REGEX = /(\d+(?:\.\d+)?)\s*s/
|
|
15
|
+
|
|
13
16
|
/**
|
|
14
17
|
* Helper function to extract duration from CSS animation string
|
|
15
18
|
* Examples: "ease-in 200ms" -> 200, "cubic-bezier(0.215, 0.610, 0.355, 1.000) 400ms" -> 400
|
|
@@ -17,13 +20,13 @@ import React, { useState } from 'react' // import { animate } from '@tamagui/cub
|
|
|
17
20
|
*/
|
|
18
21
|
function extractDuration(animation: string): number {
|
|
19
22
|
// Try to match milliseconds first
|
|
20
|
-
const msMatch = animation.match(
|
|
23
|
+
const msMatch = animation.match(EXTRACT_MS_REGEX)
|
|
21
24
|
if (msMatch) {
|
|
22
25
|
return Number.parseInt(msMatch[1], 10)
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
// Try to match seconds and convert to milliseconds
|
|
26
|
-
const sMatch = animation.match(
|
|
29
|
+
const sMatch = animation.match(EXTRACT_S_REGEX)
|
|
27
30
|
if (sMatch) {
|
|
28
31
|
return Math.round(Number.parseFloat(sMatch[1]) * 1000)
|
|
29
32
|
}
|
|
@@ -32,6 +35,30 @@ function extractDuration(animation: string): number {
|
|
|
32
35
|
return 300
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
const MS_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*ms/
|
|
39
|
+
const S_DURATION_REGEX = /(\d+(?:\.\d+)?)\s*s(?!tiffness)/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Apply duration override to a CSS animation string
|
|
43
|
+
* Replaces the existing duration with the override value
|
|
44
|
+
*/
|
|
45
|
+
function applyDurationOverride(animation: string, durationMs: number): string {
|
|
46
|
+
// Replace ms duration
|
|
47
|
+
const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`)
|
|
48
|
+
if (msReplaced !== animation) {
|
|
49
|
+
return msReplaced
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Replace seconds duration
|
|
53
|
+
const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`)
|
|
54
|
+
if (sReplaced !== animation) {
|
|
55
|
+
return sReplaced
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// No duration found, prepend the duration
|
|
59
|
+
return `${durationMs}ms ${animation}`
|
|
60
|
+
}
|
|
61
|
+
|
|
35
62
|
export function createAnimations<A extends object>(animations: A): AnimationDriver<A> {
|
|
36
63
|
const reactionListeners = new WeakMap<any, Set<Function>>()
|
|
37
64
|
|
|
@@ -204,6 +231,7 @@ export function createAnimations<A extends object>(animations: A): AnimationDriv
|
|
|
204
231
|
// TODO: we disabled the transform transition, because it will create issue for inverse function and animate function
|
|
205
232
|
// for non layout transform properties either use animate function or find a workaround to do it with css
|
|
206
233
|
const delayStr = normalized.delay ? ` ${normalized.delay}ms` : ''
|
|
234
|
+
const durationOverride = normalized.config?.duration
|
|
207
235
|
style.transition = keys
|
|
208
236
|
.map((key) => {
|
|
209
237
|
// Check for property-specific animation, fall back to default
|
|
@@ -222,6 +250,11 @@ export function createAnimations<A extends object>(animations: A): AnimationDriv
|
|
|
222
250
|
animationValue = defaultAnimation
|
|
223
251
|
}
|
|
224
252
|
|
|
253
|
+
// Apply global duration override if specified
|
|
254
|
+
if (animationValue && durationOverride) {
|
|
255
|
+
animationValue = applyDurationOverride(animationValue, durationOverride)
|
|
256
|
+
}
|
|
257
|
+
|
|
225
258
|
return animationValue ? `${key} ${animationValue}${delayStr}` : null
|
|
226
259
|
})
|
|
227
260
|
.filter(Boolean)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"mappings": "AAQA,cAAc,uBAAgD;
|
|
2
|
+
"mappings": "AAQA,cAAc,uBAAgD;AAqD9D,OAAO,iBAAS,iBAAiB,kBAAkB,YAAY,IAAI,gBAAgB",
|
|
3
3
|
"names": [],
|
|
4
4
|
"sources": [
|
|
5
5
|
"src/createAnimations.tsx"
|
|
6
6
|
],
|
|
7
7
|
"sourcesContent": [
|
|
8
|
-
"import {\n normalizeTransition,\n getAnimatedProperties,\n hasAnimation as hasNormalizedAnimation,\n getEffectiveAnimation,\n} from '@tamagui/animation-helpers'\nimport { useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { ResetPresence, usePresence } from '@tamagui/use-presence'\nimport type { AnimationDriver, UniversalAnimatedNumber } from '@tamagui/web'\nimport { transformsToString } from '@tamagui/web'\nimport React, { useState } from 'react' // import { animate } from '@tamagui/cubic-bezier-animator'\n\n/**\n * Helper function to extract duration from CSS animation string\n * Examples: \"ease-in 200ms\" -> 200, \"cubic-bezier(0.215, 0.610, 0.355, 1.000) 400ms\" -> 400\n * \"ease-in 0.5s\" -> 500, \"slow 2s\" -> 2000\n */\nfunction extractDuration(animation: string): number {\n // Try to match milliseconds first\n const msMatch = animation.match(/(\\d+(?:\\.\\d+)?)\\s*ms/)\n if (msMatch) {\n return Number.parseInt(msMatch[1], 10)\n }\n\n // Try to match seconds and convert to milliseconds\n const sMatch = animation.match(/(\\d+(?:\\.\\d+)?)\\s*s/)\n if (sMatch) {\n return Math.round(Number.parseFloat(sMatch[1]) * 1000)\n }\n\n // Default to 300ms if no duration found\n return 300\n}\n\nexport function createAnimations<A extends object>(animations: A): AnimationDriver<A> {\n const reactionListeners = new WeakMap<any, Set<Function>>()\n\n return {\n animations,\n usePresence,\n ResetPresence,\n supportsCSS: true,\n inputStyle: 'css',\n outputStyle: 'css',\n classNameAnimation: true,\n\n useAnimatedNumber(initial): UniversalAnimatedNumber<Function> {\n const [val, setVal] = React.useState(initial)\n const [onFinish, setOnFinish] = useState<Function | undefined>()\n\n useIsomorphicLayoutEffect(() => {\n if (onFinish) {\n onFinish?.()\n setOnFinish(undefined)\n }\n }, [onFinish])\n\n return {\n getInstance() {\n return setVal\n },\n getValue() {\n return val\n },\n setValue(next, config, onFinish) {\n setVal(next)\n setOnFinish(onFinish)\n // call reaction listeners with the new value\n const listeners = reactionListeners.get(setVal)\n if (listeners) {\n listeners.forEach((listener) => listener(next))\n }\n },\n stop() {},\n }\n },\n\n useAnimatedNumberReaction({ value }, onValue) {\n React.useEffect(() => {\n const instance = value.getInstance()\n let queue = reactionListeners.get(instance)\n if (!queue) {\n const next = new Set<Function>()\n reactionListeners.set(instance, next)\n queue = next!\n }\n queue.add(onValue)\n return () => {\n queue?.delete(onValue)\n }\n }, [])\n },\n\n useAnimatedNumberStyle(val, getStyle) {\n return getStyle(val.getValue())\n },\n\n useAnimations: ({ props, presence, style, componentState, stateRef }) => {\n const isEntering = !!componentState.unmounted\n const isExiting = presence?.[0] === false\n const sendExitComplete = presence?.[1]\n\n // Track if we just finished entering (transition from entering to not entering)\n // This is needed because the CSS transition happens on the render AFTER t_unmounted is removed\n const wasEnteringRef = React.useRef(isEntering)\n const justFinishedEntering = wasEnteringRef.current && !isEntering\n React.useEffect(() => {\n wasEnteringRef.current = isEntering\n })\n\n // Normalize the transition prop to a consistent format\n const normalized = normalizeTransition(props.transition)\n\n // Determine animation state and get effective animation\n // Use 'enter' if we're entering OR if we just finished entering (transition is happening)\n const animationState = isExiting\n ? 'exit'\n : isEntering || justFinishedEntering\n ? 'enter'\n : 'default'\n const effectiveAnimationKey = getEffectiveAnimation(normalized, animationState)\n const defaultAnimation = effectiveAnimationKey\n ? animations[effectiveAnimationKey]\n : null\n const animatedProperties = getAnimatedProperties(normalized)\n\n // Determine which properties to animate\n // - animateOnly prop is an exclusive filter (only animate those properties)\n // - per-property configs WITHOUT a default = only animate those specific properties\n // - per-property configs WITH a default = per-property overrides + default for rest\n const hasDefault =\n normalized.default !== null ||\n normalized.enter !== null ||\n normalized.exit !== null\n const hasPerPropertyConfigs = animatedProperties.length > 0\n\n let keys: string[]\n if (props.animateOnly) {\n // animateOnly is explicit filter\n keys = props.animateOnly\n } else if (hasPerPropertyConfigs && !hasDefault) {\n // object format without default: { opacity: '200ms' } = only animate opacity\n keys = animatedProperties\n } else if (hasPerPropertyConfigs && hasDefault) {\n // array format or object with default: 'all' first, then per-property overrides\n // CSS transition specificity: later declarations override earlier ones for the same property\n keys = ['all', ...animatedProperties]\n } else {\n // simple string format: 'quick' = animate all\n keys = ['all']\n }\n\n useIsomorphicLayoutEffect(() => {\n const host = stateRef.current.host\n if (!sendExitComplete || !isExiting || !host) return\n const node = host as HTMLElement\n\n /**\n * Exit animation handling for Dialog/Modal components\n *\n * The Challenge: When users close dialogs (via Escape key or clicking outside),\n * the element can disappear from the DOM before CSS transitions finish, which causes:\n * 1. Dialogs to stick around on screen\n * 2. Event handlers to stop working\n */\n\n // Use timeout as primary, transition events as backup for reliable exit handling\n const animationDuration = defaultAnimation\n ? extractDuration(defaultAnimation)\n : 200\n const delay = normalized.delay ?? 0\n const fallbackTimeout = animationDuration + delay\n\n const timeoutId = setTimeout(() => {\n sendExitComplete?.()\n }, fallbackTimeout)\n\n // Listen for transition completion events as backup\n const onFinishAnimation = () => {\n clearTimeout(timeoutId)\n sendExitComplete?.()\n }\n\n node.addEventListener('transitionend', onFinishAnimation)\n node.addEventListener('transitioncancel', onFinishAnimation)\n\n return () => {\n clearTimeout(timeoutId)\n node.removeEventListener('transitionend', onFinishAnimation)\n node.removeEventListener('transitioncancel', onFinishAnimation)\n }\n }, [sendExitComplete, isExiting])\n\n // Check if we have any animation to apply\n if (!hasNormalizedAnimation(normalized)) {\n return null\n }\n\n if (Array.isArray(style.transform)) {\n style.transform = transformsToString(style.transform)\n }\n\n // Build CSS transition string\n // TODO: we disabled the transform transition, because it will create issue for inverse function and animate function\n // for non layout transform properties either use animate function or find a workaround to do it with css\n const delayStr = normalized.delay ? ` ${normalized.delay}ms` : ''\n style.transition = keys\n .map((key) => {\n // Check for property-specific animation, fall back to default\n const propAnimation = normalized.properties[key]\n let animationValue: string | null = null\n\n if (typeof propAnimation === 'string') {\n animationValue = animations[propAnimation]\n } else if (\n propAnimation &&\n typeof propAnimation === 'object' &&\n propAnimation.type\n ) {\n animationValue = animations[propAnimation.type]\n } else if (defaultAnimation) {\n animationValue = defaultAnimation\n }\n\n return animationValue ? `${key} ${animationValue}${delayStr}` : null\n })\n .filter(Boolean)\n .join(', ')\n\n if (process.env.NODE_ENV === 'development' && props['debug'] === 'verbose') {\n console.info('CSS animation', {\n props,\n animations,\n normalized,\n defaultAnimation,\n style,\n isEntering,\n isExiting,\n })\n }\n\n return { style, className: isEntering ? 't_unmounted' : '' }\n },\n }\n}\n\n// layout animations\n// useIsomorphicLayoutEffect(() => {\n// if (!host || !props.layout) {\n// return\n// }\n// // @ts-ignore\n// const boundingBox = host?.getBoundingClientRect()\n// if (isChanged(initialPositionRef.current, boundingBox)) {\n// const transform = invert(\n// host,\n// boundingBox,\n// initialPositionRef.current\n// )\n\n// animate({\n// from: transform,\n// to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },\n// duration: 1000,\n// onUpdate: ({ x, y, scaleX, scaleY }) => {\n// // @ts-ignore\n// host.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`\n// // TODO: handle childRef inverse scale\n// // childRef.current.style.transform = `scaleX(${1 / scaleX}) scaleY(${\n// // 1 / scaleY\n// // })`\n// },\n// // TODO: extract ease-in from string and convert/map it to a cubicBezier array\n// cubicBezier: [0, 1.38, 1, -0.41],\n// })\n// }\n// initialPositionRef.current = boundingBox\n// })\n\n// style.transition = `${keys} ${animation}${\n// props.layout ? ',width 0s, height 0s, margin 0s, padding 0s, transform' : ''\n// }`\n\n// const isChanged = (initialBox: any, finalBox: any) => {\n// // we just mounted, so we don't have complete data yet\n// if (!initialBox || !finalBox) return false\n\n// // deep compare the two boxes\n// return JSON.stringify(initialBox) !== JSON.stringify(finalBox)\n// }\n\n// const invert = (el, from, to) => {\n// const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from\n// const { x, y, width, height } = to\n\n// const transform = {\n// x: x - fromX - (fromWidth - width) / 2,\n// y: y - fromY - (fromHeight - height) / 2,\n// scaleX: width / fromWidth,\n// scaleY: height / fromHeight,\n// }\n\n// el.style.transform = `\n"
|
|
8
|
+
"import {\n normalizeTransition,\n getAnimatedProperties,\n hasAnimation as hasNormalizedAnimation,\n getEffectiveAnimation,\n} from '@tamagui/animation-helpers'\nimport { useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { ResetPresence, usePresence } from '@tamagui/use-presence'\nimport type { AnimationDriver, UniversalAnimatedNumber } from '@tamagui/web'\nimport { transformsToString } from '@tamagui/web'\nimport React, { useState } from 'react' // import { animate } from '@tamagui/cubic-bezier-animator'\n\nconst EXTRACT_MS_REGEX = /(\\d+(?:\\.\\d+)?)\\s*ms/\nconst EXTRACT_S_REGEX = /(\\d+(?:\\.\\d+)?)\\s*s/\n\n/**\n * Helper function to extract duration from CSS animation string\n * Examples: \"ease-in 200ms\" -> 200, \"cubic-bezier(0.215, 0.610, 0.355, 1.000) 400ms\" -> 400\n * \"ease-in 0.5s\" -> 500, \"slow 2s\" -> 2000\n */\nfunction extractDuration(animation: string): number {\n // Try to match milliseconds first\n const msMatch = animation.match(EXTRACT_MS_REGEX)\n if (msMatch) {\n return Number.parseInt(msMatch[1], 10)\n }\n\n // Try to match seconds and convert to milliseconds\n const sMatch = animation.match(EXTRACT_S_REGEX)\n if (sMatch) {\n return Math.round(Number.parseFloat(sMatch[1]) * 1000)\n }\n\n // Default to 300ms if no duration found\n return 300\n}\n\nconst MS_DURATION_REGEX = /(\\d+(?:\\.\\d+)?)\\s*ms/\nconst S_DURATION_REGEX = /(\\d+(?:\\.\\d+)?)\\s*s(?!tiffness)/\n\n/**\n * Apply duration override to a CSS animation string\n * Replaces the existing duration with the override value\n */\nfunction applyDurationOverride(animation: string, durationMs: number): string {\n // Replace ms duration\n const msReplaced = animation.replace(MS_DURATION_REGEX, `${durationMs}ms`)\n if (msReplaced !== animation) {\n return msReplaced\n }\n\n // Replace seconds duration\n const sReplaced = animation.replace(S_DURATION_REGEX, `${durationMs}ms`)\n if (sReplaced !== animation) {\n return sReplaced\n }\n\n // No duration found, prepend the duration\n return `${durationMs}ms ${animation}`\n}\n\nexport function createAnimations<A extends object>(animations: A): AnimationDriver<A> {\n const reactionListeners = new WeakMap<any, Set<Function>>()\n\n return {\n animations,\n usePresence,\n ResetPresence,\n supportsCSS: true,\n inputStyle: 'css',\n outputStyle: 'css',\n classNameAnimation: true,\n\n useAnimatedNumber(initial): UniversalAnimatedNumber<Function> {\n const [val, setVal] = React.useState(initial)\n const [onFinish, setOnFinish] = useState<Function | undefined>()\n\n useIsomorphicLayoutEffect(() => {\n if (onFinish) {\n onFinish?.()\n setOnFinish(undefined)\n }\n }, [onFinish])\n\n return {\n getInstance() {\n return setVal\n },\n getValue() {\n return val\n },\n setValue(next, config, onFinish) {\n setVal(next)\n setOnFinish(onFinish)\n // call reaction listeners with the new value\n const listeners = reactionListeners.get(setVal)\n if (listeners) {\n listeners.forEach((listener) => listener(next))\n }\n },\n stop() {},\n }\n },\n\n useAnimatedNumberReaction({ value }, onValue) {\n React.useEffect(() => {\n const instance = value.getInstance()\n let queue = reactionListeners.get(instance)\n if (!queue) {\n const next = new Set<Function>()\n reactionListeners.set(instance, next)\n queue = next!\n }\n queue.add(onValue)\n return () => {\n queue?.delete(onValue)\n }\n }, [])\n },\n\n useAnimatedNumberStyle(val, getStyle) {\n return getStyle(val.getValue())\n },\n\n useAnimations: ({ props, presence, style, componentState, stateRef }) => {\n const isEntering = !!componentState.unmounted\n const isExiting = presence?.[0] === false\n const sendExitComplete = presence?.[1]\n\n // Track if we just finished entering (transition from entering to not entering)\n // This is needed because the CSS transition happens on the render AFTER t_unmounted is removed\n const wasEnteringRef = React.useRef(isEntering)\n const justFinishedEntering = wasEnteringRef.current && !isEntering\n React.useEffect(() => {\n wasEnteringRef.current = isEntering\n })\n\n // Normalize the transition prop to a consistent format\n const normalized = normalizeTransition(props.transition)\n\n // Determine animation state and get effective animation\n // Use 'enter' if we're entering OR if we just finished entering (transition is happening)\n const animationState = isExiting\n ? 'exit'\n : isEntering || justFinishedEntering\n ? 'enter'\n : 'default'\n const effectiveAnimationKey = getEffectiveAnimation(normalized, animationState)\n const defaultAnimation = effectiveAnimationKey\n ? animations[effectiveAnimationKey]\n : null\n const animatedProperties = getAnimatedProperties(normalized)\n\n // Determine which properties to animate\n // - animateOnly prop is an exclusive filter (only animate those properties)\n // - per-property configs WITHOUT a default = only animate those specific properties\n // - per-property configs WITH a default = per-property overrides + default for rest\n const hasDefault =\n normalized.default !== null ||\n normalized.enter !== null ||\n normalized.exit !== null\n const hasPerPropertyConfigs = animatedProperties.length > 0\n\n let keys: string[]\n if (props.animateOnly) {\n // animateOnly is explicit filter\n keys = props.animateOnly\n } else if (hasPerPropertyConfigs && !hasDefault) {\n // object format without default: { opacity: '200ms' } = only animate opacity\n keys = animatedProperties\n } else if (hasPerPropertyConfigs && hasDefault) {\n // array format or object with default: 'all' first, then per-property overrides\n // CSS transition specificity: later declarations override earlier ones for the same property\n keys = ['all', ...animatedProperties]\n } else {\n // simple string format: 'quick' = animate all\n keys = ['all']\n }\n\n useIsomorphicLayoutEffect(() => {\n const host = stateRef.current.host\n if (!sendExitComplete || !isExiting || !host) return\n const node = host as HTMLElement\n\n /**\n * Exit animation handling for Dialog/Modal components\n *\n * The Challenge: When users close dialogs (via Escape key or clicking outside),\n * the element can disappear from the DOM before CSS transitions finish, which causes:\n * 1. Dialogs to stick around on screen\n * 2. Event handlers to stop working\n */\n\n // Use timeout as primary, transition events as backup for reliable exit handling\n const animationDuration = defaultAnimation\n ? extractDuration(defaultAnimation)\n : 200\n const delay = normalized.delay ?? 0\n const fallbackTimeout = animationDuration + delay\n\n const timeoutId = setTimeout(() => {\n sendExitComplete?.()\n }, fallbackTimeout)\n\n // Listen for transition completion events as backup\n const onFinishAnimation = () => {\n clearTimeout(timeoutId)\n sendExitComplete?.()\n }\n\n node.addEventListener('transitionend', onFinishAnimation)\n node.addEventListener('transitioncancel', onFinishAnimation)\n\n return () => {\n clearTimeout(timeoutId)\n node.removeEventListener('transitionend', onFinishAnimation)\n node.removeEventListener('transitioncancel', onFinishAnimation)\n }\n }, [sendExitComplete, isExiting])\n\n // Check if we have any animation to apply\n if (!hasNormalizedAnimation(normalized)) {\n return null\n }\n\n if (Array.isArray(style.transform)) {\n style.transform = transformsToString(style.transform)\n }\n\n // Build CSS transition string\n // TODO: we disabled the transform transition, because it will create issue for inverse function and animate function\n // for non layout transform properties either use animate function or find a workaround to do it with css\n const delayStr = normalized.delay ? ` ${normalized.delay}ms` : ''\n const durationOverride = normalized.config?.duration\n style.transition = keys\n .map((key) => {\n // Check for property-specific animation, fall back to default\n const propAnimation = normalized.properties[key]\n let animationValue: string | null = null\n\n if (typeof propAnimation === 'string') {\n animationValue = animations[propAnimation]\n } else if (\n propAnimation &&\n typeof propAnimation === 'object' &&\n propAnimation.type\n ) {\n animationValue = animations[propAnimation.type]\n } else if (defaultAnimation) {\n animationValue = defaultAnimation\n }\n\n // Apply global duration override if specified\n if (animationValue && durationOverride) {\n animationValue = applyDurationOverride(animationValue, durationOverride)\n }\n\n return animationValue ? `${key} ${animationValue}${delayStr}` : null\n })\n .filter(Boolean)\n .join(', ')\n\n if (process.env.NODE_ENV === 'development' && props['debug'] === 'verbose') {\n console.info('CSS animation', {\n props,\n animations,\n normalized,\n defaultAnimation,\n style,\n isEntering,\n isExiting,\n })\n }\n\n return { style, className: isEntering ? 't_unmounted' : '' }\n },\n }\n}\n\n// layout animations\n// useIsomorphicLayoutEffect(() => {\n// if (!host || !props.layout) {\n// return\n// }\n// // @ts-ignore\n// const boundingBox = host?.getBoundingClientRect()\n// if (isChanged(initialPositionRef.current, boundingBox)) {\n// const transform = invert(\n// host,\n// boundingBox,\n// initialPositionRef.current\n// )\n\n// animate({\n// from: transform,\n// to: { x: 0, y: 0, scaleX: 1, scaleY: 1 },\n// duration: 1000,\n// onUpdate: ({ x, y, scaleX, scaleY }) => {\n// // @ts-ignore\n// host.style.transform = `translate(${x}px, ${y}px) scaleX(${scaleX}) scaleY(${scaleY})`\n// // TODO: handle childRef inverse scale\n// // childRef.current.style.transform = `scaleX(${1 / scaleX}) scaleY(${\n// // 1 / scaleY\n// // })`\n// },\n// // TODO: extract ease-in from string and convert/map it to a cubicBezier array\n// cubicBezier: [0, 1.38, 1, -0.41],\n// })\n// }\n// initialPositionRef.current = boundingBox\n// })\n\n// style.transition = `${keys} ${animation}${\n// props.layout ? ',width 0s, height 0s, margin 0s, padding 0s, transform' : ''\n// }`\n\n// const isChanged = (initialBox: any, finalBox: any) => {\n// // we just mounted, so we don't have complete data yet\n// if (!initialBox || !finalBox) return false\n\n// // deep compare the two boxes\n// return JSON.stringify(initialBox) !== JSON.stringify(finalBox)\n// }\n\n// const invert = (el, from, to) => {\n// const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from\n// const { x, y, width, height } = to\n\n// const transform = {\n// x: x - fromX - (fromWidth - width) / 2,\n// y: y - fromY - (fromHeight - height) / 2,\n// scaleX: width / fromWidth,\n// scaleY: height / fromHeight,\n// }\n\n// el.style.transform = `\n"
|
|
9
9
|
],
|
|
10
10
|
"version": 3
|
|
11
11
|
}
|