react-tooltip 6.0.4 → 6.0.5-beta.1278.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -257,7 +257,7 @@
257
257
  function resolveDataTooltipAnchor(targetElement, tooltipId) {
258
258
  let currentElement = targetElement;
259
259
  while (currentElement) {
260
- if (currentElement.dataset.tooltipId === tooltipId) {
260
+ if (currentElement instanceof HTMLElement && currentElement.dataset.tooltipId === tooltipId) {
261
261
  return currentElement;
262
262
  }
263
263
  currentElement = currentElement.parentElement;
@@ -551,38 +551,39 @@
551
551
  * This reduces document-level listeners from O(N × eventTypes) to O(eventTypes).
552
552
  */
553
553
  const handlersByType = new Map();
554
- function getOrCreateSet(eventType) {
555
- let set = handlersByType.get(eventType);
556
- if (!set) {
557
- set = new Set();
558
- handlersByType.set(eventType, set);
559
- document.addEventListener(eventType, dispatch);
560
- }
561
- return set;
554
+ function getListenerKey(eventType, capture) {
555
+ return `${eventType}:${capture ? 'capture' : 'bubble'}`;
562
556
  }
563
- function dispatch(event) {
564
- const handlers = handlersByType.get(event.type);
565
- if (handlers) {
566
- // Safe to iterate directly — mutations (add/remove) only happen in
567
- // setup/cleanup, not during dispatch. Set iteration is stable for
568
- // entries that existed when iteration began.
569
- handlers.forEach((handler) => {
570
- handler(event);
571
- });
557
+ function getOrCreateListener(eventType, capture) {
558
+ const key = getListenerKey(eventType, capture);
559
+ let listener = handlersByType.get(key);
560
+ if (!listener) {
561
+ const handlers = new Set();
562
+ const dispatch = (event) => {
563
+ handlers.forEach((handler) => {
564
+ handler(event);
565
+ });
566
+ };
567
+ listener = { handlers, dispatch, eventType, capture };
568
+ handlersByType.set(key, listener);
569
+ document.addEventListener(eventType, dispatch, { capture });
572
570
  }
571
+ return listener;
573
572
  }
574
573
  /**
575
574
  * Register a handler for a document-level event type.
576
575
  * Returns an unsubscribe function.
577
576
  */
578
- function addDelegatedEventListener(eventType, handler) {
579
- const set = getOrCreateSet(eventType);
580
- set.add(handler);
577
+ function addDelegatedEventListener(eventType, handler, options = {}) {
578
+ const capture = Boolean(options.capture);
579
+ const key = getListenerKey(eventType, capture);
580
+ const listener = getOrCreateListener(eventType, capture);
581
+ listener.handlers.add(handler);
581
582
  return () => {
582
- set.delete(handler);
583
- if (set.size === 0) {
584
- handlersByType.delete(eventType);
585
- document.removeEventListener(eventType, dispatch);
583
+ listener.handlers.delete(handler);
584
+ if (listener.handlers.size === 0) {
585
+ handlersByType.delete(key);
586
+ document.removeEventListener(eventType, listener.dispatch, { capture });
586
587
  }
587
588
  };
588
589
  }
@@ -702,10 +703,10 @@
702
703
  const dataTooltipId = anchorSelector ? parseDataTooltipIdSelector(anchorSelector) : null;
703
704
  resolveAnchorElementRef.current = (target) => {
704
705
  var _a, _b;
705
- const targetElement = target;
706
- if (!(targetElement === null || targetElement === void 0 ? void 0 : targetElement.isConnected)) {
706
+ if (!(target instanceof Element) || !target.isConnected) {
707
707
  return null;
708
708
  }
709
+ const targetElement = target;
709
710
  if (dataTooltipId) {
710
711
  const matchedAnchor = resolveDataTooltipAnchor(targetElement, dataTooltipId);
711
712
  if (matchedAnchor && !(disableTooltip === null || disableTooltip === void 0 ? void 0 : disableTooltip(matchedAnchor))) {
@@ -788,8 +789,8 @@
788
789
  // time, so this effect is decoupled from show/hide state changes.
789
790
  React.useEffect(() => {
790
791
  const cleanupFns = [];
791
- const addDelegatedListener = (eventType, listener) => {
792
- cleanupFns.push(addDelegatedEventListener(eventType, listener));
792
+ const addDelegatedListener = (eventType, listener, options) => {
793
+ cleanupFns.push(addDelegatedEventListener(eventType, listener, options));
793
794
  };
794
795
  const activeAnchorContainsTarget = (event) => { var _a; return Boolean((event === null || event === void 0 ? void 0 : event.target) && ((_a = activeAnchorRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))); };
795
796
  const debouncedHandleShowTooltip = (anchor) => {
@@ -882,7 +883,9 @@
882
883
  return;
883
884
  }
884
885
  if (clickEvents.includes(event)) {
885
- addDelegatedListener(event, handleClickOpenTooltipAnchor);
886
+ addDelegatedListener(event, handleClickOpenTooltipAnchor, {
887
+ capture: true,
888
+ });
886
889
  }
887
890
  });
888
891
  Object.entries(actualCloseEvents).forEach(([event, enabled]) => {
@@ -890,7 +893,9 @@
890
893
  return;
891
894
  }
892
895
  if (clickEvents.includes(event)) {
893
- addDelegatedListener(event, handleClickCloseTooltipAnchor);
896
+ addDelegatedListener(event, handleClickCloseTooltipAnchor, {
897
+ capture: true,
898
+ });
894
899
  }
895
900
  });
896
901
  if (float) {