placementArrow.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.MAX_VERTICAL_CONTENT_RADIUS = void 0;
  7. exports.default = getArrowStyle;
  8. exports.getArrowOffset = getArrowOffset;
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _roundedArrow = require("./roundedArrow");
  11. function connectArrowCls(classList) {
  12. let showArrowCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  13. return classList.map(cls => `${showArrowCls}${cls}`).join(',');
  14. }
  15. const MAX_VERTICAL_CONTENT_RADIUS = exports.MAX_VERTICAL_CONTENT_RADIUS = 8;
  16. function getArrowOffset(options) {
  17. const maxVerticalContentRadius = MAX_VERTICAL_CONTENT_RADIUS;
  18. const {
  19. sizePopupArrow,
  20. contentRadius,
  21. borderRadiusOuter,
  22. limitVerticalRadius
  23. } = options;
  24. const arrowInnerOffset = sizePopupArrow / 2 - Math.ceil(borderRadiusOuter * (Math.sqrt(2) - 1));
  25. const dropdownArrowOffset = (contentRadius > 12 ? contentRadius + 2 : 12) - arrowInnerOffset;
  26. const dropdownArrowOffsetVertical = limitVerticalRadius ? maxVerticalContentRadius - arrowInnerOffset : dropdownArrowOffset;
  27. return {
  28. dropdownArrowOffset,
  29. dropdownArrowOffsetVertical
  30. };
  31. }
  32. function getArrowStyle(token, options) {
  33. const {
  34. componentCls,
  35. sizePopupArrow,
  36. marginXXS,
  37. borderRadiusXS,
  38. borderRadiusOuter,
  39. boxShadowPopoverArrow
  40. } = token;
  41. const {
  42. colorBg,
  43. showArrowCls,
  44. contentRadius = token.borderRadiusLG,
  45. limitVerticalRadius
  46. } = options;
  47. const {
  48. dropdownArrowOffsetVertical,
  49. dropdownArrowOffset
  50. } = getArrowOffset({
  51. sizePopupArrow,
  52. contentRadius,
  53. borderRadiusOuter,
  54. limitVerticalRadius
  55. });
  56. const dropdownArrowDistance = sizePopupArrow / 2 + marginXXS;
  57. return {
  58. [componentCls]: {
  59. // ============================ Basic ============================
  60. [`${componentCls}-arrow`]: [(0, _extends2.default)((0, _extends2.default)({
  61. position: 'absolute',
  62. zIndex: 1,
  63. display: 'block'
  64. }, (0, _roundedArrow.roundedArrow)(sizePopupArrow, borderRadiusXS, borderRadiusOuter, colorBg, boxShadowPopoverArrow)), {
  65. '&:before': {
  66. background: colorBg
  67. }
  68. })],
  69. // ========================== Placement ==========================
  70. // Here handle the arrow position and rotate stuff
  71. // >>>>> Top
  72. [[`&-placement-top ${componentCls}-arrow`, `&-placement-topLeft ${componentCls}-arrow`, `&-placement-topRight ${componentCls}-arrow`].join(',')]: {
  73. bottom: 0,
  74. transform: 'translateY(100%) rotate(180deg)'
  75. },
  76. [`&-placement-top ${componentCls}-arrow`]: {
  77. left: {
  78. _skip_check_: true,
  79. value: '50%'
  80. },
  81. transform: 'translateX(-50%) translateY(100%) rotate(180deg)'
  82. },
  83. [`&-placement-topLeft ${componentCls}-arrow`]: {
  84. left: {
  85. _skip_check_: true,
  86. value: dropdownArrowOffset
  87. }
  88. },
  89. [`&-placement-topRight ${componentCls}-arrow`]: {
  90. right: {
  91. _skip_check_: true,
  92. value: dropdownArrowOffset
  93. }
  94. },
  95. // >>>>> Bottom
  96. [[`&-placement-bottom ${componentCls}-arrow`, `&-placement-bottomLeft ${componentCls}-arrow`, `&-placement-bottomRight ${componentCls}-arrow`].join(',')]: {
  97. top: 0,
  98. transform: `translateY(-100%)`
  99. },
  100. [`&-placement-bottom ${componentCls}-arrow`]: {
  101. left: {
  102. _skip_check_: true,
  103. value: '50%'
  104. },
  105. transform: `translateX(-50%) translateY(-100%)`
  106. },
  107. [`&-placement-bottomLeft ${componentCls}-arrow`]: {
  108. left: {
  109. _skip_check_: true,
  110. value: dropdownArrowOffset
  111. }
  112. },
  113. [`&-placement-bottomRight ${componentCls}-arrow`]: {
  114. right: {
  115. _skip_check_: true,
  116. value: dropdownArrowOffset
  117. }
  118. },
  119. // >>>>> Left
  120. [[`&-placement-left ${componentCls}-arrow`, `&-placement-leftTop ${componentCls}-arrow`, `&-placement-leftBottom ${componentCls}-arrow`].join(',')]: {
  121. right: {
  122. _skip_check_: true,
  123. value: 0
  124. },
  125. transform: 'translateX(100%) rotate(90deg)'
  126. },
  127. [`&-placement-left ${componentCls}-arrow`]: {
  128. top: {
  129. _skip_check_: true,
  130. value: '50%'
  131. },
  132. transform: 'translateY(-50%) translateX(100%) rotate(90deg)'
  133. },
  134. [`&-placement-leftTop ${componentCls}-arrow`]: {
  135. top: dropdownArrowOffsetVertical
  136. },
  137. [`&-placement-leftBottom ${componentCls}-arrow`]: {
  138. bottom: dropdownArrowOffsetVertical
  139. },
  140. // >>>>> Right
  141. [[`&-placement-right ${componentCls}-arrow`, `&-placement-rightTop ${componentCls}-arrow`, `&-placement-rightBottom ${componentCls}-arrow`].join(',')]: {
  142. left: {
  143. _skip_check_: true,
  144. value: 0
  145. },
  146. transform: 'translateX(-100%) rotate(-90deg)'
  147. },
  148. [`&-placement-right ${componentCls}-arrow`]: {
  149. top: {
  150. _skip_check_: true,
  151. value: '50%'
  152. },
  153. transform: 'translateY(-50%) translateX(-100%) rotate(-90deg)'
  154. },
  155. [`&-placement-rightTop ${componentCls}-arrow`]: {
  156. top: dropdownArrowOffsetVertical
  157. },
  158. [`&-placement-rightBottom ${componentCls}-arrow`]: {
  159. bottom: dropdownArrowOffsetVertical
  160. },
  161. // =========================== Offset ============================
  162. // Offset the popover to account for the dropdown arrow
  163. // >>>>> Top
  164. [connectArrowCls([`&-placement-topLeft`, `&-placement-top`, `&-placement-topRight`].map(cls => cls += ':not(&-arrow-hidden)'), showArrowCls)]: {
  165. paddingBottom: dropdownArrowDistance
  166. },
  167. // >>>>> Bottom
  168. [connectArrowCls([`&-placement-bottomLeft`, `&-placement-bottom`, `&-placement-bottomRight`].map(cls => cls += ':not(&-arrow-hidden)'), showArrowCls)]: {
  169. paddingTop: dropdownArrowDistance
  170. },
  171. // >>>>> Left
  172. [connectArrowCls([`&-placement-leftTop`, `&-placement-left`, `&-placement-leftBottom`].map(cls => cls += ':not(&-arrow-hidden)'), showArrowCls)]: {
  173. paddingRight: {
  174. _skip_check_: true,
  175. value: dropdownArrowDistance
  176. }
  177. },
  178. // >>>>> Right
  179. [connectArrowCls([`&-placement-rightTop`, `&-placement-right`, `&-placement-rightBottom`].map(cls => cls += ':not(&-arrow-hidden)'), showArrowCls)]: {
  180. paddingLeft: {
  181. _skip_check_: true,
  182. value: dropdownArrowDistance
  183. }
  184. }
  185. }
  186. };
  187. }