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.
@@ -256,7 +256,7 @@ function parseDataTooltipIdSelector(selector) {
256
256
  function resolveDataTooltipAnchor(targetElement, tooltipId) {
257
257
  let currentElement = targetElement;
258
258
  while (currentElement) {
259
- if (currentElement.dataset.tooltipId === tooltipId) {
259
+ if (currentElement instanceof HTMLElement && currentElement.dataset.tooltipId === tooltipId) {
260
260
  return currentElement;
261
261
  }
262
262
  currentElement = currentElement.parentElement;
@@ -550,38 +550,39 @@ const useTooltipAnchors = ({ id, anchorSelect, imperativeAnchorSelect, activeAnc
550
550
  * This reduces document-level listeners from O(N × eventTypes) to O(eventTypes).
551
551
  */
552
552
  const handlersByType = new Map();
553
- function getOrCreateSet(eventType) {
554
- let set = handlersByType.get(eventType);
555
- if (!set) {
556
- set = new Set();
557
- handlersByType.set(eventType, set);
558
- document.addEventListener(eventType, dispatch);
559
- }
560
- return set;
553
+ function getListenerKey(eventType, capture) {
554
+ return `${eventType}:${capture ? 'capture' : 'bubble'}`;
561
555
  }
562
- function dispatch(event) {
563
- const handlers = handlersByType.get(event.type);
564
- if (handlers) {
565
- // Safe to iterate directly — mutations (add/remove) only happen in
566
- // setup/cleanup, not during dispatch. Set iteration is stable for
567
- // entries that existed when iteration began.
568
- handlers.forEach((handler) => {
569
- handler(event);
570
- });
556
+ function getOrCreateListener(eventType, capture) {
557
+ const key = getListenerKey(eventType, capture);
558
+ let listener = handlersByType.get(key);
559
+ if (!listener) {
560
+ const handlers = new Set();
561
+ const dispatch = (event) => {
562
+ handlers.forEach((handler) => {
563
+ handler(event);
564
+ });
565
+ };
566
+ listener = { handlers, dispatch, eventType, capture };
567
+ handlersByType.set(key, listener);
568
+ document.addEventListener(eventType, dispatch, { capture });
571
569
  }
570
+ return listener;
572
571
  }
573
572
  /**
574
573
  * Register a handler for a document-level event type.
575
574
  * Returns an unsubscribe function.
576
575
  */
577
- function addDelegatedEventListener(eventType, handler) {
578
- const set = getOrCreateSet(eventType);
579
- set.add(handler);
576
+ function addDelegatedEventListener(eventType, handler, options = {}) {
577
+ const capture = Boolean(options.capture);
578
+ const key = getListenerKey(eventType, capture);
579
+ const listener = getOrCreateListener(eventType, capture);
580
+ listener.handlers.add(handler);
580
581
  return () => {
581
- set.delete(handler);
582
- if (set.size === 0) {
583
- handlersByType.delete(eventType);
584
- document.removeEventListener(eventType, dispatch);
582
+ listener.handlers.delete(handler);
583
+ if (listener.handlers.size === 0) {
584
+ handlersByType.delete(key);
585
+ document.removeEventListener(eventType, listener.dispatch, { capture });
585
586
  }
586
587
  };
587
588
  }
@@ -701,10 +702,10 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
701
702
  const dataTooltipId = anchorSelector ? parseDataTooltipIdSelector(anchorSelector) : null;
702
703
  resolveAnchorElementRef.current = (target) => {
703
704
  var _a, _b;
704
- const targetElement = target;
705
- if (!(targetElement === null || targetElement === void 0 ? void 0 : targetElement.isConnected)) {
705
+ if (!(target instanceof Element) || !target.isConnected) {
706
706
  return null;
707
707
  }
708
+ const targetElement = target;
708
709
  if (dataTooltipId) {
709
710
  const matchedAnchor = resolveDataTooltipAnchor(targetElement, dataTooltipId);
710
711
  if (matchedAnchor && !(disableTooltip === null || disableTooltip === void 0 ? void 0 : disableTooltip(matchedAnchor))) {
@@ -787,8 +788,8 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
787
788
  // time, so this effect is decoupled from show/hide state changes.
788
789
  useEffect(() => {
789
790
  const cleanupFns = [];
790
- const addDelegatedListener = (eventType, listener) => {
791
- cleanupFns.push(addDelegatedEventListener(eventType, listener));
791
+ const addDelegatedListener = (eventType, listener, options) => {
792
+ cleanupFns.push(addDelegatedEventListener(eventType, listener, options));
792
793
  };
793
794
  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))); };
794
795
  const debouncedHandleShowTooltip = (anchor) => {
@@ -881,7 +882,9 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
881
882
  return;
882
883
  }
883
884
  if (clickEvents.includes(event)) {
884
- addDelegatedListener(event, handleClickOpenTooltipAnchor);
885
+ addDelegatedListener(event, handleClickOpenTooltipAnchor, {
886
+ capture: true,
887
+ });
885
888
  }
886
889
  });
887
890
  Object.entries(actualCloseEvents).forEach(([event, enabled]) => {
@@ -889,7 +892,9 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
889
892
  return;
890
893
  }
891
894
  if (clickEvents.includes(event)) {
892
- addDelegatedListener(event, handleClickCloseTooltipAnchor);
895
+ addDelegatedListener(event, handleClickCloseTooltipAnchor, {
896
+ capture: true,
897
+ });
893
898
  }
894
899
  });
895
900
  if (float) {