content2.mjs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import { defineComponent, ref, inject, computed, onBeforeUnmount, unref, watch, openBlock, createBlock, withCtx, createVNode, Transition, withDirectives, mergeProps, renderSlot, vShow, createCommentVNode } from 'vue';
  2. import { onClickOutside } from '@vueuse/core';
  3. import '../../popper/index.mjs';
  4. import { ElTeleport } from '../../teleport/index.mjs';
  5. import { TOOLTIP_INJECTION_KEY } from './constants.mjs';
  6. import { useTooltipContentProps } from './content.mjs';
  7. import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
  8. import { usePopperContainerId } from '../../../hooks/use-popper-container/index.mjs';
  9. import ElPopperContent from '../../popper/src/content2.mjs';
  10. import { tryFocus } from '../../focus-trap/src/utils.mjs';
  11. import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
  12. import { composeEventHandlers } from '../../../utils/dom/event.mjs';
  13. const __default__ = defineComponent({
  14. name: "ElTooltipContent",
  15. inheritAttrs: false
  16. });
  17. const _sfc_main = /* @__PURE__ */ defineComponent({
  18. ...__default__,
  19. props: useTooltipContentProps,
  20. setup(__props, { expose }) {
  21. const props = __props;
  22. const { selector } = usePopperContainerId();
  23. const ns = useNamespace("tooltip");
  24. const contentRef = ref();
  25. let stopHandle;
  26. const {
  27. controlled,
  28. id,
  29. open,
  30. trigger,
  31. onClose,
  32. onOpen,
  33. onShow,
  34. onHide,
  35. onBeforeShow,
  36. onBeforeHide
  37. } = inject(TOOLTIP_INJECTION_KEY, void 0);
  38. const transitionClass = computed(() => {
  39. return props.transition || `${ns.namespace.value}-fade-in-linear`;
  40. });
  41. const persistentRef = computed(() => {
  42. if (process.env.NODE_ENV === "test") {
  43. return true;
  44. }
  45. return props.persistent;
  46. });
  47. onBeforeUnmount(() => {
  48. stopHandle == null ? void 0 : stopHandle();
  49. });
  50. const shouldRender = computed(() => {
  51. return unref(persistentRef) ? true : unref(open);
  52. });
  53. const shouldShow = computed(() => {
  54. return props.disabled ? false : unref(open);
  55. });
  56. const appendTo = computed(() => {
  57. return props.appendTo || selector.value;
  58. });
  59. const contentStyle = computed(() => {
  60. var _a;
  61. return (_a = props.style) != null ? _a : {};
  62. });
  63. const ariaHidden = ref(true);
  64. const onTransitionLeave = () => {
  65. onHide();
  66. isFocusInsideContent() && tryFocus(document.body);
  67. ariaHidden.value = true;
  68. };
  69. const stopWhenControlled = () => {
  70. if (unref(controlled))
  71. return true;
  72. };
  73. const onContentEnter = composeEventHandlers(stopWhenControlled, () => {
  74. if (props.enterable && unref(trigger) === "hover") {
  75. onOpen();
  76. }
  77. });
  78. const onContentLeave = composeEventHandlers(stopWhenControlled, () => {
  79. if (unref(trigger) === "hover") {
  80. onClose();
  81. }
  82. });
  83. const onBeforeEnter = () => {
  84. var _a, _b;
  85. (_b = (_a = contentRef.value) == null ? void 0 : _a.updatePopper) == null ? void 0 : _b.call(_a);
  86. onBeforeShow == null ? void 0 : onBeforeShow();
  87. };
  88. const onBeforeLeave = () => {
  89. onBeforeHide == null ? void 0 : onBeforeHide();
  90. };
  91. const onAfterShow = () => {
  92. onShow();
  93. stopHandle = onClickOutside(computed(() => {
  94. var _a;
  95. return (_a = contentRef.value) == null ? void 0 : _a.popperContentRef;
  96. }), () => {
  97. if (unref(controlled))
  98. return;
  99. const $trigger = unref(trigger);
  100. if ($trigger !== "hover") {
  101. onClose();
  102. }
  103. });
  104. };
  105. const onBlur = () => {
  106. if (!props.virtualTriggering) {
  107. onClose();
  108. }
  109. };
  110. const isFocusInsideContent = (event) => {
  111. var _a;
  112. const popperContent = (_a = contentRef.value) == null ? void 0 : _a.popperContentRef;
  113. const activeElement = (event == null ? void 0 : event.relatedTarget) || document.activeElement;
  114. return popperContent == null ? void 0 : popperContent.contains(activeElement);
  115. };
  116. watch(() => unref(open), (val) => {
  117. if (!val) {
  118. stopHandle == null ? void 0 : stopHandle();
  119. } else {
  120. ariaHidden.value = false;
  121. }
  122. }, {
  123. flush: "post"
  124. });
  125. watch(() => props.content, () => {
  126. var _a, _b;
  127. (_b = (_a = contentRef.value) == null ? void 0 : _a.updatePopper) == null ? void 0 : _b.call(_a);
  128. });
  129. expose({
  130. contentRef,
  131. isFocusInsideContent
  132. });
  133. return (_ctx, _cache) => {
  134. return openBlock(), createBlock(unref(ElTeleport), {
  135. disabled: !_ctx.teleported,
  136. to: unref(appendTo)
  137. }, {
  138. default: withCtx(() => [
  139. createVNode(Transition, {
  140. name: unref(transitionClass),
  141. onAfterLeave: onTransitionLeave,
  142. onBeforeEnter,
  143. onAfterEnter: onAfterShow,
  144. onBeforeLeave
  145. }, {
  146. default: withCtx(() => [
  147. unref(shouldRender) ? withDirectives((openBlock(), createBlock(unref(ElPopperContent), mergeProps({
  148. key: 0,
  149. id: unref(id),
  150. ref_key: "contentRef",
  151. ref: contentRef
  152. }, _ctx.$attrs, {
  153. "aria-label": _ctx.ariaLabel,
  154. "aria-hidden": ariaHidden.value,
  155. "boundaries-padding": _ctx.boundariesPadding,
  156. "fallback-placements": _ctx.fallbackPlacements,
  157. "gpu-acceleration": _ctx.gpuAcceleration,
  158. offset: _ctx.offset,
  159. placement: _ctx.placement,
  160. "popper-options": _ctx.popperOptions,
  161. strategy: _ctx.strategy,
  162. effect: _ctx.effect,
  163. enterable: _ctx.enterable,
  164. pure: _ctx.pure,
  165. "popper-class": _ctx.popperClass,
  166. "popper-style": [_ctx.popperStyle, unref(contentStyle)],
  167. "reference-el": _ctx.referenceEl,
  168. "trigger-target-el": _ctx.triggerTargetEl,
  169. visible: unref(shouldShow),
  170. "z-index": _ctx.zIndex,
  171. onMouseenter: unref(onContentEnter),
  172. onMouseleave: unref(onContentLeave),
  173. onBlur,
  174. onClose: unref(onClose)
  175. }), {
  176. default: withCtx(() => [
  177. renderSlot(_ctx.$slots, "default")
  178. ]),
  179. _: 3
  180. }, 16, ["id", "aria-label", "aria-hidden", "boundaries-padding", "fallback-placements", "gpu-acceleration", "offset", "placement", "popper-options", "strategy", "effect", "enterable", "pure", "popper-class", "popper-style", "reference-el", "trigger-target-el", "visible", "z-index", "onMouseenter", "onMouseleave", "onClose"])), [
  181. [vShow, unref(shouldShow)]
  182. ]) : createCommentVNode("v-if", true)
  183. ]),
  184. _: 3
  185. }, 8, ["name"])
  186. ]),
  187. _: 3
  188. }, 8, ["disabled", "to"]);
  189. };
  190. }
  191. });
  192. var ElTooltipContent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "content.vue"]]);
  193. export { ElTooltipContent as default };
  194. //# sourceMappingURL=content2.mjs.map