import { Keyframes, useStyleRegister } from '@ant-design/cssinjs'; import { useContext } from 'react'; import { ConfigContext } from '../../config-provider'; import type { AliasToken, GenerateStyle, UseComponentStyleResult } from '../../theme/internal'; import { useToken } from '../../theme/internal'; interface WaveToken extends AliasToken { hashId: string; clickAnimatingNode: string; clickAnimatingTrue: string; clickAnimatingWithoutExtraNodeTrue: string; clickAnimatingWithoutExtraNodeTrueAfter: string; } const genWaveStyle: GenerateStyle = (token) => { const waveEffect = new Keyframes('waveEffect', { '100%': { boxShadow: `0 0 0 6px var(--antd-wave-shadow-color)`, }, }); const fadeEffect = new Keyframes('fadeEffect', { '100%': { opacity: 0, }, }); return [ { [`${token.clickAnimatingWithoutExtraNodeTrue}, ${token.clickAnimatingTrue}`]: { '--antd-wave-shadow-color': token.colorPrimary, '--scroll-bar': 0, 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 var(--antd-wave-shadow-color)`, opacity: 0.2, animation: { _skip_check_: true, value: `${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, ]; };