vuecssuiant-designantdreactantantd-vueenterprisefrontendui-designvue-antdvue-antd-uivue3vuecomponent
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.4 KiB
157 lines
4.4 KiB
import { initZoomMotion } from '../../style/motion'; |
|
import type { FullToken, GenerateStyle, UseComponentStyleResult } from '../../theme/internal'; |
|
import { genComponentStyleHook, mergeToken } from '../../theme/internal'; |
|
import { genPresetColor, resetComponent } from '../../style'; |
|
import getArrowStyle, { MAX_VERTICAL_CONTENT_RADIUS } from '../../style/placementArrow'; |
|
import { Ref } from 'vue'; |
|
|
|
export interface ComponentToken { |
|
zIndexPopup: number; |
|
colorBgDefault: string; |
|
} |
|
|
|
interface TooltipToken extends FullToken<'Tooltip'> { |
|
// default variables |
|
tooltipMaxWidth: number; |
|
tooltipColor: string; |
|
tooltipBg: string; |
|
tooltipBorderRadius: number; |
|
tooltipRadiusOuter: number; |
|
} |
|
|
|
const genTooltipStyle: GenerateStyle<TooltipToken> = token => { |
|
const { |
|
componentCls, // ant-tooltip |
|
tooltipMaxWidth, |
|
tooltipColor, |
|
tooltipBg, |
|
tooltipBorderRadius, |
|
zIndexPopup, |
|
controlHeight, |
|
boxShadowSecondary, |
|
paddingSM, |
|
paddingXS, |
|
tooltipRadiusOuter, |
|
} = token; |
|
|
|
return [ |
|
{ |
|
[componentCls]: { |
|
...resetComponent(token), |
|
position: 'absolute', |
|
zIndex: zIndexPopup, |
|
display: 'block', |
|
'&': [{ width: 'max-content' }, { width: 'intrinsic' }], |
|
maxWidth: tooltipMaxWidth, |
|
visibility: 'visible', |
|
'&-hidden': { |
|
display: 'none', |
|
}, |
|
|
|
'--antd-arrow-background-color': tooltipBg, |
|
|
|
// Wrapper for the tooltip content |
|
[`${componentCls}-inner`]: { |
|
minWidth: controlHeight, |
|
minHeight: controlHeight, |
|
padding: `${paddingSM / 2}px ${paddingXS}px`, |
|
color: tooltipColor, |
|
textAlign: 'start', |
|
textDecoration: 'none', |
|
wordWrap: 'break-word', |
|
backgroundColor: tooltipBg, |
|
borderRadius: tooltipBorderRadius, |
|
boxShadow: boxShadowSecondary, |
|
}, |
|
|
|
// Limit left and right placement radius |
|
[[ |
|
`&-placement-left`, |
|
`&-placement-leftTop`, |
|
`&-placement-leftBottom`, |
|
`&-placement-right`, |
|
`&-placement-rightTop`, |
|
`&-placement-rightBottom`, |
|
].join(',')]: { |
|
[`${componentCls}-inner`]: { |
|
borderRadius: Math.min(tooltipBorderRadius, MAX_VERTICAL_CONTENT_RADIUS), |
|
}, |
|
}, |
|
|
|
[`${componentCls}-content`]: { |
|
position: 'relative', |
|
}, |
|
|
|
// generator for preset color |
|
...genPresetColor(token, (colorKey, { darkColor }) => ({ |
|
[`&${componentCls}-${colorKey}`]: { |
|
[`${componentCls}-inner`]: { |
|
backgroundColor: darkColor, |
|
}, |
|
[`${componentCls}-arrow`]: { |
|
'--antd-arrow-background-color': darkColor, |
|
}, |
|
}, |
|
})), |
|
|
|
// RTL |
|
'&-rtl': { |
|
direction: 'rtl', |
|
}, |
|
}, |
|
}, |
|
|
|
// Arrow Style |
|
getArrowStyle<TooltipToken>( |
|
mergeToken<TooltipToken>(token, { |
|
borderRadiusOuter: tooltipRadiusOuter, |
|
}), |
|
{ |
|
colorBg: 'var(--antd-arrow-background-color)', |
|
showArrowCls: '', |
|
contentRadius: tooltipBorderRadius, |
|
limitVerticalRadius: true, |
|
}, |
|
), |
|
|
|
// Pure Render |
|
{ |
|
[`${componentCls}-pure`]: { |
|
position: 'relative', |
|
maxWidth: 'none', |
|
}, |
|
}, |
|
]; |
|
}; |
|
|
|
// ============================== Export ============================== |
|
export default (prefixCls: Ref<string>, injectStyle: Ref<boolean>): UseComponentStyleResult => { |
|
const useOriginHook = genComponentStyleHook( |
|
'Tooltip', |
|
token => { |
|
// Popover use Tooltip as internal component. We do not need to handle this. |
|
if (injectStyle?.value === false) { |
|
return []; |
|
} |
|
|
|
const { borderRadius, colorTextLightSolid, colorBgDefault, borderRadiusOuter } = token; |
|
|
|
const TooltipToken = mergeToken<TooltipToken>(token, { |
|
// default variables |
|
tooltipMaxWidth: 250, |
|
tooltipColor: colorTextLightSolid, |
|
tooltipBorderRadius: borderRadius, |
|
tooltipBg: colorBgDefault, |
|
tooltipRadiusOuter: borderRadiusOuter > 4 ? 4 : borderRadiusOuter, |
|
}); |
|
|
|
return [genTooltipStyle(TooltipToken), initZoomMotion(token, 'zoom-big-fast')]; |
|
}, |
|
({ zIndexPopupBase, colorBgSpotlight }) => ({ |
|
zIndexPopup: zIndexPopupBase + 70, |
|
colorBgDefault: colorBgSpotlight, |
|
}), |
|
); |
|
|
|
return useOriginHook(prefixCls); |
|
};
|
|
|