refactor: popover cssinjs (#34607)

* refactor: popover cssinjs

* fix cls

* fix cls

* fix overlay

* fix: token

* fix: util

* fix: block -> line

* fix: interface
This commit is contained in:
xrkffgg 2022-03-25 13:20:42 +08:00 committed by GitHub
parent 8fe2002860
commit 1627207255
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 674 additions and 223 deletions

View File

@ -2,7 +2,7 @@ import React from 'react';
import { CSSInterpolation, Theme, useCacheToken, useStyleRegister } from '@ant-design/cssinjs';
import defaultSeedToken, { derivative as defaultDerivative } from './themes/default';
import version from '../../version';
import { resetComponent, resetIcon, clearFix } from './util';
import { resetComponent, resetIcon, clearFix, roundedArrow } from './util';
import formatToken from './util/alias';
import {
initSlideMotion,
@ -29,6 +29,7 @@ export {
resetComponent,
resetIcon,
clearFix,
roundedArrow,
initSlideMotion,
slideUpIn,
slideUpOut,

View File

@ -87,6 +87,7 @@ export interface SeedToken extends PresetColorType {
// zIndex
/** Base zIndex of component like BackTop, Affix which can be cover by large popup */
zIndexBase: number;
zIndexPopover: number;
/** Base popup component zIndex */
zIndexPopup: number;
}
@ -253,6 +254,7 @@ export interface AliasToken extends Omit<DerivativeToken, OmitDerivativeKey> {
paddingXXS: number;
paddingLG: number;
marginXS: number;
marginSM: number;
marginLG: number;
marginXXS: number;
}

View File

@ -194,6 +194,7 @@ const seedToken: SeedToken = {
// zIndex
zIndexBase: 0,
zIndexPopover: 1030,
zIndexPopup: 1000,
};

View File

@ -110,7 +110,7 @@ export default function formatToken(derivativeToken: RawMergedToken): AliasToken
marginXXS: 2,
marginXS: 4,
// marginSM: 8,
marginSM: 8,
marginLG: 32,
boxShadow: `

View File

@ -2,6 +2,8 @@
import { CSSObject } from '@ant-design/cssinjs';
import type { DerivativeToken } from '..';
export { roundedArrow } from './roundedArrow';
export const resetComponent = (token: DerivativeToken): CSSObject => ({
boxSizing: 'border-box',
margin: 0,

View File

@ -0,0 +1,41 @@
/* eslint-disable import/prefer-default-export */
import { CSSObject } from '@ant-design/cssinjs';
import seedToken from '../themes/default';
export const roundedArrow = (
width: number,
outerRadius: number,
bgColor: string,
): CSSObject => {
const cornerHeight = outerRadius * (1 - 1 / Math.sqrt(2));
const { radiusBase } = seedToken;
const ax = width - cornerHeight;
const ay = 2 * width + cornerHeight;
const bx = ax + outerRadius * (1 / Math.sqrt(2));
const by = 2 * width;
const cx = 2 * width - radiusBase;
const cy = 2 * width;
const dx = 2 * width;
const dy = 2 * width - radiusBase;
const fx = 2 * width + cornerHeight;
const fy = width - cornerHeight;
const ex = 2 * width;
const ey = fy + outerRadius * (1 / Math.sqrt(2));
return {
borderRadius: `0 0 ${radiusBase}px 0`,
pointerEvents: 'none',
'&::before': {
position: 'absolute',
top: -width,
insetInlineStart: -width,
width: width * 3,
height: width * 3,
background: `linear-gradient(to left, ${bgColor} 50%, ${bgColor} 50%) no-repeat ${Math.ceil(-width + 1)}px ${Math.ceil(-width + 1)}px`,
content: '""',
clipPath: `path('M ${ax} ${ay} A ${outerRadius} ${outerRadius} 0 0 1 ${bx} ${by} L ${cx} ${cy} A ${radiusBase} ${radiusBase} 0 0 0 ${dx} ${dy} L ${ex} ${ey} A ${outerRadius} ${outerRadius} 0 0 1 ${fx} ${fy} Z')`,
},
};
}

View File

@ -1,17 +1,21 @@
import * as React from 'react';
import classNames from 'classnames';
import Tooltip, { AbstractTooltipProps, TooltipPlacement } from '../tooltip';
import { ConfigContext } from '../config-provider';
import { getRenderPropValue, RenderFunction } from '../_util/getRenderPropValue';
import { getTransitionName } from '../_util/motion';
// CSSINJS
import useStyle from './style';
export interface PopoverProps extends AbstractTooltipProps {
title?: React.ReactNode | RenderFunction;
content?: React.ReactNode | RenderFunction;
}
const Popover = React.forwardRef<unknown, PopoverProps>(
({ prefixCls: customizePrefixCls, title, content, ...otherProps }, ref) => {
const { getPrefixCls } = React.useContext(ConfigContext);
({ prefixCls: customizePrefixCls, title, content, overlayClassName, ...otherProps }, ref) => {
const { getPrefixCls, iconPrefixCls } = React.useContext(ConfigContext);
const getOverlay = (prefixCls: string) => {
if (!title && !content) return undefined;
@ -24,16 +28,23 @@ const Popover = React.forwardRef<unknown, PopoverProps>(
};
const prefixCls = getPrefixCls('popover', customizePrefixCls);
const [wrapSSR, hashId] = useStyle(prefixCls, iconPrefixCls);
const rootPrefixCls = getPrefixCls();
return (
const overlayCls = classNames(
overlayClassName,
hashId,
);
return wrapSSR(
<Tooltip
{...otherProps}
prefixCls={prefixCls}
overlayClassName={overlayCls}
ref={ref as any}
overlay={getOverlay(prefixCls)}
transitionName={getTransitionName(rootPrefixCls, 'zoom-big', otherProps.transitionName)}
/>
/>,
);
},
);

View File

@ -1,258 +1,258 @@
@import '../../style/themes/index';
@import '../../style/mixins/index';
// @import '../../style/themes/index';
// @import '../../style/mixins/index';
@popover-prefix-cls: ~'@{ant-prefix}-popover';
// @popover-prefix-cls: ~'@{ant-prefix}-popover';
@popover-arrow-rotate-width: sqrt(@popover-arrow-width * @popover-arrow-width * 2);
// @popover-arrow-rotate-width: sqrt(@popover-arrow-width * @popover-arrow-width * 2);
@popover-arrow-offset-vertical: 12px;
@popover-arrow-offset-horizontal: 16px;
// @popover-arrow-offset-vertical: 12px;
// @popover-arrow-offset-horizontal: 16px;
.@{popover-prefix-cls} {
.reset-component();
// .@{popover-prefix-cls} {
// .reset-component();
position: absolute;
top: 0;
left: 0;
z-index: @zindex-popover;
font-weight: normal;
white-space: normal;
text-align: left;
cursor: auto;
user-select: text;
// position: absolute;
// top: 0;
// left: 0;
// z-index: @zindex-popover;
// font-weight: normal;
// white-space: normal;
// text-align: left;
// cursor: auto;
// user-select: text;
&::after {
position: absolute;
background: fade(@white, 1%);
content: '';
}
// &::after {
// position: absolute;
// background: fade(@white, 1%);
// content: '';
// }
&-hidden {
display: none;
}
// &-hidden {
// display: none;
// }
// Offset the popover to account for the popover arrow
&-placement-top,
&-placement-topLeft,
&-placement-topRight {
padding-bottom: @popover-distance;
}
// // Offset the popover to account for the popover arrow
// &-placement-top,
// &-placement-topLeft,
// &-placement-topRight {
// padding-bottom: @popover-distance;
// }
&-placement-right,
&-placement-rightTop,
&-placement-rightBottom {
padding-left: @popover-distance;
}
// &-placement-right,
// &-placement-rightTop,
// &-placement-rightBottom {
// padding-left: @popover-distance;
// }
&-placement-bottom,
&-placement-bottomLeft,
&-placement-bottomRight {
padding-top: @popover-distance;
}
// &-placement-bottom,
// &-placement-bottomLeft,
// &-placement-bottomRight {
// padding-top: @popover-distance;
// }
&-placement-left,
&-placement-leftTop,
&-placement-leftBottom {
padding-right: @popover-distance;
}
// &-placement-left,
// &-placement-leftTop,
// &-placement-leftBottom {
// padding-right: @popover-distance;
// }
&-inner {
background-color: @popover-bg;
background-clip: padding-box;
border-radius: @border-radius-base;
box-shadow: @box-shadow-base;
box-shadow: ~'0 0 8px @{shadow-color} \9';
}
// &-inner {
// background-color: @popover-bg;
// background-clip: padding-box;
// border-radius: @border-radius-base;
// box-shadow: @box-shadow-base;
// box-shadow: ~'0 0 8px @{shadow-color} \9';
// }
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
/* IE10+ */
&-inner {
box-shadow: @box-shadow-base;
}
}
// @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
// /* IE10+ */
// &-inner {
// box-shadow: @box-shadow-base;
// }
// }
&-title {
min-width: @popover-min-width;
min-height: @popover-min-height;
margin: 0; // reset heading margin
padding: 5px @popover-padding-horizontal 4px;
color: @heading-color;
font-weight: 500;
border-bottom: 1px solid @border-color-split;
}
// &-title {
// min-width: @popover-min-width;
// min-height: @popover-min-height;
// margin: 0; // reset heading margin
// padding: 5px @popover-padding-horizontal 4px;
// color: @heading-color;
// font-weight: 500;
// border-bottom: 1px solid @border-color-split;
// }
&-inner-content {
padding: @padding-sm @popover-padding-horizontal;
color: @popover-color;
}
// &-inner-content {
// padding: @padding-sm @popover-padding-horizontal;
// color: @popover-color;
// }
&-message {
position: relative;
padding: 4px 0 12px;
color: @popover-color;
font-size: @font-size-base;
> .@{iconfont-css-prefix} {
position: absolute;
top: (
4px + ((@line-height-base * @font-size-base - @font-size-base) / 2)
); // 4px for padding-top, 4px for vertical middle
color: @warning-color;
font-size: @font-size-base;
}
// &-message {
// position: relative;
// padding: 4px 0 12px;
// color: @popover-color;
// font-size: @font-size-base;
// > .@{iconfont-css-prefix} {
// position: absolute;
// top: (
// 4px + ((@line-height-base * @font-size-base - @font-size-base) / 2)
// ); // 4px for padding-top, 4px for vertical middle
// color: @warning-color;
// font-size: @font-size-base;
// }
&-title {
padding-left: @font-size-base + 8px;
}
}
// &-title {
// padding-left: @font-size-base + 8px;
// }
// }
&-buttons {
margin-bottom: 4px;
text-align: right;
// &-buttons {
// margin-bottom: 4px;
// text-align: right;
button {
margin-left: 8px;
}
}
// button {
// margin-left: 8px;
// }
// }
// Arrows
&-arrow {
position: absolute;
display: block;
width: @popover-arrow-rotate-width;
height: @popover-arrow-rotate-width;
overflow: hidden;
background: transparent;
pointer-events: none;
// // Arrows
// &-arrow {
// position: absolute;
// display: block;
// width: @popover-arrow-rotate-width;
// height: @popover-arrow-rotate-width;
// overflow: hidden;
// background: transparent;
// pointer-events: none;
&-content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: block;
width: @popover-arrow-width;
height: @popover-arrow-width;
margin: auto;
background-color: @popover-bg;
content: '';
pointer-events: auto;
.roundedArrow(@popover-arrow-width, 5px, @popover-bg);
}
}
// &-content {
// position: absolute;
// top: 0;
// right: 0;
// bottom: 0;
// left: 0;
// display: block;
// width: @popover-arrow-width;
// height: @popover-arrow-width;
// margin: auto;
// background-color: @popover-bg;
// content: '';
// pointer-events: auto;
// .roundedArrow(@popover-arrow-width, 5px, @popover-bg);
// }
// }
&-placement-top &-arrow,
&-placement-topLeft &-arrow,
&-placement-topRight &-arrow {
bottom: @popover-distance - @popover-arrow-rotate-width;
// &-placement-top &-arrow,
// &-placement-topLeft &-arrow,
// &-placement-topRight &-arrow {
// bottom: @popover-distance - @popover-arrow-rotate-width;
&-content {
box-shadow: 3px 3px 7px fade(@black, 7%);
transform: translateY((-@popover-arrow-rotate-width / 2)) rotate(45deg);
}
}
// &-content {
// box-shadow: 3px 3px 7px fade(@black, 7%);
// transform: translateY((-@popover-arrow-rotate-width / 2)) rotate(45deg);
// }
// }
&-placement-top &-arrow {
left: 50%;
transform: translateX(-50%);
}
// &-placement-top &-arrow {
// left: 50%;
// transform: translateX(-50%);
// }
&-placement-topLeft &-arrow {
left: @popover-arrow-offset-horizontal;
}
// &-placement-topLeft &-arrow {
// left: @popover-arrow-offset-horizontal;
// }
&-placement-topRight &-arrow {
right: @popover-arrow-offset-horizontal;
}
// &-placement-topRight &-arrow {
// right: @popover-arrow-offset-horizontal;
// }
&-placement-right &-arrow,
&-placement-rightTop &-arrow,
&-placement-rightBottom &-arrow {
left: @popover-distance - @popover-arrow-rotate-width;
// &-placement-right &-arrow,
// &-placement-rightTop &-arrow,
// &-placement-rightBottom &-arrow {
// left: @popover-distance - @popover-arrow-rotate-width;
&-content {
box-shadow: 3px 3px 7px fade(@black, 7%);
transform: translateX((@popover-arrow-rotate-width / 2)) rotate(135deg);
}
}
// &-content {
// box-shadow: 3px 3px 7px fade(@black, 7%);
// transform: translateX((@popover-arrow-rotate-width / 2)) rotate(135deg);
// }
// }
&-placement-right &-arrow {
top: 50%;
transform: translateY(-50%);
}
// &-placement-right &-arrow {
// top: 50%;
// transform: translateY(-50%);
// }
&-placement-rightTop &-arrow {
top: @popover-arrow-offset-vertical;
}
// &-placement-rightTop &-arrow {
// top: @popover-arrow-offset-vertical;
// }
&-placement-rightBottom &-arrow {
bottom: @popover-arrow-offset-vertical;
}
// &-placement-rightBottom &-arrow {
// bottom: @popover-arrow-offset-vertical;
// }
&-placement-bottom &-arrow,
&-placement-bottomLeft &-arrow,
&-placement-bottomRight &-arrow {
top: @popover-distance - @popover-arrow-rotate-width;
// &-placement-bottom &-arrow,
// &-placement-bottomLeft &-arrow,
// &-placement-bottomRight &-arrow {
// top: @popover-distance - @popover-arrow-rotate-width;
&-content {
box-shadow: 2px 2px 5px fade(@black, 6%);
transform: translateY((@popover-arrow-rotate-width / 2)) rotate(-135deg);
}
}
// &-content {
// box-shadow: 2px 2px 5px fade(@black, 6%);
// transform: translateY((@popover-arrow-rotate-width / 2)) rotate(-135deg);
// }
// }
&-placement-bottom &-arrow {
left: 50%;
transform: translateX(-50%);
}
// &-placement-bottom &-arrow {
// left: 50%;
// transform: translateX(-50%);
// }
&-placement-bottomLeft &-arrow {
left: @popover-arrow-offset-horizontal;
}
// &-placement-bottomLeft &-arrow {
// left: @popover-arrow-offset-horizontal;
// }
&-placement-bottomRight &-arrow {
right: @popover-arrow-offset-horizontal;
}
// &-placement-bottomRight &-arrow {
// right: @popover-arrow-offset-horizontal;
// }
&-placement-left &-arrow,
&-placement-leftTop &-arrow,
&-placement-leftBottom &-arrow {
right: @popover-distance - @popover-arrow-rotate-width;
// &-placement-left &-arrow,
// &-placement-leftTop &-arrow,
// &-placement-leftBottom &-arrow {
// right: @popover-distance - @popover-arrow-rotate-width;
&-content {
box-shadow: 3px 3px 7px fade(@black, 7%);
transform: translateX((-@popover-arrow-rotate-width / 2)) rotate(-45deg);
}
}
// &-content {
// box-shadow: 3px 3px 7px fade(@black, 7%);
// transform: translateX((-@popover-arrow-rotate-width / 2)) rotate(-45deg);
// }
// }
&-placement-left &-arrow {
top: 50%;
transform: translateY(-50%);
}
// &-placement-left &-arrow {
// top: 50%;
// transform: translateY(-50%);
// }
&-placement-leftTop &-arrow {
top: @popover-arrow-offset-vertical;
}
// &-placement-leftTop &-arrow {
// top: @popover-arrow-offset-vertical;
// }
&-placement-leftBottom &-arrow {
bottom: @popover-arrow-offset-vertical;
}
}
// &-placement-leftBottom &-arrow {
// bottom: @popover-arrow-offset-vertical;
// }
// }
.generator-popover-preset-color(@i: length(@preset-colors)) when (@i > 0) {
.generator-popover-preset-color(@i - 1);
@color: extract(@preset-colors, @i);
@lightColor: '@{color}-6';
.@{popover-prefix-cls}-@{color} {
.@{popover-prefix-cls}-inner {
background-color: @@lightColor;
}
.@{popover-prefix-cls}-arrow {
&-content {
background-color: @@lightColor;
}
}
}
}
.generator-popover-preset-color();
// .generator-popover-preset-color(@i: length(@preset-colors)) when (@i > 0) {
// .generator-popover-preset-color(@i - 1);
// @color: extract(@preset-colors, @i);
// @lightColor: '@{color}-6';
// .@{popover-prefix-cls}-@{color} {
// .@{popover-prefix-cls}-inner {
// background-color: @@lightColor;
// }
// .@{popover-prefix-cls}-arrow {
// &-content {
// background-color: @@lightColor;
// }
// }
// }
// }
// .generator-popover-preset-color();
@import './rtl';
// @import './rtl';

View File

@ -1,5 +1,398 @@
import '../../style/index.less';
import './index.less';
// 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,
];
}