react-tooltip 6.0.4 → 6.0.5

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.
@@ -552,38 +552,39 @@ const useTooltipAnchors = ({ id, anchorSelect, imperativeAnchorSelect, activeAnc
552
552
  * This reduces document-level listeners from O(N × eventTypes) to O(eventTypes).
553
553
  */
554
554
  const handlersByType = new Map();
555
- function getOrCreateSet(eventType) {
556
- let set = handlersByType.get(eventType);
557
- if (!set) {
558
- set = new Set();
559
- handlersByType.set(eventType, set);
560
- document.addEventListener(eventType, dispatch);
561
- }
562
- return set;
555
+ function getListenerKey(eventType, capture) {
556
+ return `${eventType}:${capture ? 'capture' : 'bubble'}`;
563
557
  }
564
- function dispatch(event) {
565
- const handlers = handlersByType.get(event.type);
566
- if (handlers) {
567
- // Safe to iterate directly — mutations (add/remove) only happen in
568
- // setup/cleanup, not during dispatch. Set iteration is stable for
569
- // entries that existed when iteration began.
570
- handlers.forEach((handler) => {
571
- handler(event);
572
- });
558
+ function getOrCreateListener(eventType, capture) {
559
+ const key = getListenerKey(eventType, capture);
560
+ let listener = handlersByType.get(key);
561
+ if (!listener) {
562
+ const handlers = new Set();
563
+ const dispatch = (event) => {
564
+ handlers.forEach((handler) => {
565
+ handler(event);
566
+ });
567
+ };
568
+ listener = { handlers, dispatch, eventType, capture };
569
+ handlersByType.set(key, listener);
570
+ document.addEventListener(eventType, dispatch, { capture });
573
571
  }
572
+ return listener;
574
573
  }
575
574
  /**
576
575
  * Register a handler for a document-level event type.
577
576
  * Returns an unsubscribe function.
578
577
  */
579
- function addDelegatedEventListener(eventType, handler) {
580
- const set = getOrCreateSet(eventType);
581
- set.add(handler);
578
+ function addDelegatedEventListener(eventType, handler, options = {}) {
579
+ const capture = Boolean(options.capture);
580
+ const key = getListenerKey(eventType, capture);
581
+ const listener = getOrCreateListener(eventType, capture);
582
+ listener.handlers.add(handler);
582
583
  return () => {
583
- set.delete(handler);
584
- if (set.size === 0) {
585
- handlersByType.delete(eventType);
586
- document.removeEventListener(eventType, dispatch);
584
+ listener.handlers.delete(handler);
585
+ if (listener.handlers.size === 0) {
586
+ handlersByType.delete(key);
587
+ document.removeEventListener(eventType, listener.dispatch, { capture });
587
588
  }
588
589
  };
589
590
  }
@@ -789,8 +790,8 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
789
790
  // time, so this effect is decoupled from show/hide state changes.
790
791
  React.useEffect(() => {
791
792
  const cleanupFns = [];
792
- const addDelegatedListener = (eventType, listener) => {
793
- cleanupFns.push(addDelegatedEventListener(eventType, listener));
793
+ const addDelegatedListener = (eventType, listener, options) => {
794
+ cleanupFns.push(addDelegatedEventListener(eventType, listener, options));
794
795
  };
795
796
  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))); };
796
797
  const debouncedHandleShowTooltip = (anchor) => {
@@ -883,7 +884,9 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
883
884
  return;
884
885
  }
885
886
  if (clickEvents.includes(event)) {
886
- addDelegatedListener(event, handleClickOpenTooltipAnchor);
887
+ addDelegatedListener(event, handleClickOpenTooltipAnchor, {
888
+ capture: true,
889
+ });
887
890
  }
888
891
  });
889
892
  Object.entries(actualCloseEvents).forEach(([event, enabled]) => {
@@ -891,7 +894,9 @@ const useTooltipEvents = ({ activeAnchor, anchorElements, anchorSelector, clicka
891
894
  return;
892
895
  }
893
896
  if (clickEvents.includes(event)) {
894
- addDelegatedListener(event, handleClickCloseTooltipAnchor);
897
+ addDelegatedListener(event, handleClickCloseTooltipAnchor, {
898
+ capture: true,
899
+ });
895
900
  }
896
901
  });
897
902
  if (float) {