floating-ui.utils.umd.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  3. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUIUtils = {}));
  5. })(this, (function (exports) { 'use strict';
  6. /**
  7. * Custom positioning reference element.
  8. * @see https://floating-ui.com/docs/virtual-elements
  9. */
  10. const sides = ['top', 'right', 'bottom', 'left'];
  11. const alignments = ['start', 'end'];
  12. const placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
  13. const min = Math.min;
  14. const max = Math.max;
  15. const round = Math.round;
  16. const floor = Math.floor;
  17. const createCoords = v => ({
  18. x: v,
  19. y: v
  20. });
  21. const oppositeSideMap = {
  22. left: 'right',
  23. right: 'left',
  24. bottom: 'top',
  25. top: 'bottom'
  26. };
  27. function clamp(start, value, end) {
  28. return max(start, min(value, end));
  29. }
  30. function evaluate(value, param) {
  31. return typeof value === 'function' ? value(param) : value;
  32. }
  33. function getSide(placement) {
  34. return placement.split('-')[0];
  35. }
  36. function getAlignment(placement) {
  37. return placement.split('-')[1];
  38. }
  39. function getOppositeAxis(axis) {
  40. return axis === 'x' ? 'y' : 'x';
  41. }
  42. function getAxisLength(axis) {
  43. return axis === 'y' ? 'height' : 'width';
  44. }
  45. function getSideAxis(placement) {
  46. const firstChar = placement[0];
  47. return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';
  48. }
  49. function getAlignmentAxis(placement) {
  50. return getOppositeAxis(getSideAxis(placement));
  51. }
  52. function getAlignmentSides(placement, rects, rtl) {
  53. if (rtl === void 0) {
  54. rtl = false;
  55. }
  56. const alignment = getAlignment(placement);
  57. const alignmentAxis = getAlignmentAxis(placement);
  58. const length = getAxisLength(alignmentAxis);
  59. let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';
  60. if (rects.reference[length] > rects.floating[length]) {
  61. mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
  62. }
  63. return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
  64. }
  65. function getExpandedPlacements(placement) {
  66. const oppositePlacement = getOppositePlacement(placement);
  67. return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
  68. }
  69. function getOppositeAlignmentPlacement(placement) {
  70. return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');
  71. }
  72. const lrPlacement = ['left', 'right'];
  73. const rlPlacement = ['right', 'left'];
  74. const tbPlacement = ['top', 'bottom'];
  75. const btPlacement = ['bottom', 'top'];
  76. function getSideList(side, isStart, rtl) {
  77. switch (side) {
  78. case 'top':
  79. case 'bottom':
  80. if (rtl) return isStart ? rlPlacement : lrPlacement;
  81. return isStart ? lrPlacement : rlPlacement;
  82. case 'left':
  83. case 'right':
  84. return isStart ? tbPlacement : btPlacement;
  85. default:
  86. return [];
  87. }
  88. }
  89. function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
  90. const alignment = getAlignment(placement);
  91. let list = getSideList(getSide(placement), direction === 'start', rtl);
  92. if (alignment) {
  93. list = list.map(side => side + "-" + alignment);
  94. if (flipAlignment) {
  95. list = list.concat(list.map(getOppositeAlignmentPlacement));
  96. }
  97. }
  98. return list;
  99. }
  100. function getOppositePlacement(placement) {
  101. const side = getSide(placement);
  102. return oppositeSideMap[side] + placement.slice(side.length);
  103. }
  104. function expandPaddingObject(padding) {
  105. return {
  106. top: 0,
  107. right: 0,
  108. bottom: 0,
  109. left: 0,
  110. ...padding
  111. };
  112. }
  113. function getPaddingObject(padding) {
  114. return typeof padding !== 'number' ? expandPaddingObject(padding) : {
  115. top: padding,
  116. right: padding,
  117. bottom: padding,
  118. left: padding
  119. };
  120. }
  121. function rectToClientRect(rect) {
  122. const {
  123. x,
  124. y,
  125. width,
  126. height
  127. } = rect;
  128. return {
  129. width,
  130. height,
  131. top: y,
  132. left: x,
  133. right: x + width,
  134. bottom: y + height,
  135. x,
  136. y
  137. };
  138. }
  139. exports.alignments = alignments;
  140. exports.clamp = clamp;
  141. exports.createCoords = createCoords;
  142. exports.evaluate = evaluate;
  143. exports.expandPaddingObject = expandPaddingObject;
  144. exports.floor = floor;
  145. exports.getAlignment = getAlignment;
  146. exports.getAlignmentAxis = getAlignmentAxis;
  147. exports.getAlignmentSides = getAlignmentSides;
  148. exports.getAxisLength = getAxisLength;
  149. exports.getExpandedPlacements = getExpandedPlacements;
  150. exports.getOppositeAlignmentPlacement = getOppositeAlignmentPlacement;
  151. exports.getOppositeAxis = getOppositeAxis;
  152. exports.getOppositeAxisPlacements = getOppositeAxisPlacements;
  153. exports.getOppositePlacement = getOppositePlacement;
  154. exports.getPaddingObject = getPaddingObject;
  155. exports.getSide = getSide;
  156. exports.getSideAxis = getSideAxis;
  157. exports.max = max;
  158. exports.min = min;
  159. exports.placements = placements;
  160. exports.rectToClientRect = rectToClientRect;
  161. exports.round = round;
  162. exports.sides = sides;
  163. }));