{"version":3,"file":"utils.mjs","sources":["../../../../../../packages/components/affix/src/utils.ts"],"sourcesContent":["import { addEventListenerWrap, supportsPassive } from '@antdv/utils';\n\nexport type BindElement = HTMLElement | Window | null | undefined;\n\nexport function getTargetRect(target: BindElement): DOMRect {\n  return target !== window\n    ? (target as HTMLElement).getBoundingClientRect()\n    : ({ top: 0, bottom: window.innerHeight } as DOMRect);\n}\n\nexport function getFixedTop(placeholderRect: DOMRect, targetRect: DOMRect, offsetTop: number) {\n  if (offsetTop !== undefined && targetRect.top > placeholderRect.top - offsetTop)\n    return `${offsetTop + targetRect.top}px`;\n\n  return undefined;\n}\n\nexport function getFixedBottom(\n  placeholderRect: DOMRect,\n  targetRect: DOMRect,\n  offsetBottom: number,\n) {\n  if (offsetBottom !== undefined && targetRect.bottom < placeholderRect.bottom + offsetBottom) {\n    const targetBottomOffset = window.innerHeight - targetRect.bottom;\n    return `${offsetBottom + targetBottomOffset}px`;\n  }\n  return undefined;\n}\n\n// ======================== Observer ========================\nconst TRIGGER_EVENTS = [\n  'resize',\n  'scroll',\n  'touchstart',\n  'touchmove',\n  'touchend',\n  'pageshow',\n  'load',\n];\n\ninterface ObserverEntity {\n  target: HTMLElement | Window\n  affixList: any[]\n  eventHandlers: { [eventName: string]: any }\n}\n\nlet observerEntities: ObserverEntity[] = [];\n\nexport function getObserverEntities() {\n  // Only used in test env. Can be removed if refactor.\n  return observerEntities;\n}\n\nexport function addObserveTarget<T>(target: HTMLElement | Window | null, affix: T): void {\n  if (!target) return;\n\n  let entity = observerEntities.find(item => item.target === target);\n\n  if (entity) {\n    entity.affixList.push(affix);\n  } else {\n    entity = {\n      target,\n      affixList: [affix],\n      eventHandlers: {},\n    };\n    observerEntities.push(entity);\n\n    // Add listener\n    TRIGGER_EVENTS.forEach((eventName) => {\n      entity!.eventHandlers[eventName] = addEventListenerWrap(target, eventName, () => {\n        entity!.affixList.forEach(\n          (targetAffix) => {\n            const { lazyUpdatePosition } = (targetAffix as any).exposed;\n            lazyUpdatePosition();\n          },\n          (eventName === 'touchstart' || eventName === 'touchmove') && supportsPassive\n            ? ({ passive: true } as EventListenerOptions)\n            : false,\n        );\n      });\n    });\n  }\n}\n\nexport function removeObserveTarget<T>(affix: T): void {\n  const observerEntity = observerEntities.find((oriObserverEntity) => {\n    const hasAffix = oriObserverEntity.affixList.includes(affix);\n    if (hasAffix)\n      oriObserverEntity.affixList = oriObserverEntity.affixList.filter(item => item !== affix);\n\n    return hasAffix;\n  });\n\n  if (observerEntity && observerEntity.affixList.length === 0) {\n    observerEntities = observerEntities.filter(item => item !== observerEntity);\n\n    // Remove listener\n    TRIGGER_EVENTS.forEach((eventName) => {\n      const handler = observerEntity.eventHandlers[eventName];\n      if (handler && handler.remove)\n        handler.remove();\n    });\n  }\n}\n"],"names":[],"mappings":"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"}