{"version":3,"file":"Intersection.mjs","sourceRoot":"","sources":["../../../src/meta/Intersection.ts"],"names":[],"mappings":"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","sourcesContent":["import global from '@dojo/shim/global';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Map from '@dojo/shim/Map';\nimport { createHandle } from '@dojo/core/lang';\nimport { Base } from './Base';\n\ninterface ExtendedIntersectionObserverEntry extends IntersectionObserverEntry {\n\treadonly isIntersecting: boolean;\n}\n\ninterface IntersectionDetail extends IntersectionGetOptions {\n\tentries: WeakMap<Element, IntersectionResult>;\n\tobserver: IntersectionObserver;\n}\n\nexport interface IntersectionGetOptions {\n\troot?: string;\n\trootMargin?: string;\n\tthreshold?: number[];\n}\n\nexport interface IntersectionResult {\n\tintersectionRatio: number;\n\tisIntersecting: boolean;\n}\n\nconst defaultIntersection: IntersectionResult = Object.freeze({\n\tintersectionRatio: 0,\n\tisIntersecting: false\n});\n\nexport class Intersection extends Base {\n\tprivate readonly _details = new Map<string, IntersectionDetail>();\n\n\t/**\n\t * Return an `InteractionResult` for the requested key and options.\n\t *\n\t * @param key The key to return the intersection meta for\n\t * @param options The options for the request\n\t */\n\tpublic get(key: string | number, options: IntersectionGetOptions = {}): IntersectionResult {\n\t\tlet rootNode: HTMLElement | undefined;\n\t\tif (options.root) {\n\t\t\trootNode = this.getNode(options.root) as HTMLElement;\n\t\t\tif (!rootNode) {\n\t\t\t\treturn defaultIntersection;\n\t\t\t}\n\t\t}\n\t\tconst node = this.getNode(key);\n\t\tif (!node) {\n\t\t\treturn defaultIntersection;\n\t\t}\n\n\t\tlet details = this._getDetails(options) || this._createDetails(options, rootNode);\n\t\tif (!details.entries.get(node)) {\n\t\t\tdetails.entries.set(node, defaultIntersection);\n\t\t\tdetails.observer.observe(node);\n\t\t}\n\n\t\treturn details.entries.get(node) || defaultIntersection;\n\t}\n\n\t/**\n\t * Returns true if the node for the key has intersection details\n\t *\n\t * @param key The key to return the intersection meta for\n\t * @param options The options for the request\n\t */\n\tpublic has(key: string | number, options?: IntersectionGetOptions): boolean {\n\t\tconst node = this.getNode(key);\n\t\tconst details = this._getDetails(options);\n\t\treturn Boolean(details && node && details.entries.has(node));\n\t}\n\n\tprivate _createDetails(options: IntersectionGetOptions, rootNode?: HTMLElement): IntersectionDetail {\n\t\tconst entries = new WeakMap<HTMLElement, ExtendedIntersectionObserverEntry>();\n\t\tconst observer = new global.IntersectionObserver(this._onIntersect(entries), { ...options, root: rootNode });\n\t\tconst details = { observer, entries, ...options };\n\n\t\tthis._details.set(JSON.stringify(options), details);\n\t\tthis.own(createHandle(() => observer.disconnect()));\n\t\treturn details;\n\t}\n\n\tprivate _getDetails(options: IntersectionGetOptions = {}): IntersectionDetail | undefined {\n\t\treturn this._details.get(JSON.stringify(options));\n\t}\n\n\tprivate _onIntersect = (detailEntries: WeakMap<Element, IntersectionResult>) => {\n\t\treturn (entries: ExtendedIntersectionObserverEntry[]) => {\n\t\t\tfor (const { intersectionRatio, isIntersecting, target } of entries) {\n\t\t\t\tdetailEntries.set(target, { intersectionRatio, isIntersecting });\n\t\t\t}\n\t\t\tthis.invalidate();\n\t\t};\n\t};\n}\n\nexport default Intersection;\n"]}