mirror of
https://gitee.com/ant-design/ant-design.git
synced 2024-12-02 12:09:14 +08:00
2aa33578c2
* chore: Divider full token * chore: typography with tokn * chore: select with token * chore: tree with token * chore: select style * chore: select style * chore: clean up
395 lines
9.7 KiB
TypeScript
395 lines
9.7 KiB
TypeScript
// import '../../style/index.less';
|
|
// import './index.less';
|
|
|
|
// style dependencies
|
|
// deps-lint-skip: tooltip
|
|
|
|
// deps-lint-skip-all
|
|
import { TinyColor } from '@ctrl/tinycolor';
|
|
import { CSSInterpolation, CSSObject } from '@ant-design/cssinjs';
|
|
import {
|
|
PresetColors,
|
|
PresetColorType,
|
|
DerivativeToken,
|
|
useStyleRegister,
|
|
useToken,
|
|
UseComponentStyleResult,
|
|
GenerateStyle,
|
|
resetComponent,
|
|
roundedArrow,
|
|
} from '../../_util/theme';
|
|
|
|
// FIXME
|
|
type PopoverToken = DerivativeToken & {
|
|
popoverCls: string;
|
|
iconPrefixCls: string;
|
|
popoverBg: string;
|
|
popoverColor: string;
|
|
popoverMinWidth: number;
|
|
popoverMinHeight: number;
|
|
popoverArrowWidth: number;
|
|
popoverArrowColor: string;
|
|
popoverArrowOuterColor: string;
|
|
popoverDistance: number;
|
|
popoverPaddingHorizonta: number;
|
|
popoverArrowRotateWidth: number;
|
|
popoverArrowOffsetVertical: number;
|
|
popoverArrowOffsetHorizontal: number;
|
|
};
|
|
|
|
const genBaseStyle: GenerateStyle<PopoverToken> = token => {
|
|
const {
|
|
popoverCls,
|
|
iconPrefixCls,
|
|
popoverBg,
|
|
popoverColor,
|
|
popoverMinWidth,
|
|
popoverMinHeight,
|
|
popoverArrowWidth,
|
|
popoverPaddingHorizonta,
|
|
popoverArrowRotateWidth,
|
|
|
|
boxShadow,
|
|
colorSplit,
|
|
colorTextHeading,
|
|
colorWarning,
|
|
fontSize,
|
|
marginSM,
|
|
marginXS,
|
|
lineHeight,
|
|
radiusBase: borderRadius,
|
|
paddingSM,
|
|
zIndexPopover,
|
|
} = token;
|
|
|
|
return {
|
|
[popoverCls]: {
|
|
...resetComponent(token),
|
|
position: 'absolute',
|
|
top: 0,
|
|
insetInlineStart: 0,
|
|
zIndex: zIndexPopover,
|
|
fontWeight: 'normal',
|
|
whiteSpace: 'normal',
|
|
textAlign: 'start',
|
|
cursor: 'auto',
|
|
userSelect: 'text',
|
|
|
|
'&::after': {
|
|
position: 'absolute',
|
|
// FIXME
|
|
background: new TinyColor('#fff').setAlpha(0.01).toRgbString(),
|
|
content: '""',
|
|
},
|
|
|
|
'&-rtl': {
|
|
direction: 'rtl',
|
|
},
|
|
|
|
'&-hidden': {
|
|
display: 'none',
|
|
},
|
|
|
|
[`${popoverCls}-inner`]: {
|
|
backgroundColor: popoverBg,
|
|
backgroundClip: 'padding-box',
|
|
borderRadius,
|
|
boxShadow,
|
|
},
|
|
|
|
[`${popoverCls}-title`]: {
|
|
minWidth: popoverMinWidth,
|
|
minHeight: popoverMinHeight,
|
|
margin: 0,
|
|
// FIXME
|
|
padding: `5px ${popoverPaddingHorizonta}px 4px`,
|
|
color: colorTextHeading,
|
|
fontWeight: 500,
|
|
// FIXME
|
|
borderBottom: `1px solid ${colorSplit}`,
|
|
},
|
|
|
|
[`${popoverCls}-inner-content`]: {
|
|
padding: `${paddingSM}px ${popoverPaddingHorizonta}px`,
|
|
color: popoverColor,
|
|
},
|
|
|
|
// FIXME 没找到使用地方,先保留
|
|
'&-message': {
|
|
position: 'relative',
|
|
// FIXME
|
|
padding: '4px 0 12px',
|
|
color: popoverColor,
|
|
fontSize,
|
|
|
|
[`> .${iconPrefixCls}`]: {
|
|
position: 'absolute',
|
|
// FIXME
|
|
top: 4 + (lineHeight * fontSize - fontSize) / 2,
|
|
color: colorWarning,
|
|
fontSize,
|
|
},
|
|
|
|
'&-title': {
|
|
// FIXME
|
|
paddingInlineStart: fontSize + 8,
|
|
},
|
|
},
|
|
|
|
// FIXME 没找到使用地方,先保留
|
|
'&-buttons': {
|
|
marginBottom: marginXS,
|
|
textAlign: 'end',
|
|
|
|
button: {
|
|
marginInlineStart: marginSM,
|
|
},
|
|
},
|
|
|
|
[`${popoverCls}-arrow`]: {
|
|
position: 'absolute',
|
|
display: 'block',
|
|
width: popoverArrowRotateWidth,
|
|
height: popoverArrowRotateWidth,
|
|
overflow: 'hidden',
|
|
background: 'transparent',
|
|
pointerEvents: 'none',
|
|
|
|
'&-content': {
|
|
position: 'absolute',
|
|
top: 0,
|
|
insetInlineEnd: 0,
|
|
bottom: 0,
|
|
insetInlineStart: 0,
|
|
display: 'block',
|
|
width: popoverArrowWidth,
|
|
height: popoverArrowWidth,
|
|
margin: 'auto',
|
|
backgroundColor: popoverBg,
|
|
content: '""',
|
|
pointerEvents: 'auto',
|
|
...roundedArrow(popoverArrowWidth, 5, popoverBg),
|
|
},
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
const genPlacementStyle: GenerateStyle<PopoverToken> = token => {
|
|
const {
|
|
popoverCls,
|
|
popoverDistance,
|
|
popoverArrowRotateWidth,
|
|
popoverArrowOffsetHorizontal,
|
|
popoverArrowOffsetVertical,
|
|
} = token;
|
|
|
|
return {
|
|
[popoverCls]: {
|
|
[`
|
|
&-placement-top,
|
|
&-placement-topLeft,
|
|
&-placement-topRight
|
|
`]: {
|
|
paddingBottom: popoverDistance,
|
|
},
|
|
|
|
[`
|
|
&-placement-right,
|
|
&-placement-rightTop,
|
|
&-placement-rightBottom
|
|
`]: {
|
|
paddingLeft: popoverDistance,
|
|
},
|
|
|
|
[`
|
|
&-placement-bottom,
|
|
&-placement-bottomLeft,
|
|
&-placement-bottomRight
|
|
`]: {
|
|
paddingTop: popoverDistance,
|
|
},
|
|
|
|
[`
|
|
&-placement-left,
|
|
&-placement-leftTop,
|
|
&-placement-leftBottom
|
|
`]: {
|
|
paddingRight: popoverDistance,
|
|
},
|
|
|
|
[`
|
|
&-placement-top ${popoverCls}-arrow,
|
|
&-placement-topLeft ${popoverCls}-arrow,
|
|
&-placement-topRight ${popoverCls}-arrow
|
|
`]: {
|
|
bottom: popoverDistance - popoverArrowRotateWidth,
|
|
|
|
'&-content': {
|
|
// FIXME
|
|
boxShadow: `3px 3px 7px ${new TinyColor('#000').setAlpha(0.07).toRgbString()}`,
|
|
transform: `translateY(-${popoverArrowRotateWidth / 2}px) rotate(45deg)`,
|
|
},
|
|
},
|
|
|
|
[`&-placement-top ${popoverCls}-arrow`]: {
|
|
insetInlineStart: '50%',
|
|
transform: 'translateX(-50%)',
|
|
},
|
|
|
|
[`&-placement-topLeft ${popoverCls}-arrow`]: {
|
|
insetInlineStart: popoverArrowOffsetHorizontal,
|
|
},
|
|
|
|
[`&-placement-topRight ${popoverCls}-arrow`]: {
|
|
insetInlineEnd: popoverArrowOffsetHorizontal,
|
|
},
|
|
|
|
[`
|
|
&-placement-right ${popoverCls}-arrow,
|
|
&-placement-rightTop ${popoverCls}-arrow,
|
|
&-placement-rightBottom ${popoverCls}-arrow
|
|
`]: {
|
|
insetInlineStart: popoverDistance - popoverArrowRotateWidth,
|
|
|
|
'&-content': {
|
|
// FIXME
|
|
boxShadow: `3px 3px 7px ${new TinyColor('#000').setAlpha(0.07).toRgbString()}`,
|
|
transform: `translateX(${popoverArrowRotateWidth / 2}px) rotate(135deg)`,
|
|
},
|
|
},
|
|
|
|
[`&-placement-right ${popoverCls}-arrow`]: {
|
|
top: '50%',
|
|
transform: 'translateY(-50%)',
|
|
},
|
|
|
|
[`&-placement-rightTop ${popoverCls}-arrow`]: {
|
|
top: popoverArrowOffsetVertical,
|
|
},
|
|
|
|
[`&-placement-rightBottom ${popoverCls}-arrow`]: {
|
|
bottom: popoverArrowOffsetVertical,
|
|
},
|
|
|
|
[`
|
|
&-placement-bottom ${popoverCls}-arrow,
|
|
&-placement-bottomLeft ${popoverCls}-arrow,
|
|
&-placement-bottomRight ${popoverCls}-arrow
|
|
`]: {
|
|
top: popoverDistance - popoverArrowRotateWidth,
|
|
|
|
'&-content': {
|
|
// FIXME
|
|
boxShadow: `2px 2px 5px ${new TinyColor('#000').setAlpha(0.06).toRgbString()}`,
|
|
transform: `translateY(${popoverArrowRotateWidth / 2}px) rotate(-135deg)`,
|
|
},
|
|
},
|
|
|
|
[`&-placement-bottom ${popoverCls}-arrow`]: {
|
|
insetInlineStart: '50%',
|
|
transform: 'translateX(-50%)',
|
|
},
|
|
|
|
[`&-placement-bottomLeft ${popoverCls}-arrow`]: {
|
|
insetInlineStart: popoverArrowOffsetHorizontal,
|
|
},
|
|
|
|
[`&-placement-bottomRight ${popoverCls}-arrow`]: {
|
|
insetInlineEnd: popoverArrowOffsetHorizontal,
|
|
},
|
|
|
|
[`
|
|
&-placement-left ${popoverCls}-arrow,
|
|
&-placement-leftTop ${popoverCls}-arrow,
|
|
&-placement-leftBottom ${popoverCls}-arrow
|
|
`]: {
|
|
insetInlineEnd: popoverDistance - popoverArrowRotateWidth,
|
|
|
|
'&-content': {
|
|
// FIXME
|
|
boxShadow: `3px 3px 7px ${new TinyColor('#000').setAlpha(0.07).toRgbString()}`,
|
|
transform: `translateX(-${popoverArrowRotateWidth / 2}px) rotate(-45deg)`,
|
|
},
|
|
},
|
|
|
|
[`&-placement-left ${popoverCls}-arrow`]: {
|
|
top: '50%',
|
|
transform: 'translateY(-50%)',
|
|
},
|
|
|
|
[`&-placement-leftTop ${popoverCls}-arrow`]: {
|
|
top: popoverArrowOffsetVertical,
|
|
},
|
|
|
|
[`&-placement-leftBottom ${popoverCls}-arrow`]: {
|
|
bottom: popoverArrowOffsetVertical,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
// FIXME: special preset colors
|
|
const genColorStyle: GenerateStyle<PopoverToken> = token => {
|
|
const { popoverCls } = token;
|
|
|
|
return PresetColors.reduce((prev: CSSObject, colorKey: keyof PresetColorType) => {
|
|
const lightColor = token[`${colorKey}-6`];
|
|
return {
|
|
...prev,
|
|
[`${popoverCls}-${colorKey}`]: {
|
|
[`${popoverCls}-inner`]: {
|
|
backgroundColor: lightColor,
|
|
},
|
|
[`${popoverCls}-arrow`]: {
|
|
'&-content': {
|
|
backgroundColor: lightColor,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}, {} as CSSObject);
|
|
};
|
|
|
|
export const genPopoverStyle: GenerateStyle<PopoverToken> = (
|
|
token: PopoverToken,
|
|
): CSSInterpolation => [genBaseStyle(token), genPlacementStyle(token), genColorStyle(token)];
|
|
|
|
export default function useStyle(
|
|
prefixCls: string,
|
|
iconPrefixCls: string,
|
|
): UseComponentStyleResult {
|
|
const [theme, token, hashId] = useToken();
|
|
|
|
const popoverBg = token.colorBg;
|
|
// FIXME
|
|
const popoverArrowWidth = 8 * Math.sqrt(2);
|
|
|
|
const popoverToken = {
|
|
...token,
|
|
popoverCls: `.${prefixCls}`,
|
|
iconPrefixCls,
|
|
popoverBg,
|
|
popoverColor: token.colorText,
|
|
// FIXME
|
|
popoverMinWidth: 177,
|
|
popoverMinHeight: 32,
|
|
popoverArrowWidth,
|
|
popoverArrowColor: popoverBg,
|
|
popoverArrowOuterColor: popoverBg,
|
|
popoverDistance: popoverArrowWidth + 4,
|
|
popoverPaddingHorizonta: token.padding,
|
|
popoverArrowRotateWidth: Math.sqrt(popoverArrowWidth * popoverArrowWidth * 2),
|
|
// FIXME
|
|
popoverArrowOffsetVertical: 12,
|
|
popoverArrowOffsetHorizontal: 16,
|
|
};
|
|
|
|
return [
|
|
useStyleRegister({ theme, token, hashId, path: [prefixCls] }, () => [
|
|
genPopoverStyle(popoverToken),
|
|
]),
|
|
hashId,
|
|
];
|
|
}
|