floating-ui.utils.umd.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. const oppositeAlignmentMap = {
  28. start: 'end',
  29. end: 'start'
  30. };
  31. function clamp(start, value, end) {
  32. return max(start, min(value, end));
  33. }
  34. function evaluate(value, param) {
  35. return typeof value === 'function' ? value(param) : value;
  36. }
  37. function getSide(placement) {
  38. return placement.split('-')[0];
  39. }
  40. function getAlignment(placement) {
  41. return placement.split('-')[1];
  42. }
  43. function getOppositeAxis(axis) {
  44. return axis === 'x' ? 'y' : 'x';
  45. }
  46. function getAxisLength(axis) {
  47. return axis === 'y' ? 'height' : 'width';
  48. }
  49. const yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);
  50. function getSideAxis(placement) {
  51. return yAxisSides.has(getSide(placement)) ? 'y' : 'x';
  52. }
  53. function getAlignmentAxis(placement) {
  54. return getOppositeAxis(getSideAxis(placement));
  55. }
  56. function getAlignmentSides(placement, rects, rtl) {
  57. if (rtl === void 0) {
  58. rtl = false;
  59. }
  60. const alignment = getAlignment(placement);
  61. const alignmentAxis = getAlignmentAxis(placement);
  62. const length = getAxisLength(alignmentAxis);
  63. let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';
  64. if (rects.reference[length] > rects.floating[length]) {
  65. mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
  66. }
  67. return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
  68. }
  69. function getExpandedPlacements(placement) {
  70. const oppositePlacement = getOppositePlacement(placement);
  71. return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
  72. }
  73. function getOppositeAlignmentPlacement(placement) {
  74. return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);
  75. }
  76. const lrPlacement = ['left', 'right'];
  77. const rlPlacement = ['right', 'left'];
  78. const tbPlacement = ['top', 'bottom'];
  79. const btPlacement = ['bottom', 'top'];
  80. function getSideList(side, isStart, rtl) {
  81. switch (side) {
  82. case 'top':
  83. case 'bottom':
  84. if (rtl) return isStart ? rlPlacement : lrPlacement;
  85. return isStart ? lrPlacement : rlPlacement;
  86. case 'left':
  87. case 'right':
  88. return isStart ? tbPlacement : btPlacement;
  89. default:
  90. return [];
  91. }
  92. }
  93. function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
  94. const alignment = getAlignment(placement);
  95. let list = getSideList(getSide(placement), direction === 'start', rtl);
  96. if (alignment) {
  97. list = list.map(side => side + "-" + alignment);
  98. if (flipAlignment) {
  99. list = list.concat(list.map(getOppositeAlignmentPlacement));
  100. }
  101. }
  102. return list;
  103. }
  104. function getOppositePlacement(placement) {
  105. return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);
  106. }
  107. function expandPaddingObject(padding) {
  108. return {
  109. top: 0,
  110. right: 0,
  111. bottom: 0,
  112. left: 0,
  113. ...padding
  114. };
  115. }
  116. function getPaddingObject(padding) {
  117. return typeof padding !== 'number' ? expandPaddingObject(padding) : {
  118. top: padding,
  119. right: padding,
  120. bottom: padding,
  121. left: padding
  122. };
  123. }
  124. function rectToClientRect(rect) {
  125. const {
  126. x,
  127. y,
  128. width,
  129. height
  130. } = rect;
  131. return {
  132. width,
  133. height,
  134. top: y,
  135. left: x,
  136. right: x + width,
  137. bottom: y + height,
  138. x,
  139. y
  140. };
  141. }
  142. exports.alignments = alignments;
  143. exports.clamp = clamp;
  144. exports.createCoords = createCoords;
  145. exports.evaluate = evaluate;
  146. exports.expandPaddingObject = expandPaddingObject;
  147. exports.floor = floor;
  148. exports.getAlignment = getAlignment;
  149. exports.getAlignmentAxis = getAlignmentAxis;
  150. exports.getAlignmentSides = getAlignmentSides;
  151. exports.getAxisLength = getAxisLength;
  152. exports.getExpandedPlacements = getExpandedPlacements;
  153. exports.getOppositeAlignmentPlacement = getOppositeAlignmentPlacement;
  154. exports.getOppositeAxis = getOppositeAxis;
  155. exports.getOppositeAxisPlacements = getOppositeAxisPlacements;
  156. exports.getOppositePlacement = getOppositePlacement;
  157. exports.getPaddingObject = getPaddingObject;
  158. exports.getSide = getSide;
  159. exports.getSideAxis = getSideAxis;
  160. exports.max = max;
  161. exports.min = min;
  162. exports.placements = placements;
  163. exports.rectToClientRect = rectToClientRect;
  164. exports.round = round;
  165. exports.sides = sides;
  166. }));