You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.9 KiB

2 months ago
  1. import { top, bottom, left, right } from "../enums.js";
  2. import detectOverflow from "../utils/detectOverflow.js";
  3. function getSideOffsets(overflow, rect, preventedOffsets) {
  4. if (preventedOffsets === void 0) {
  5. preventedOffsets = {
  6. x: 0,
  7. y: 0
  8. };
  9. }
  10. return {
  11. top: overflow.top - rect.height - preventedOffsets.y,
  12. right: overflow.right - rect.width + preventedOffsets.x,
  13. bottom: overflow.bottom - rect.height + preventedOffsets.y,
  14. left: overflow.left - rect.width - preventedOffsets.x
  15. };
  16. }
  17. function isAnySideFullyClipped(overflow) {
  18. return [top, right, bottom, left].some(function (side) {
  19. return overflow[side] >= 0;
  20. });
  21. }
  22. function hide(_ref) {
  23. var state = _ref.state,
  24. name = _ref.name;
  25. var referenceRect = state.rects.reference;
  26. var popperRect = state.rects.popper;
  27. var preventedOffsets = state.modifiersData.preventOverflow;
  28. var referenceOverflow = detectOverflow(state, {
  29. elementContext: 'reference'
  30. });
  31. var popperAltOverflow = detectOverflow(state, {
  32. altBoundary: true
  33. });
  34. var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
  35. var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
  36. var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
  37. var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
  38. state.modifiersData[name] = {
  39. referenceClippingOffsets: referenceClippingOffsets,
  40. popperEscapeOffsets: popperEscapeOffsets,
  41. isReferenceHidden: isReferenceHidden,
  42. hasPopperEscaped: hasPopperEscaped
  43. };
  44. state.attributes.popper = Object.assign({}, state.attributes.popper, {
  45. 'data-popper-reference-hidden': isReferenceHidden,
  46. 'data-popper-escaped': hasPopperEscaped
  47. });
  48. } // eslint-disable-next-line import/no-unused-modules
  49. export default {
  50. name: 'hide',
  51. enabled: true,
  52. phase: 'main',
  53. requiresIfExists: ['preventOverflow'],
  54. fn: hide
  55. };