ant-design/components/_util/wave/style.ts

81 lines
2.4 KiB
TypeScript
Raw Normal View History

import { Keyframes, useStyleRegister } from '@ant-design/cssinjs';
import { useContext } from 'react';
import { ConfigContext } from '../../config-provider';
import type { AliasToken, GenerateStyle, UseComponentStyleResult } from '../../theme';
import { useToken } from '../../theme';
interface WaveToken extends AliasToken {
hashId: string;
clickAnimatingNode: string;
clickAnimatingTrue: string;
clickAnimatingWithoutExtraNodeTrue: string;
clickAnimatingWithoutExtraNodeTrueAfter: string;
}
const genWaveStyle: GenerateStyle<WaveToken> = token => {
const waveEffect = new Keyframes('waveEffect', {
'100%': {
boxShadow: `0 0 0 6px ${token.colorPrimary}`,
},
});
const fadeEffect = new Keyframes('fadeEffect', {
'100%': {
opacity: 0,
},
});
return [
{
[`${token.clickAnimatingWithoutExtraNodeTrue},
${token.clickAnimatingTrue}`]: {
position: 'relative',
},
[`${token.clickAnimatingWithoutExtraNodeTrueAfter},
& ${token.clickAnimatingNode}`]: {
position: 'absolute',
top: 0,
insetInlineStart: 0,
insetInlineEnd: 0,
bottom: 0,
display: 'block',
borderRadius: 'inherit',
boxShadow: `0 0 0 0 ${token.colorPrimary}`,
opacity: 0.2,
animation: `${fadeEffect.getName(token.hashId)} 2s ${
token.motionEaseOutCirc
}, ${waveEffect.getName(token.hashId)} 0.4s ${token.motionEaseOutCirc}`,
animationFillMode: 'forwards',
content: '""',
pointerEvents: 'none',
},
},
waveEffect,
fadeEffect,
];
};
export default (): UseComponentStyleResult => {
const [theme, token, hashId] = useToken();
const { getPrefixCls } = useContext(ConfigContext);
const rootPrefixCls = getPrefixCls();
const clickAnimatingTrue = `[${rootPrefixCls}-click-animating='true']`;
const clickAnimatingWithoutExtraNodeTrue = `[${rootPrefixCls}-click-animating-without-extra-node='true']`;
const clickAnimatingNode = `.${rootPrefixCls}-click-animating-node`;
const waveToken: WaveToken = {
...token,
hashId,
clickAnimatingNode,
clickAnimatingTrue,
clickAnimatingWithoutExtraNodeTrue,
clickAnimatingWithoutExtraNodeTrueAfter: `${clickAnimatingWithoutExtraNodeTrue}::after`,
};
return [
useStyleRegister({ theme, token, hashId, path: ['wave'] }, () => [genWaveStyle(waveToken)]),
hashId,
];
};