/** * Data structure tracking popup trigger elements by ID. * * Ported 1:1 from Base UI React's `packages/react/src/utils/popups/popupTriggerMap.ts`. * Used by `FloatingRootStore` and the click-outside / safe-polygon logic to * decide whether a given target is "inside" one of the registered triggers. */ export class PopupTriggerMap { private elementsSet: Set; private idMap: Map; constructor() { this.elementsSet = new Set(); this.idMap = new Map(); } public add(id: string, element: Element): void { const existingElement = this.idMap.get(id); if (existingElement === element) { return; } if (existingElement !== undefined) { this.elementsSet.delete(existingElement); } this.elementsSet.add(element); this.idMap.set(id, element); } public delete(id: string): void { const element = this.idMap.get(id); if (element) { this.elementsSet.delete(element); this.idMap.delete(id); } } public hasElement(element: Element): boolean { return this.elementsSet.has(element); } public hasMatchingElement(predicate: (el: Element) => boolean): boolean { for (const element of this.elementsSet) { if (predicate(element)) { return true; } } return false; } public getById(id: string): Element | undefined { return this.idMap.get(id); } public entries(): IterableIterator<[string, Element]> { return this.idMap.entries(); } public elements(): IterableIterator { return this.elementsSet.values(); } public get size(): number { return this.idMap.size; } }