{ "version": 3, "sources": ["../../../../../../../../source/febe/ui/src/scripts/components/Tooltip.ts"], "sourcesContent": ["import EventEmitter from \"../classes/EventEmitter.js\";\nimport { Hatch, Domifier } from \"../classes/Hatch\";\n\nconst validPositions = [\"relative\", \"absolute\", \"fixed\"];\n\nlet resolveAttributes = (el: Element, ow = []) => {\n let r = {};\n Object.entries(el?.attributes || {}).forEach((attr) => {\n let a = attr[1];\n if (a.name.indexOf(\"data-\") > -1) {\n let n = a.name.replace(\"data-\", \"\");\n if (ow.indexOf(n) > -1) r[n] = a.value;\n }\n });\n return r;\n};\n\nexport default class Tooltip extends EventEmitter {\n props: {\n text: string;\n target: HTMLElement;\n position: string;\n };\n view: HTMLElement;\n // creates the class\n constructor(props = {}) {\n super();\n // extract object configuration and extend with defaults\n let { target } = (this.props = {\n text: \"Tooltip\",\n target: null,\n position: \"bottom\",\n ...props,\n });\n\n // read out data-attributes and extend to existing props\n this.props = {\n ...this.props,\n ...resolveAttributes(target, Object.keys(this.props)),\n };\n\n this.view = null;\n\n if (target !== null) this.createBindings();\n }\n\n // spits out the view html\n render() {\n let { text, position } = this.props;\n return Domifier(\n Hatch`\n
${text}
\n `.toString()\n ) as HTMLElement;\n }\n\n // attaches the event listeners to the target\n createBindings() {\n let { target } = this.props;\n target.addEventListener(\"mouseenter\", () => this.show());\n target.addEventListener(\"mouseleave\", () => this.hide());\n }\n\n // appends tooltip view to parent target\n append() {\n let { target } = this.props;\n let pos: {\n x: number;\n y: number;\n };\n this.view = this.render();\n document.body.appendChild(this.view);\n\n const margin = 20;\n\n // tooltip is transformed 50% on selected axis. Its top,left determine its centered position.\n const tBounds = this.props.target.getBoundingClientRect();\n const vBounds = this.view.getBoundingClientRect();\n let xCenter = tBounds.left + tBounds.width / 2;\n const yTop = tBounds.top - vBounds.height - margin;\n const xRight = tBounds.left + tBounds.width + margin;\n const xLeft = tBounds.left - vBounds.width - margin;\n const yBottom = tBounds.top + tBounds.height + margin;\n let yCenter = tBounds.top + tBounds.height / 2;\n const vHalfX = vBounds.width / 2;\n const vHalfY = vBounds.height / 2;\n switch (this.props.position) {\n case \"bottom\":\n if (xCenter < vHalfX) {\n xCenter = vHalfX;\n }\n pos = {\n x: xCenter,\n y: yBottom,\n };\n break;\n case \"top\":\n if (xCenter < vHalfX) {\n xCenter = vHalfX;\n }\n pos = {\n x: xCenter,\n y: yTop,\n };\n break;\n case \"right\":\n if (yCenter < vHalfY) {\n yCenter = vHalfY;\n }\n pos = {\n x: xRight,\n y: yCenter,\n };\n break;\n case \"left\":\n if (yCenter < vHalfY) {\n yCenter = vHalfY;\n }\n pos = {\n x: xLeft,\n y: yCenter,\n };\n break;\n default:\n pos = {\n x: xCenter,\n y: yBottom,\n };\n }\n\n const yDiff = document.querySelector(\"html\").scrollTop;\n this.view.style.left = pos.x + \"px\";\n this.view.style.top = pos.y + yDiff + \"px\";\n\n if (validPositions.indexOf(target.style.position) <= -1 && window.getComputedStyle(target).position !== \"absolute\")\n target.style.position = \"relative\";\n }\n\n show() {\n if (this.view !== null) return;\n this.view = this.render();\n this.append();\n }\n\n hide() {\n if (this.view) {\n this.view.remove();\n this.view = null;\n }\n }\n}\n"], "mappings": "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", "names": ["validPositions", "resolveAttributes", "el", "ow", "r", "attr", "a", "n", "Tooltip", "EventEmitter", "props", "target", "__spreadValues", "text", "position", "Domifier", "Hatch", "pos", "margin", "tBounds", "vBounds", "xCenter", "yTop", "xRight", "xLeft", "yBottom", "yCenter", "vHalfX", "vHalfY", "yDiff"] }