placementArrow.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { unit } from '@ant-design/cssinjs';
  2. import { genRoundedArrow } from './roundedArrow';
  3. export const MAX_VERTICAL_CONTENT_RADIUS = 8;
  4. export function getArrowOffsetToken(options) {
  5. const {
  6. contentRadius,
  7. limitVerticalRadius
  8. } = options;
  9. const arrowOffset = contentRadius > 12 ? contentRadius + 2 : 12;
  10. const arrowOffsetVertical = limitVerticalRadius ? MAX_VERTICAL_CONTENT_RADIUS : arrowOffset;
  11. return {
  12. arrowOffsetHorizontal: arrowOffset,
  13. arrowOffsetVertical
  14. };
  15. }
  16. function isInject(valid, code) {
  17. if (!valid) {
  18. return {};
  19. }
  20. return code;
  21. }
  22. export default function getArrowStyle(token, colorBg, options) {
  23. const {
  24. componentCls,
  25. boxShadowPopoverArrow,
  26. arrowOffsetVertical,
  27. arrowOffsetHorizontal
  28. } = token;
  29. const {
  30. arrowDistance = 0,
  31. arrowPlacement = {
  32. left: true,
  33. right: true,
  34. top: true,
  35. bottom: true
  36. }
  37. } = options || {};
  38. return {
  39. [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign({
  40. // ============================ Basic ============================
  41. [`${componentCls}-arrow`]: [Object.assign(Object.assign({
  42. position: 'absolute',
  43. zIndex: 1,
  44. display: 'block'
  45. }, genRoundedArrow(token, colorBg, boxShadowPopoverArrow)), {
  46. '&:before': {
  47. background: colorBg
  48. }
  49. })]
  50. }, isInject(!!arrowPlacement.top, {
  51. [[`&-placement-top > ${componentCls}-arrow`, `&-placement-topLeft > ${componentCls}-arrow`, `&-placement-topRight > ${componentCls}-arrow`].join(',')]: {
  52. bottom: arrowDistance,
  53. transform: 'translateY(100%) rotate(180deg)'
  54. },
  55. [`&-placement-top > ${componentCls}-arrow`]: {
  56. left: {
  57. _skip_check_: true,
  58. value: '50%'
  59. },
  60. transform: 'translateX(-50%) translateY(100%) rotate(180deg)'
  61. },
  62. '&-placement-topLeft': {
  63. '--arrow-offset-horizontal': arrowOffsetHorizontal,
  64. [`> ${componentCls}-arrow`]: {
  65. left: {
  66. _skip_check_: true,
  67. value: arrowOffsetHorizontal
  68. }
  69. }
  70. },
  71. '&-placement-topRight': {
  72. '--arrow-offset-horizontal': `calc(100% - ${unit(arrowOffsetHorizontal)})`,
  73. [`> ${componentCls}-arrow`]: {
  74. right: {
  75. _skip_check_: true,
  76. value: arrowOffsetHorizontal
  77. }
  78. }
  79. }
  80. })), isInject(!!arrowPlacement.bottom, {
  81. [[`&-placement-bottom > ${componentCls}-arrow`, `&-placement-bottomLeft > ${componentCls}-arrow`, `&-placement-bottomRight > ${componentCls}-arrow`].join(',')]: {
  82. top: arrowDistance,
  83. transform: `translateY(-100%)`
  84. },
  85. [`&-placement-bottom > ${componentCls}-arrow`]: {
  86. left: {
  87. _skip_check_: true,
  88. value: '50%'
  89. },
  90. transform: `translateX(-50%) translateY(-100%)`
  91. },
  92. '&-placement-bottomLeft': {
  93. '--arrow-offset-horizontal': arrowOffsetHorizontal,
  94. [`> ${componentCls}-arrow`]: {
  95. left: {
  96. _skip_check_: true,
  97. value: arrowOffsetHorizontal
  98. }
  99. }
  100. },
  101. '&-placement-bottomRight': {
  102. '--arrow-offset-horizontal': `calc(100% - ${unit(arrowOffsetHorizontal)})`,
  103. [`> ${componentCls}-arrow`]: {
  104. right: {
  105. _skip_check_: true,
  106. value: arrowOffsetHorizontal
  107. }
  108. }
  109. }
  110. })), isInject(!!arrowPlacement.left, {
  111. [[`&-placement-left > ${componentCls}-arrow`, `&-placement-leftTop > ${componentCls}-arrow`, `&-placement-leftBottom > ${componentCls}-arrow`].join(',')]: {
  112. right: {
  113. _skip_check_: true,
  114. value: arrowDistance
  115. },
  116. transform: 'translateX(100%) rotate(90deg)'
  117. },
  118. [`&-placement-left > ${componentCls}-arrow`]: {
  119. top: {
  120. _skip_check_: true,
  121. value: '50%'
  122. },
  123. transform: 'translateY(-50%) translateX(100%) rotate(90deg)'
  124. },
  125. [`&-placement-leftTop > ${componentCls}-arrow`]: {
  126. top: arrowOffsetVertical
  127. },
  128. [`&-placement-leftBottom > ${componentCls}-arrow`]: {
  129. bottom: arrowOffsetVertical
  130. }
  131. })), isInject(!!arrowPlacement.right, {
  132. [[`&-placement-right > ${componentCls}-arrow`, `&-placement-rightTop > ${componentCls}-arrow`, `&-placement-rightBottom > ${componentCls}-arrow`].join(',')]: {
  133. left: {
  134. _skip_check_: true,
  135. value: arrowDistance
  136. },
  137. transform: 'translateX(-100%) rotate(-90deg)'
  138. },
  139. [`&-placement-right > ${componentCls}-arrow`]: {
  140. top: {
  141. _skip_check_: true,
  142. value: '50%'
  143. },
  144. transform: 'translateY(-50%) translateX(-100%) rotate(-90deg)'
  145. },
  146. [`&-placement-rightTop > ${componentCls}-arrow`]: {
  147. top: arrowOffsetVertical
  148. },
  149. [`&-placement-rightBottom > ${componentCls}-arrow`]: {
  150. bottom: arrowOffsetVertical
  151. }
  152. }))
  153. };
  154. }