ant-design/components/style/roundedArrow.ts

73 lines
2.0 KiB
TypeScript
Raw Normal View History

/* eslint-disable import/prefer-default-export */
2022-05-09 22:20:07 +08:00
import type { CSSObject } from '@ant-design/cssinjs';
export const roundedArrow = (
width: number,
innerRadius: number,
outerRadius: number,
bgColor: string,
2022-08-25 19:39:26 +08:00
boxShadow: string,
): CSSObject => {
2022-08-25 19:39:26 +08:00
const unitWidth = width / 2;
const ax = 0;
2022-08-25 19:39:26 +08:00
const ay = unitWidth;
const bx = (outerRadius * 1) / Math.sqrt(2);
2022-08-25 19:39:26 +08:00
const by = unitWidth - outerRadius * (1 - 1 / Math.sqrt(2));
const cx = unitWidth - innerRadius * (1 / Math.sqrt(2));
const cy = outerRadius * (Math.sqrt(2) - 1) + innerRadius * (1 / Math.sqrt(2));
const dx = 2 * unitWidth - cx;
2022-08-25 19:39:26 +08:00
const dy = cy;
const ex = 2 * unitWidth - bx;
2022-08-25 19:39:26 +08:00
const ey = by;
const fx = 2 * unitWidth - ax;
2022-08-25 19:39:26 +08:00
const fy = ay;
const shadowWidth = unitWidth * Math.sqrt(2) + outerRadius * (Math.sqrt(2) - 2);
2023-04-19 15:53:42 +08:00
const polygonOffset = outerRadius * (Math.sqrt(2) - 1);
return {
pointerEvents: 'none',
width,
height: width,
2022-08-25 19:39:26 +08:00
overflow: 'hidden',
'&::before': {
position: 'absolute',
bottom: 0,
insetInlineStart: 0,
width,
height: width / 2,
background: bgColor,
2023-04-19 15:53:42 +08:00
clipPath: {
_multi_value_: true,
value: [
`polygon(${polygonOffset}px 100%, 50% ${polygonOffset}px, ${
2 * unitWidth - polygonOffset
}px 100%, ${polygonOffset}px 100%)`,
`path('M ${ax} ${ay} A ${outerRadius} ${outerRadius} 0 0 0 ${bx} ${by} L ${cx} ${cy} A ${innerRadius} ${innerRadius} 0 0 1 ${dx} ${dy} L ${ex} ${ey} A ${outerRadius} ${outerRadius} 0 0 0 ${fx} ${fy} Z')`,
],
},
content: '""',
},
2022-08-25 19:39:26 +08:00
'&::after': {
content: '""',
position: 'absolute',
width: shadowWidth,
height: shadowWidth,
2022-08-25 19:39:26 +08:00
bottom: 0,
insetInline: 0,
margin: 'auto',
borderRadius: {
_skip_check_: true,
value: `0 0 ${innerRadius}px 0`,
},
transform: 'translateY(50%) rotate(-135deg)',
boxShadow,
zIndex: 0,
background: 'transparent',
},
};
};