ant-design/components/style/motion/move.tsx

164 lines
3.4 KiB
TypeScript
Raw Normal View History

import type { CSSInterpolation } from '@ant-design/cssinjs';
import { Keyframes } from '@ant-design/cssinjs';
import type { AliasToken } from '../../_util/theme';
import type { TokenWithCommonCls } from '../../_util/theme/util/genComponentStyleHook';
import { initMotion } from './motion';
export const moveDownIn = new Keyframes('antMoveDownIn', {
'0%': {
transform: 'translateY(100%)',
transformOrigin: '0 0',
opacity: 0,
},
'100%': {
transform: 'translateY(0%)',
transformOrigin: '0 0',
opacity: 1,
},
});
export const moveDownOut = new Keyframes('antMoveDownOut', {
'0%': {
transform: 'translateY(0%)',
transformOrigin: '0 0',
opacity: 1,
},
'100%': {
transform: 'translateY(100%)',
transformOrigin: '0 0',
opacity: 0,
},
});
export const moveLeftIn = new Keyframes('antMoveLeftIn', {
'0%': {
transform: 'translateX(-100%)',
transformOrigin: '0 0',
opacity: 0,
},
'100%': {
transform: 'translateX(0%)',
transformOrigin: '0 0',
opacity: 1,
},
});
export const moveLeftOut = new Keyframes('antMoveLeftOut', {
'0%': {
transform: 'translateX(0%)',
transformOrigin: '0 0',
opacity: 1,
},
'100%': {
transform: 'translateX(-100%)',
transformOrigin: '0 0',
opacity: 0,
},
});
export const moveRightIn = new Keyframes('antMoveRightIn', {
'0%': {
transform: 'translateX(100%)',
transformOrigin: '0 0',
opacity: 0,
},
'100%': {
transform: 'translateX(0%)',
transformOrigin: '0 0',
opacity: 1,
},
});
export const moveRightOut = new Keyframes('antMoveRightOut', {
'0%': {
transform: 'translateX(0%)',
transformOrigin: '0 0',
opacity: 1,
},
'100%': {
transform: 'translateX(100%)',
transformOrigin: '0 0',
opacity: 0,
},
});
export const moveUpIn = new Keyframes('antMoveUpIn', {
'0%': {
transform: 'translateY(-100%)',
transformOrigin: '0 0',
opacity: 0,
},
'100%': {
transform: 'translateY(0%)',
transformOrigin: '0 0',
opacity: 1,
},
});
export const moveUpOut = new Keyframes('antMoveUpOut', {
'0%': {
transform: 'translateY(0%)',
transformOrigin: '0 0',
opacity: 1,
},
'100%': {
transform: 'translateY(-100%)',
transformOrigin: '0 0',
opacity: 0,
},
});
type MoveMotionTypes = 'move-up' | 'move-down' | 'move-left' | 'move-right';
const moveMotion: Record<MoveMotionTypes, { inKeyframes: Keyframes; outKeyframes: Keyframes }> = {
'move-up': {
inKeyframes: moveUpIn,
outKeyframes: moveUpOut,
},
'move-down': {
inKeyframes: moveDownIn,
outKeyframes: moveDownOut,
},
'move-left': {
inKeyframes: moveLeftIn,
outKeyframes: moveLeftOut,
},
'move-right': {
inKeyframes: moveRightIn,
outKeyframes: moveRightOut,
},
};
export const initMoveMotion = (
token: TokenWithCommonCls<AliasToken>,
motionName: MoveMotionTypes,
): CSSInterpolation => {
const { antCls } = token;
const motionCls = `${antCls}-${motionName}`;
const { inKeyframes, outKeyframes } = moveMotion[motionName];
return [
initMotion(motionCls, inKeyframes, outKeyframes, token.motionDurationMid),
{
[`
${motionCls}-enter,
${motionCls}-appear
`]: {
opacity: 0,
animationTimingFunction: token.motionEaseOutCirc,
},
[`${motionCls}-leave`]: {
animationTimingFunction: token.motionEaseInOutCirc,
},
},
];
};