index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { unit } from '@ant-design/cssinjs';
  2. import { resetComponent } from '../../style';
  3. import { initZoomMotion } from '../../style/motion';
  4. import getArrowStyle, { getArrowOffsetToken, MAX_VERTICAL_CONTENT_RADIUS } from '../../style/placementArrow';
  5. import { getArrowToken } from '../../style/roundedArrow';
  6. import { genPresetColor, genStyleHooks, mergeToken } from '../../theme/internal';
  7. const genTooltipStyle = token => {
  8. const {
  9. calc,
  10. componentCls,
  11. // ant-tooltip
  12. tooltipMaxWidth,
  13. tooltipColor,
  14. tooltipBg,
  15. tooltipBorderRadius,
  16. zIndexPopup,
  17. controlHeight,
  18. boxShadowSecondary,
  19. paddingSM,
  20. paddingXS,
  21. arrowOffsetHorizontal,
  22. sizePopupArrow
  23. } = token;
  24. // arrowOffsetHorizontal + arrowWidth + borderRadius
  25. const edgeAlignMinWidth = calc(tooltipBorderRadius).add(sizePopupArrow).add(arrowOffsetHorizontal).equal();
  26. // borderRadius * 2 + arrowWidth
  27. const centerAlignMinWidth = calc(tooltipBorderRadius).mul(2).add(sizePopupArrow).equal();
  28. return [{
  29. [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), {
  30. position: 'absolute',
  31. zIndex: zIndexPopup,
  32. display: 'block',
  33. width: 'max-content',
  34. maxWidth: tooltipMaxWidth,
  35. visibility: 'visible',
  36. // When use `autoArrow`, origin will follow the arrow position
  37. '--valid-offset-x': 'var(--arrow-offset-horizontal, var(--arrow-x))',
  38. transformOrigin: [`var(--valid-offset-x, 50%)`, `var(--arrow-y, 50%)`].join(' '),
  39. '&-hidden': {
  40. display: 'none'
  41. },
  42. '--antd-arrow-background-color': tooltipBg,
  43. // Wrapper for the tooltip content
  44. [`${componentCls}-inner`]: {
  45. minWidth: centerAlignMinWidth,
  46. minHeight: controlHeight,
  47. padding: `${unit(token.calc(paddingSM).div(2).equal())} ${unit(paddingXS)}`,
  48. color: `var(--ant-tooltip-color, ${tooltipColor})`,
  49. textAlign: 'start',
  50. textDecoration: 'none',
  51. wordWrap: 'break-word',
  52. backgroundColor: tooltipBg,
  53. borderRadius: tooltipBorderRadius,
  54. boxShadow: boxShadowSecondary,
  55. boxSizing: 'border-box'
  56. },
  57. // Align placement should have another min width
  58. [[`&-placement-topLeft`, `&-placement-topRight`, `&-placement-bottomLeft`, `&-placement-bottomRight`].join(',')]: {
  59. minWidth: edgeAlignMinWidth
  60. },
  61. // Limit left and right placement radius
  62. [[`&-placement-left`, `&-placement-leftTop`, `&-placement-leftBottom`, `&-placement-right`, `&-placement-rightTop`, `&-placement-rightBottom`].join(',')]: {
  63. [`${componentCls}-inner`]: {
  64. borderRadius: token.min(tooltipBorderRadius, MAX_VERTICAL_CONTENT_RADIUS)
  65. }
  66. },
  67. [`${componentCls}-content`]: {
  68. position: 'relative'
  69. }
  70. }), genPresetColor(token, (colorKey, {
  71. darkColor
  72. }) => ({
  73. [`&${componentCls}-${colorKey}`]: {
  74. [`${componentCls}-inner`]: {
  75. backgroundColor: darkColor
  76. },
  77. [`${componentCls}-arrow`]: {
  78. '--antd-arrow-background-color': darkColor
  79. }
  80. }
  81. }))), {
  82. // RTL
  83. '&-rtl': {
  84. direction: 'rtl'
  85. }
  86. })
  87. },
  88. // Arrow Style
  89. getArrowStyle(token, 'var(--antd-arrow-background-color)'),
  90. // Pure Render
  91. {
  92. [`${componentCls}-pure`]: {
  93. position: 'relative',
  94. maxWidth: 'none',
  95. margin: token.sizePopupArrow
  96. }
  97. }];
  98. };
  99. // ============================== Export ==============================
  100. export const prepareComponentToken = token => Object.assign(Object.assign({
  101. zIndexPopup: token.zIndexPopupBase + 70
  102. }, getArrowOffsetToken({
  103. contentRadius: token.borderRadius,
  104. limitVerticalRadius: true
  105. })), getArrowToken(mergeToken(token, {
  106. borderRadiusOuter: Math.min(token.borderRadiusOuter, 4)
  107. })));
  108. export default (prefixCls, injectStyle = true) => {
  109. const useStyle = genStyleHooks('Tooltip', token => {
  110. const {
  111. borderRadius,
  112. colorTextLightSolid,
  113. colorBgSpotlight
  114. } = token;
  115. const TooltipToken = mergeToken(token, {
  116. // default variables
  117. tooltipMaxWidth: 250,
  118. tooltipColor: colorTextLightSolid,
  119. tooltipBorderRadius: borderRadius,
  120. tooltipBg: colorBgSpotlight
  121. });
  122. return [genTooltipStyle(TooltipToken), initZoomMotion(token, 'zoom-big-fast')];
  123. }, prepareComponentToken, {
  124. resetStyle: false,
  125. // Popover use Tooltip as internal component. We do not need to handle this.
  126. injectStyle
  127. });
  128. return useStyle(prefixCls);
  129. };