diff --git a/assets/client/client.js b/assets/client/client.js index 90f6e8779..721c5c1d3 100644 --- a/assets/client/client.js +++ b/assets/client/client.js @@ -47,7 +47,8 @@ window.document.addEventListener('DOMContentLoaded', async () => { shadowHost.style.zIndex = '2147483647'; document.body.appendChild(shadowHost); - const shadowRoot = shadowHost.attachShadow({ mode: 'closed' }); + const mode = metaTag.getAttribute('e2e') === 'true' ? 'open' : 'closed'; + const shadowRoot = shadowHost.attachShadow({ mode }); const cssLink = document.createElement('link'); cssLink.rel = 'stylesheet'; diff --git a/lib/live_debugger.ex b/lib/live_debugger.ex index 66be8be5f..ae3d8ba28 100644 --- a/lib/live_debugger.ex +++ b/lib/live_debugger.ex @@ -128,7 +128,8 @@ defmodule LiveDebugger do phoenix_url: live_debugger_phoenix_url, browser_features?: browser_features?, version: version, - debug_button?: SettingsStorage.get(:debug_button) + debug_button?: SettingsStorage.get(:debug_button), + e2e?: Keyword.get(config, :e2e?, false) } tags = LiveDebugger.Client.ConfigComponent.live_debugger_tags(assigns) diff --git a/lib/live_debugger/client/config_component.ex b/lib/live_debugger/client/config_component.ex index 029572bc7..b25a47872 100644 --- a/lib/live_debugger/client/config_component.ex +++ b/lib/live_debugger/client/config_component.ex @@ -12,10 +12,21 @@ defmodule LiveDebugger.Client.ConfigComponent do attr(:browser_features?, :boolean, default: true) attr(:version, :string, default: nil) attr(:debug_button?, :boolean, default: true) + attr(:e2e?, :boolean, default: false) def live_debugger_tags(assigns) do ~H""" - + <%= if @e2e? do %> + + <% else %> + + <% end %> <%= if @browser_features? do %> diff --git a/priv/static/client.js b/priv/static/client.js index 5dc1cd85e..cb9268883 100644 --- a/priv/static/client.js +++ b/priv/static/client.js @@ -76,7 +76,7 @@ -`;function w(e){let t=document.createElement("div");return t.innerHTML=e,t.firstElementChild}function a(e,t={}){let o=new CustomEvent(e,t);document.dispatchEvent(o)}function C(){let e=w(_),t=!1,o=()=>{t?i():a("lvdbg:debug-button-click",{detail:{buttonRect:e.getBoundingClientRect()}})},n=()=>{t=!0,e.style.cursor="grabbing",document.addEventListener("mousemove",r)},i=()=>{t=!1,e.style.cursor="pointer",document.removeEventListener("mousemove",r)},r=s=>{let g=e.offsetWidth,m=e.offsetHeight,d=window.innerWidth-g,h=window.innerHeight-m,v=Math.max(0,Math.min(s.clientX-g/2,d)),f=Math.max(0,Math.min(s.clientY-m/2,h));e.style.left=`${v}px`,e.style.top=`${f}px`,e.style.right="auto",e.style.bottom="auto"},l=()=>{let s=e.getBoundingClientRect();s.top>=0&&s.left>=0&&s.bottom<=window.innerHeight&&s.right<=window.innerWidth||(e.style.left="auto",e.style.top="auto",e.style.right="20px",e.style.bottom="20px")};return e.addEventListener("click",o),document.addEventListener("lvdbg:move-button-click",n),window.addEventListener("resize",()=>l()),e}var U=`
+`;function w(e){let t=document.createElement("div");return t.innerHTML=e,t.firstElementChild}function a(e,t={}){let o=new CustomEvent(e,t);document.dispatchEvent(o)}function C(){let e=w(_),t=!1,o=()=>{t?i():a("lvdbg:debug-button-click",{detail:{buttonRect:e.getBoundingClientRect()}})},n=()=>{t=!0,e.style.cursor="grabbing",document.addEventListener("mousemove",r)},i=()=>{t=!1,e.style.cursor="pointer",document.removeEventListener("mousemove",r)},r=s=>{let g=e.offsetWidth,m=e.offsetHeight,d=window.innerWidth-g,h=window.innerHeight-m,v=Math.max(0,Math.min(s.clientX-g/2,d)),f=Math.max(0,Math.min(s.clientY-m/2,h));e.style.left=`${v}px`,e.style.top=`${f}px`,e.style.right="auto",e.style.bottom="auto"},l=()=>{let s=e.getBoundingClientRect();s.top>=0&&s.left>=0&&s.bottom<=window.innerHeight&&s.right<=window.innerWidth||(e.style.left="auto",e.style.top="auto",e.style.right="20px",e.style.bottom="20px")};return e.addEventListener("click",o),document.addEventListener("lvdbg:move-button-click",n),window.addEventListener("resize",()=>l()),e}var A=`
Move button

-`;function E({liveDebuggerURL:e,debugChannel:t}){let o=w(U),n=!1,i=d=>{o.style.display="block";let h=o.getBoundingClientRect(),v=h.width,f=h.height;d.right+v>window.innerWidth?o.style.left=`${d.left-v}px`:o.style.left=`${d.right}px`,d.top+f>window.innerHeight?o.style.top=`${d.bottom-f}px`:o.style.top=`${d.top}px`,n=!0},r=()=>{o.style.display="none",n=!1},l=d=>{let h=d.detail.buttonRect;n?r():i(h)},s=()=>{window.open(e,"_blank"),r()},g=()=>{a("lvdbg:inspect-button-click"),r()},m=()=>{a("lvdbg:move-button-click"),r()};return o.querySelector("#live-debugger-debug-tooltip-open-in-new-tab").addEventListener("click",s),o.querySelector("#live-debugger-debug-tooltip-inspect-elements").addEventListener("click",g),o.querySelector("#live-debugger-debug-tooltip-move-button").addEventListener("click",m),document.addEventListener("lvdbg:debug-button-click",l),document.addEventListener("lvdbg:click-outside-debug-menu",r),t.on("inspect-mode-changed",r),window.addEventListener("resize",()=>{n&&r()}),o}function A(){return new Promise(e=>{let t=document.querySelectorAll("[data-phx-session]"),o={},n=document.querySelector("[data-phx-main]")?.id,i=l=>{se(l)&&(de(o,l.target),ce(o,t)&&(r.disconnect(),e({mainSocketID:n,rootSocketIDs:ue(o,n)})))},r=new MutationObserver(l=>{l.forEach(i)});t.forEach(l=>{r.observe(l,{attributes:!0})})})}function se(e){return e.type==="attributes"&&e.attributeName==="data-phx-root-id"}function de(e,t){e[t.id]=t.getAttribute("data-phx-root-id")}function ce(e,t){return Object.keys(e).length>=t.length}function ue(e,t){let o=new Set(Object.values(e));return o.delete(t),[...o]}function R(){let e=document.querySelector('meta[name="live-debugger-config"]');if(e)return e;{let t=` +`;function E({liveDebuggerURL:e,debugChannel:t}){let o=w(A),n=!1,i=d=>{o.style.display="block";let h=o.getBoundingClientRect(),v=h.width,f=h.height;d.right+v>window.innerWidth?o.style.left=`${d.left-v}px`:o.style.left=`${d.right}px`,d.top+f>window.innerHeight?o.style.top=`${d.bottom-f}px`:o.style.top=`${d.top}px`,n=!0},r=()=>{o.style.display="none",n=!1},l=d=>{let h=d.detail.buttonRect;n?r():i(h)},s=()=>{window.open(e,"_blank"),r()},g=()=>{a("lvdbg:inspect-button-click"),r()},m=()=>{a("lvdbg:move-button-click"),r()};return o.querySelector("#live-debugger-debug-tooltip-open-in-new-tab").addEventListener("click",s),o.querySelector("#live-debugger-debug-tooltip-inspect-elements").addEventListener("click",g),o.querySelector("#live-debugger-debug-tooltip-move-button").addEventListener("click",m),document.addEventListener("lvdbg:debug-button-click",l),document.addEventListener("lvdbg:click-outside-debug-menu",r),t.on("inspect-mode-changed",r),window.addEventListener("resize",()=>{n&&r()}),o}function U(){return new Promise(e=>{let t=document.querySelectorAll("[data-phx-session]"),o={},n=document.querySelector("[data-phx-main]")?.id,i=l=>{se(l)&&(de(o,l.target),ce(o,t)&&(r.disconnect(),e({mainSocketID:n,rootSocketIDs:ue(o,n)})))},r=new MutationObserver(l=>{l.forEach(i)});t.forEach(l=>{r.observe(l,{attributes:!0})})})}function se(e){return e.type==="attributes"&&e.attributeName==="data-phx-root-id"}function de(e,t){e[t.id]=t.getAttribute("data-phx-root-id")}function ce(e,t){return Object.keys(e).length>=t.length}function ue(e,t){let o=new Set(Object.values(e));return o.delete(t),[...o]}function R(){let e=document.querySelector('meta[name="live-debugger-config"]');if(e)return e;{let t=` LiveDebugger meta tag not found! If you have recently bumped LiveDebugger version, please update your layout according to the instructions in the GitHub README. You can find it here: https://github.com/software-mansion/live-debugger#installation @@ -217,4 +217,4 @@
-`;function Ie(e,t){let o=e.querySelector(".live-debugger-tooltip-icon-component");o.style.display=t.type==="LiveComponent"?"block":"none";let n=e.querySelector(".live-debugger-tooltip-icon-view");n.style.display=t.type==="LiveView"?"block":"none"}function De(e,t){let o=e.querySelector(".type-info"),n=o.querySelector(".type-text"),i=o.querySelector(".live-debugger-type-square");n.textContent=t.type,i.style.backgroundColor=t.type==="LiveComponent"?"#87CCE8":"#ffe780"}function Se(e,t){let o=e.querySelector(".id-info"),n=o.querySelector(".label"),i=o.querySelector(".value");n.textContent=`${t.id_key}:`,i.textContent=t.id_value}function $e(e,t){De(e,t),Se(e,t)}function qe(e,t){let o=e.querySelector(".live-debugger-tooltip-module");o.textContent=t.module||"Element"}function Q(e,t){let o=w(J);return qe(o,e),Ie(o,e),$e(o,e),t.appendChild(o),o}function Te(e,t){let o=e.top-t.height-10,n=e.left;return{top:o,left:n}}function He(e,t,o,n){return e<10&&(e=t.bottom+10),e+o.height>n-10&&(e=t.top-o.height-10,e<10&&(e=10)),e<10&&(e=10),e+o.height>n-10&&(e=n-o.height-10),e}function Ve(e,t,o){return e+t.width>o-10&&(e=o-t.width-10),e<10&&(e=10),e<10&&(e=10),e+t.width>o-10&&(e=o-t.width-10),e}function Be(e,t,o){e.style.top=`${t+window.scrollY}px`,e.style.left=`${o+window.scrollX}px`}function H(e,t){if(!t||!e)return;let o=t.getBoundingClientRect(),n=e.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight,{top:l,left:s}=Te(o,n);return l=He(l,o,n,r),s=Ve(s,n,i),Be(e,l,s),{top:l,left:s,tooltipRect:n}}function _e(e){let t=e.querySelector(".live-debugger-tooltip-arrow");t&&t.remove()}function Ue(){let e=document.createElement("div");return e.className="live-debugger-tooltip-arrow",e}function Ae(e,t,o){let n=e+t.height,i=o.top;return nee(e)),window.addEventListener("scroll",()=>ee(e)),document.addEventListener("lvdbg:show-tooltip",t=>Pe(t,e)),document.addEventListener("lvdbg:remove-tooltip",()=>ze(e))}function B(e){je(e)}window.document.addEventListener("DOMContentLoaded",async()=>{let e=R(),t=O(e),{mainSocketID:o,rootSocketIDs:n}=await A();if(o?n=[]:[o,...n]=n,o){let i=`${t}/redirect/${o}`,{debugChannel:r}=q(t,o,n);r.on("ping",d=>{console.log("Received ping",d),r.push("pong",d)});let l=document.createElement("div");l.style.position="absolute",l.style.width="0px",l.style.height="0px",l.style.left="0px",l.style.top="0px",l.style.zIndex="2147483647",document.body.appendChild(l);let s=l.attachShadow({mode:"closed"}),g=document.createElement("link");g.rel="stylesheet",g.href=`${t}/assets/live_debugger/client.css`,s.appendChild(g);let{debugButton:m}=L(e,i,r,s);T({baseURL:t,debugChannel:r,socketID:o,debugButton:m}),B(s),k(r,s)}console.info(`LiveDebugger available at: ${t}`)});})(); +`;function Ie(e,t){let o=e.querySelector(".live-debugger-tooltip-icon-component");o.style.display=t.type==="LiveComponent"?"block":"none";let n=e.querySelector(".live-debugger-tooltip-icon-view");n.style.display=t.type==="LiveView"?"block":"none"}function De(e,t){let o=e.querySelector(".type-info"),n=o.querySelector(".type-text"),i=o.querySelector(".live-debugger-type-square");n.textContent=t.type,i.style.backgroundColor=t.type==="LiveComponent"?"#87CCE8":"#ffe780"}function Se(e,t){let o=e.querySelector(".id-info"),n=o.querySelector(".label"),i=o.querySelector(".value");n.textContent=`${t.id_key}:`,i.textContent=t.id_value}function $e(e,t){De(e,t),Se(e,t)}function qe(e,t){let o=e.querySelector(".live-debugger-tooltip-module");o.textContent=t.module||"Element"}function Q(e,t){let o=w(J);return qe(o,e),Ie(o,e),$e(o,e),t.appendChild(o),o}function Te(e,t){let o=e.top-t.height-10,n=e.left;return{top:o,left:n}}function He(e,t,o,n){return e<10&&(e=t.bottom+10),e+o.height>n-10&&(e=t.top-o.height-10,e<10&&(e=10)),e<10&&(e=10),e+o.height>n-10&&(e=n-o.height-10),e}function Ve(e,t,o){return e+t.width>o-10&&(e=o-t.width-10),e<10&&(e=10),e<10&&(e=10),e+t.width>o-10&&(e=o-t.width-10),e}function Be(e,t,o){e.style.top=`${t+window.scrollY}px`,e.style.left=`${o+window.scrollX}px`}function H(e,t){if(!t||!e)return;let o=t.getBoundingClientRect(),n=e.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight,{top:l,left:s}=Te(o,n);return l=He(l,o,n,r),s=Ve(s,n,i),Be(e,l,s),{top:l,left:s,tooltipRect:n}}function _e(e){let t=e.querySelector(".live-debugger-tooltip-arrow");t&&t.remove()}function Ae(){let e=document.createElement("div");return e.className="live-debugger-tooltip-arrow",e}function Ue(e,t,o){let n=e+t.height,i=o.top;return nee(e)),window.addEventListener("scroll",()=>ee(e)),document.addEventListener("lvdbg:show-tooltip",t=>Pe(t,e)),document.addEventListener("lvdbg:remove-tooltip",()=>ze(e))}function B(e){je(e)}window.document.addEventListener("DOMContentLoaded",async()=>{let e=R(),t=O(e),{mainSocketID:o,rootSocketIDs:n}=await U();if(o?n=[]:[o,...n]=n,o){let i=`${t}/redirect/${o}`,{debugChannel:r}=q(t,o,n);r.on("ping",h=>{console.log("Received ping",h),r.push("pong",h)});let l=document.createElement("div");l.style.position="absolute",l.style.width="0px",l.style.height="0px",l.style.left="0px",l.style.top="0px",l.style.zIndex="2147483647",document.body.appendChild(l);let s=e.getAttribute("e2e")==="true"?"open":"closed",g=l.attachShadow({mode:s}),m=document.createElement("link");m.rel="stylesheet",m.href=`${t}/assets/live_debugger/client.css`,g.appendChild(m);let{debugButton:d}=L(e,i,r,g);T({baseURL:t,debugChannel:r,socketID:o,debugButton:d}),B(g),k(r,g)}console.info(`LiveDebugger available at: ${t}`)});})(); diff --git a/priv/static/client.js.map b/priv/static/client.js.map index ed300ecd3..1faf1a235 100644 --- a/priv/static/client.js.map +++ b/priv/static/client.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../assets/client/utils/dom.js", "../../assets/client/components/debug_button/debug_button.js", "../../assets/client/components/debug_options/debug_options.js", "../../assets/client/utils/meta.js", "../../assets/client/components/debug_menu.js", "../../assets/client/services/highlight.js", "../../assets/client/node_modules/uuid/dist/esm-browser/stringify.js", "../../assets/client/node_modules/uuid/dist/esm-browser/rng.js", "../../assets/client/node_modules/uuid/dist/esm-browser/native.js", "../../assets/client/node_modules/uuid/dist/esm-browser/v4.js", "../../assets/client/services/window_identifier.js", "../../assets/client/services/debug_socket.js", "../../assets/client/services/inspect.js", "../../assets/client/components/tooltip/tooltip_creator.js", "../../assets/client/components/tooltip/tooltip_positioner.js", "../../assets/client/components/tooltip/tooltip_arrow.js", "../../assets/client/components/tooltip/tooltip.js", "../../assets/client/client.js"], - "sourcesContent": ["export function createElement(html) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = html;\n return tempDiv.firstElementChild;\n}\n\nexport function dispatchCustomEvent(event, payload = {}) {\n const customEvent = new CustomEvent(event, payload);\n document.dispatchEvent(customEvent);\n}\n", "import debugButtonHtml from './debug_button.html';\nimport { createElement, dispatchCustomEvent } from '../../utils/dom';\n\nexport default function initDebugButton() {\n const debugButton = createElement(debugButtonHtml);\n\n let isDragging = false;\n\n const onClick = () => {\n if (isDragging) {\n placeButton();\n } else {\n dispatchCustomEvent('lvdbg:debug-button-click', {\n detail: {\n buttonRect: debugButton.getBoundingClientRect(),\n },\n });\n }\n };\n\n const dragButton = () => {\n isDragging = true;\n debugButton.style.cursor = 'grabbing';\n document.addEventListener('mousemove', onMouseMove);\n };\n\n const placeButton = () => {\n isDragging = false;\n debugButton.style.cursor = 'pointer';\n document.removeEventListener('mousemove', onMouseMove);\n };\n\n const onMouseMove = (event) => {\n const buttonWidth = debugButton.offsetWidth;\n const buttonHeight = debugButton.offsetHeight;\n\n // Make sure the button doesn't overflow the viewport\n const maxLeft = window.innerWidth - buttonWidth;\n const maxTop = window.innerHeight - buttonHeight;\n\n const newLeft = Math.max(\n 0,\n Math.min(event.clientX - buttonWidth / 2, maxLeft)\n );\n const newTop = Math.max(\n 0,\n Math.min(event.clientY - buttonHeight / 2, maxTop)\n );\n\n debugButton.style.left = `${newLeft}px`;\n debugButton.style.top = `${newTop}px`;\n debugButton.style.right = 'auto';\n debugButton.style.bottom = 'auto';\n };\n\n const ensureButtonInViewport = () => {\n const buttonRect = debugButton.getBoundingClientRect();\n\n const isVisible =\n buttonRect.top >= 0 &&\n buttonRect.left >= 0 &&\n buttonRect.bottom <= window.innerHeight &&\n buttonRect.right <= window.innerWidth;\n\n if (!isVisible) {\n debugButton.style.left = 'auto';\n debugButton.style.top = 'auto';\n debugButton.style.right = '20px';\n debugButton.style.bottom = '20px';\n }\n };\n\n debugButton.addEventListener('click', onClick);\n document.addEventListener('lvdbg:move-button-click', dragButton);\n window.addEventListener('resize', () => ensureButtonInViewport());\n\n return debugButton;\n}\n", "import debugOptionsHtml from './debug_options.html';\nimport { createElement, dispatchCustomEvent } from '../../utils/dom';\n\nexport default function initDebugOptions({ liveDebuggerURL, debugChannel }) {\n const debugOptions = createElement(debugOptionsHtml);\n\n let isVisible = false;\n\n const showDebugOptions = (debugButtonRect) => {\n debugOptions.style.display = 'block';\n\n const debugOptionsRect = debugOptions.getBoundingClientRect();\n const debugOptionsWidth = debugOptionsRect.width;\n const debugOptionsHeight = debugOptionsRect.height;\n\n // Check if the debug options would overflow on the right\n if (debugButtonRect.right + debugOptionsWidth > window.innerWidth) {\n debugOptions.style.left = `${debugButtonRect.left - debugOptionsWidth}px`;\n } else {\n debugOptions.style.left = `${debugButtonRect.right}px`;\n }\n\n // Check if the debug options would overflow on the bottom\n if (debugButtonRect.top + debugOptionsHeight > window.innerHeight) {\n debugOptions.style.top = `${debugButtonRect.bottom - debugOptionsHeight}px`;\n } else {\n debugOptions.style.top = `${debugButtonRect.top}px`;\n }\n\n isVisible = true;\n };\n\n const hideDebugOptions = () => {\n debugOptions.style.display = 'none';\n isVisible = false;\n };\n\n const onDebugButtonClick = (event) => {\n const debugButtonRect = event.detail.buttonRect;\n if (isVisible) {\n hideDebugOptions();\n } else {\n showDebugOptions(debugButtonRect);\n }\n };\n\n const onNewTabButtonClick = () => {\n window.open(liveDebuggerURL, '_blank');\n hideDebugOptions();\n };\n\n const onInspectButtonClick = () => {\n dispatchCustomEvent('lvdbg:inspect-button-click');\n hideDebugOptions();\n };\n\n const onMoveButtonClick = () => {\n dispatchCustomEvent('lvdbg:move-button-click');\n hideDebugOptions();\n };\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-open-in-new-tab')\n .addEventListener('click', onNewTabButtonClick);\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-inspect-elements')\n .addEventListener('click', onInspectButtonClick);\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-move-button')\n .addEventListener('click', onMoveButtonClick);\n\n document.addEventListener('lvdbg:debug-button-click', onDebugButtonClick);\n document.addEventListener('lvdbg:click-outside-debug-menu', hideDebugOptions);\n\n debugChannel.on('inspect-mode-changed', hideDebugOptions);\n\n window.addEventListener('resize', () => {\n if (isVisible) {\n hideDebugOptions();\n }\n });\n\n return debugOptions;\n}\n", "export function fetchDebuggedSocketIDs() {\n return new Promise((resolve) => {\n const liveViewElements = document.querySelectorAll('[data-phx-session]');\n const rootIDsMapping = {};\n const mainID = document.querySelector('[data-phx-main]')?.id;\n\n const handleMutation = (mutation) => {\n if (!isRootIDAttributeChanged(mutation)) return;\n\n registerRootID(rootIDsMapping, mutation.target);\n\n if (isAllRootIDsRegistered(rootIDsMapping, liveViewElements)) {\n observer.disconnect();\n\n resolve({\n mainSocketID: mainID,\n rootSocketIDs: getRootSocketIDs(rootIDsMapping, mainID),\n });\n }\n };\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(handleMutation);\n });\n\n liveViewElements.forEach((el) => {\n observer.observe(el, { attributes: true });\n });\n });\n}\n\nfunction isRootIDAttributeChanged(mutation) {\n return (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'data-phx-root-id'\n );\n}\n\nfunction registerRootID(rootIDs, target) {\n rootIDs[target.id] = target.getAttribute('data-phx-root-id');\n}\n\nfunction isAllRootIDsRegistered(rootIDs, liveViewElements) {\n return Object.keys(rootIDs).length >= liveViewElements.length;\n}\n\nfunction getRootSocketIDs(rootIDs, mainID) {\n const rootSocketIDs = new Set(Object.values(rootIDs));\n rootSocketIDs.delete(mainID);\n return [...rootSocketIDs];\n}\n\nexport function getMetaTag() {\n const metaTag = document.querySelector('meta[name=\"live-debugger-config\"]');\n\n if (metaTag) {\n return metaTag;\n } else {\n const message = `\n LiveDebugger meta tag not found!\n If you have recently bumped LiveDebugger version, please update your layout according to the instructions in the GitHub README.\n You can find it here: https://github.com/software-mansion/live-debugger#installation\n `;\n\n throw new Error(message);\n }\n}\n\nexport function fetchLiveDebuggerBaseURL(metaTag) {\n return metaTag.getAttribute('url');\n}\n\nexport function isDebugButtonEnabled(metaTag) {\n return metaTag.hasAttribute('debug-button');\n}\n", "import initDebugButton from './debug_button/debug_button';\nimport initDebugOptions from './debug_options/debug_options';\nimport { dispatchCustomEvent } from '../utils/dom';\nimport { isDebugButtonEnabled } from '../utils/meta';\n\nexport default function initDebugMenu(\n metaTag,\n liveDebuggerURL,\n debugChannel,\n shadowRoot\n) {\n const debugButton = initDebugButton();\n const debugMenu = initDebugOptions({ liveDebuggerURL, debugChannel });\n let suppressOutsideClick = false;\n\n const suppressNext = () => {\n suppressOutsideClick = true;\n setTimeout(() => {\n suppressOutsideClick = false;\n }, 0);\n };\n\n debugButton.addEventListener('click', suppressNext, true);\n debugMenu.addEventListener('click', suppressNext, true);\n\n const mount = () => {\n shadowRoot.appendChild(debugButton);\n shadowRoot.appendChild(debugMenu);\n };\n\n const unmount = () => {\n debugButton.remove();\n debugMenu.remove();\n };\n\n if (isDebugButtonEnabled(metaTag)) mount();\n\n debugChannel.on('toggle-debug-button', ({ enabled }) => {\n if (enabled) {\n mount();\n } else {\n unmount();\n }\n });\n\n // Hide menu when clicking outside\n document.addEventListener('click', (event) => {\n const path = event.composedPath?.() ?? [event.target];\n const clickedInside =\n path.includes(debugButton) ||\n path.includes(debugMenu) ||\n path.some((node) => node?.getRootNode?.() === shadowRoot);\n\n if (suppressOutsideClick) return;\n\n if (!clickedInside) {\n dispatchCustomEvent('lvdbg:click-outside-debug-menu');\n }\n });\n\n return { debugButton, debugMenu };\n}\n", "import { dispatchCustomEvent } from '../utils/dom';\n\nconst highlightElementID = 'live-debugger-highlight-element';\nconst highlightPulseElementID = 'live-debugger-highlight-pulse-element';\nconst liveViewColors = ['#ffe78080', '#ffe78060', '#ffe78030', '#ffe78000'];\nconst liveComponentsColors = [\n '#87CCE880',\n '#87CCE860',\n '#87CCE830',\n '#87CCE800',\n];\nconst streamItemColors = ['#8bca8480'];\n\nconst isElementVisible = (element) => {\n if (!element) return false;\n\n if (element.checkVisibility) {\n return element.checkVisibility();\n }\n\n const style = window.getComputedStyle(element);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0'\n );\n};\n\nfunction getHighlightColors(type) {\n switch (type) {\n case 'LiveComponent':\n return liveComponentsColors;\n case 'LiveView':\n return liveViewColors;\n case 'StreamItem':\n return streamItemColors;\n default:\n return liveViewColors;\n }\n}\n\nfunction createHighlightElement(activeElement, detail, id) {\n const rect = activeElement.getBoundingClientRect();\n const highlight = document.createElement('div');\n\n highlight.id = id;\n highlight.dataset.attr = detail.attr;\n highlight.dataset.val = detail.val;\n\n highlight.style.position = 'absolute';\n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${activeElement.offsetWidth}px`;\n highlight.style.height = `${activeElement.offsetHeight}px`;\n highlight.style.backgroundColor = getHighlightColors(detail.type)[0];\n highlight.style.zIndex = '10000';\n highlight.style.pointerEvents = 'none';\n\n return highlight;\n}\n\nfunction removeHighlightElement(shadowRoot) {\n const highlightElement = shadowRoot.querySelector(`#${highlightElementID}`);\n\n if (highlightElement) {\n highlightElement.remove();\n }\n\n dispatchCustomEvent('lvdbg:remove-tooltip');\n}\n\nfunction handleHighlight({ detail }, shadowRoot) {\n let highlightElement = shadowRoot.querySelector(`#${highlightElementID}`);\n\n if (highlightElement) {\n highlightElement.remove();\n dispatchCustomEvent('lvdbg:remove-tooltip');\n\n const toClear = detail.attr === undefined || detail.val === undefined;\n const sameElement = highlightElement.dataset.val === detail.val;\n\n if (toClear || sameElement) {\n return;\n }\n }\n\n const activeElement = document.querySelector(\n `[${detail.attr}=\"${detail.val}\"]`\n );\n\n if (isElementVisible(activeElement)) {\n highlightElement = createHighlightElement(\n activeElement,\n detail,\n highlightElementID\n );\n\n shadowRoot.appendChild(highlightElement);\n showTooltip(detail);\n }\n}\n\nfunction handleHighlightResize(shadowRoot) {\n const highlight = shadowRoot.querySelector(`#${highlightElementID}`);\n if (highlight) {\n const activeElement = document.querySelector(\n `[${highlight.dataset.attr}=\"${highlight.dataset.val}\"]`\n );\n const rect = activeElement.getBoundingClientRect();\n\n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${activeElement.offsetWidth}px`;\n highlight.style.height = `${activeElement.offsetHeight}px`;\n }\n}\n\nfunction handlePulse({ detail }, shadowRoot) {\n const activeElement = document.querySelector(\n `[${detail.attr}=\"${detail.val}\"]`\n );\n\n if (isElementVisible(activeElement)) {\n const highlightPulse = createHighlightElement(\n activeElement,\n detail,\n highlightPulseElementID\n );\n\n shadowRoot.appendChild(highlightPulse);\n\n const w = highlightPulse.offsetWidth;\n const h = highlightPulse.offsetHeight;\n\n const colors = getHighlightColors(detail.type);\n\n highlightPulse.animate(\n [\n {\n width: `${w}px`,\n height: `${h}px`,\n transform: 'translate(0, 0)',\n backgroundColor: colors[1],\n },\n {\n width: `${w + 20}px`,\n height: `${h + 20}px`,\n transform: 'translate(-10px, -10px)',\n backgroundColor: colors[2],\n },\n {\n width: `${w + 40}px`,\n height: `${h + 40}px`,\n transform: 'translate(-20px, -20px)',\n backgroundColor: colors[3],\n },\n ],\n {\n duration: 500,\n iterations: 1,\n delay: 200,\n }\n ).onfinish = () => {\n highlightPulse.remove();\n };\n }\n}\n\nfunction showTooltip(detail) {\n const requiredKeys = ['module', 'type', 'id_key', 'id_value'];\n const hasAllKeys = requiredKeys.every((key) => detail.hasOwnProperty(key));\n\n if (!hasAllKeys) {\n return;\n }\n\n const props = {\n detail: {\n module: detail.module,\n type: detail.type,\n id_key: detail.id_key,\n id_value: detail.id_value,\n },\n };\n\n dispatchCustomEvent('lvdbg:show-tooltip', props);\n}\n\nexport default function initHighlight(debugChannel, shadowRoot) {\n document.addEventListener('lvdbg:inspect-highlight', (event) =>\n handleHighlight(event, shadowRoot)\n );\n document.addEventListener('lvdbg:inspect-pulse', (event) =>\n handlePulse(event, shadowRoot)\n );\n document.addEventListener('lvdbg:inspect-clear', () =>\n removeHighlightElement(shadowRoot)\n );\n\n debugChannel.on('highlight', (e) =>\n handleHighlight({ detail: e }, shadowRoot)\n );\n debugChannel.on('pulse', (e) => handlePulse({ detail: e }, shadowRoot));\n\n window.addEventListener('resize', () => handleHighlightResize(shadowRoot));\n}\n", "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n", "const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n", "import { v4 as uuidv4 } from 'uuid';\n\nexport default function pushWindowInitialized(debugChannel, socketID) {\n const windowID = maybeSetWindowID();\n\n debugChannel.push('window-initialized', {\n window_id: windowID,\n socket_id: socketID,\n });\n}\n\nfunction maybeSetWindowID() {\n const windowID = window.name;\n if (windowID) {\n return windowID;\n }\n\n const newWindowID = uuidv4();\n window.name = newWindowID;\n return newWindowID;\n}\n", "import pushWindowInitialized from './window_identifier';\n\nexport default function initDebugSocket(baseURL, socketID, rootSocketIDs) {\n const websocketURL = baseURL.replace(/^http/, 'ws') + '/client';\n\n const debugSocket = new window.Phoenix.Socket(websocketURL, {\n params: { socketID, rootSocketIDs },\n });\n\n debugSocket.connect();\n\n const debugChannel = debugSocket.channel(`client:${socketID}`);\n\n debugChannel\n .join()\n .receive('ok', () => {\n pushWindowInitialized(debugChannel, socketID);\n console.log('LiveDebugger debug connection established!');\n })\n .receive('error', (resp) => {\n console.error(\n 'LiveDebugger was unable to establish websocket debug connection! Browser features will not work:\\n',\n resp\n );\n });\n\n return { debugSocket, debugChannel };\n}\n", "import { dispatchCustomEvent } from '../utils/dom';\n\nexport default function initElementInspection({\n baseURL,\n debugChannel,\n socketID,\n debugButton,\n}) {\n let inspectMode = false;\n let lastID = null;\n let sourceLiveViews = [];\n\n debugChannel.on('found-node-element', (event) => {\n pushShowTooltipEvent({\n module: event.module,\n type: event.type,\n id_key: event.id_key,\n id_value: event.id_value,\n });\n });\n\n debugChannel.on('inspect-mode-changed', (event) => {\n if (event.inspect_mode) {\n enableInspectMode();\n sourceLiveViews.push(event.pid);\n } else {\n sourceLiveViews = sourceLiveViews.filter((pid) => pid !== event.pid);\n\n if (sourceLiveViews.length === 0) {\n disableInspectMode();\n }\n }\n });\n\n const handleMove = (event) => {\n const elementInfo = getClosestElementInfo(event.target);\n\n if (!elementInfo) {\n return;\n }\n\n const detail = getHighlightDetail(elementInfo);\n\n if (detail.val === lastID) {\n return;\n }\n\n const id =\n elementInfo.type == 'LiveComponent'\n ? elementInfo.element.dataset.phxComponent\n : elementInfo.element.id;\n\n debugChannel.push('request-node-element', {\n root_socket_id: socketID,\n socket_id: elementInfo.phxId,\n type: elementInfo.type,\n id,\n });\n\n lastID = detail.val;\n\n pushHighlightEvent({\n attr: detail.attr,\n val: detail.val,\n type: elementInfo.type,\n });\n };\n\n const handleInspect = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n const elementInfo = getClosestElementInfo(event.target);\n\n if (!elementInfo) {\n return;\n }\n\n const detail = getHighlightDetail(elementInfo);\n\n pushPulseEvent({\n attr: detail.attr,\n val: detail.val,\n type: elementInfo.type,\n });\n\n const url = getElementURL(baseURL, elementInfo);\n\n if (sourceLiveViews.length === 0) {\n window.open(url, '_blank');\n } else {\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('element-inspected', {\n pid: pid,\n url: url,\n });\n });\n }\n\n sourceLiveViews = [];\n disableInspectMode();\n };\n\n const handleRightClick = (event) => {\n event.preventDefault();\n\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('inspect-mode-changed', {\n inspect_mode: false,\n pid: pid,\n });\n });\n\n sourceLiveViews = [];\n disableInspectMode();\n };\n\n const handleEscape = (event) => {\n if (event.key === 'Escape') {\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('inspect-mode-changed', {\n inspect_mode: false,\n pid: pid,\n });\n });\n\n sourceLiveViews = [];\n disableInspectMode();\n }\n };\n\n const handleMouseLeave = () => {\n pushClearEvent();\n lastID = null;\n };\n\n const disableInspectMode = () => {\n if (!inspectMode) {\n return;\n }\n\n inspectMode = false;\n lastID = null;\n\n if (debugButton) debugButton.classList.remove('live-debugger-inspect-mode');\n\n pushClearEvent();\n pushRemoveTooltipEvent();\n\n document.body.classList.remove('live-debugger-inspect-mode');\n document.body.removeEventListener('click', handleInspect);\n document.body.removeEventListener('mouseover', handleMove);\n document.removeEventListener('mouseleave', handleMouseLeave);\n document.removeEventListener('contextmenu', handleRightClick);\n document.removeEventListener('keydown', handleEscape);\n };\n\n const enableInspectMode = () => {\n if (inspectMode) {\n return;\n }\n\n inspectMode = true;\n\n if (debugButton) debugButton.classList.add('live-debugger-inspect-mode');\n\n document.body.classList.add('live-debugger-inspect-mode');\n document.body.addEventListener('click', handleInspect);\n document.body.addEventListener('mouseover', handleMove);\n document.body.addEventListener('mouseleave', handleMouseLeave);\n document.addEventListener('contextmenu', handleRightClick);\n document.addEventListener('keydown', handleEscape);\n };\n\n document.addEventListener('lvdbg:inspect-button-click', (event) => {\n setTimeout(enableInspectMode);\n });\n}\n\nfunction pushHighlightEvent(detail) {\n dispatchCustomEvent('lvdbg:inspect-highlight', {\n detail,\n });\n}\n\nfunction pushPulseEvent(detail) {\n dispatchCustomEvent('lvdbg:inspect-pulse', {\n detail,\n });\n}\n\nfunction pushClearEvent() {\n dispatchCustomEvent('lvdbg:inspect-clear');\n}\n\nfunction pushShowTooltipEvent(detail) {\n dispatchCustomEvent('lvdbg:show-tooltip', {\n detail,\n });\n}\n\nfunction pushRemoveTooltipEvent() {\n dispatchCustomEvent('lvdbg:remove-tooltip');\n}\n\nfunction getClosestElementInfo(target) {\n const liveViewElement = target.closest('[data-phx-session]');\n const componentElement = target.closest('[data-phx-component]');\n\n if (!liveViewElement) return null;\n\n const rootElementId = liveViewElement.getAttribute('data-phx-root-id');\n\n if (componentElement && liveViewElement.contains(componentElement)) {\n return {\n element: componentElement,\n type: 'LiveComponent',\n phxRootId: rootElementId,\n phxId: liveViewElement.id,\n };\n }\n\n return {\n element: liveViewElement,\n type: 'LiveView',\n phxRootId: rootElementId,\n phxId: liveViewElement.id,\n };\n}\n\nfunction getElementURL(baseURL, { element, type, phxRootId, phxId }) {\n const url = new URL(`${baseURL}/redirect/${phxId}`);\n\n if (phxRootId !== phxId) {\n url.searchParams.set('root_id', phxRootId);\n }\n\n if (type === 'LiveComponent') {\n url.searchParams.set('node_id', element.dataset.phxComponent);\n }\n url.searchParams.set('from', 'inspect_button');\n return url;\n}\n\nfunction getHighlightDetail({ type, element, phxId }) {\n if (type === 'LiveComponent') {\n return {\n attr: 'data-phx-id',\n val: `c${element.dataset.phxComponent}-${phxId}`,\n };\n }\n\n return {\n attr: 'id',\n val: element.id,\n };\n}\n", "import tooltipHtml from './tooltip.html';\nimport { createElement } from '../../utils/dom';\n\nfunction setTypeIcon(tooltip, data) {\n const componentIcon = tooltip.querySelector(\n '.live-debugger-tooltip-icon-component'\n );\n componentIcon.style.display =\n data.type === 'LiveComponent' ? 'block' : 'none';\n\n const viewIcon = tooltip.querySelector('.live-debugger-tooltip-icon-view');\n viewIcon.style.display = data.type === 'LiveView' ? 'block' : 'none';\n}\n\nfunction populateTypeInfo(tooltip, data) {\n const typeInfo = tooltip.querySelector('.type-info');\n const typeText = typeInfo.querySelector('.type-text');\n const typeSquare = typeInfo.querySelector('.live-debugger-type-square');\n\n typeText.textContent = data.type;\n typeSquare.style.backgroundColor =\n data.type === 'LiveComponent' ? '#87CCE8' : '#ffe780';\n}\n\nfunction populateIdInfo(tooltip, data) {\n const idInfo = tooltip.querySelector('.id-info');\n const label = idInfo.querySelector('.label');\n const value = idInfo.querySelector('.value');\n\n label.textContent = `${data.id_key}:`;\n value.textContent = data.id_value;\n}\n\nfunction populateInfoSection(tooltip, data) {\n populateTypeInfo(tooltip, data);\n populateIdInfo(tooltip, data);\n}\n\nfunction setModuleName(tooltip, data) {\n const moduleName = tooltip.querySelector('.live-debugger-tooltip-module');\n moduleName.textContent = data.module || 'Element';\n}\n\nexport function createTooltip(data, shadowRoot) {\n const tooltip = createElement(tooltipHtml);\n\n setModuleName(tooltip, data);\n setTypeIcon(tooltip, data);\n populateInfoSection(tooltip, data);\n\n shadowRoot.appendChild(tooltip);\n return tooltip;\n}\n", "function calculateInitialPosition(highlightRect, tooltipRect) {\n let top = highlightRect.top - tooltipRect.height - 10;\n let left = highlightRect.left;\n\n return { top, left };\n}\n\nfunction adjustVerticalPosition(\n top,\n highlightRect,\n tooltipRect,\n viewportHeight\n) {\n // Check if tooltip would overflow top\n if (top < 10) {\n // Position below the highlight element\n top = highlightRect.bottom + 10;\n }\n\n // Check if tooltip would overflow bottom\n if (top + tooltipRect.height > viewportHeight - 10) {\n // Try to position above instead\n top = highlightRect.top - tooltipRect.height - 10;\n if (top < 10) {\n // If still overflowing, position at the top of viewport\n top = 10;\n }\n }\n\n // Ensure tooltip doesn't go off-screen vertically\n if (top < 10) top = 10;\n if (top + tooltipRect.height > viewportHeight - 10) {\n top = viewportHeight - tooltipRect.height - 10;\n }\n\n return top;\n}\n\nfunction adjustHorizontalPosition(left, tooltipRect, viewportWidth) {\n // Check if tooltip would overflow right\n if (left + tooltipRect.width > viewportWidth - 10) {\n left = viewportWidth - tooltipRect.width - 10;\n }\n\n // Check if tooltip would overflow left\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off-screen horizontally\n if (left < 10) left = 10;\n if (left + tooltipRect.width > viewportWidth - 10) {\n left = viewportWidth - tooltipRect.width - 10;\n }\n\n return left;\n}\n\nfunction applyPosition(tooltip, top, left) {\n tooltip.style.top = `${top + window.scrollY}px`;\n tooltip.style.left = `${left + window.scrollX}px`;\n}\n\nexport function positionTooltip(tooltip, highlightElement) {\n if (!highlightElement || !tooltip) return;\n\n const highlightRect = highlightElement.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let { top, left } = calculateInitialPosition(highlightRect, tooltipRect);\n\n top = adjustVerticalPosition(top, highlightRect, tooltipRect, viewportHeight);\n left = adjustHorizontalPosition(left, tooltipRect, viewportWidth);\n\n applyPosition(tooltip, top, left);\n\n return { top, left, tooltipRect };\n}\n", "function removeExistingArrow(tooltip) {\n const existingArrow = tooltip.querySelector('.live-debugger-tooltip-arrow');\n if (existingArrow) {\n existingArrow.remove();\n }\n}\n\nfunction createArrowElement() {\n const arrow = document.createElement('div');\n arrow.className = 'live-debugger-tooltip-arrow';\n return arrow;\n}\n\nfunction determineArrowDirection(tooltipTop, tooltipRect, highlightRect) {\n const tooltipBottom = tooltipTop + tooltipRect.height;\n const highlightTop = highlightRect.top;\n\n return tooltipBottom < highlightTop ? 'down' : 'up';\n}\n\nexport function addTooltipArrow(\n tooltip,\n highlightRect,\n tooltipTop,\n tooltipRect\n) {\n removeExistingArrow(tooltip);\n\n const arrow = createArrowElement();\n const direction = determineArrowDirection(\n tooltipTop,\n tooltipRect,\n highlightRect\n );\n\n if (direction === 'down') {\n arrow.classList.add('live-debugger-tooltip-arrow-down');\n } else {\n arrow.classList.add('live-debugger-tooltip-arrow-up');\n }\n\n tooltip.appendChild(arrow);\n}\n", "import { createTooltip } from './tooltip_creator';\nimport { positionTooltip } from './tooltip_positioner';\nimport { addTooltipArrow } from './tooltip_arrow';\n\nconst tooltipID = 'live-debugger-tooltip';\nconst highlightElementID = 'live-debugger-highlight-element';\n\nfunction getHighlightElement(shadowRoot) {\n return shadowRoot.querySelector(`#${highlightElementID}`);\n}\n\nfunction removeTooltip(shadowRoot) {\n const existingTooltip = shadowRoot.querySelector(`#${tooltipID}`);\n if (existingTooltip) {\n existingTooltip.remove();\n }\n}\n\nfunction showTooltip(data, shadowRoot) {\n const highlightElement = getHighlightElement(shadowRoot);\n if (!highlightElement) {\n return;\n }\n\n removeTooltip(shadowRoot);\n const tooltip = createTooltip(data, shadowRoot);\n const positionData = positionTooltip(tooltip, highlightElement);\n\n if (positionData) {\n addTooltipArrow(\n tooltip,\n highlightElement.getBoundingClientRect(),\n positionData.top,\n positionData.tooltipRect\n );\n }\n}\n\nfunction handleTooltipResize(shadowRoot) {\n const tooltip = shadowRoot.querySelector(`#${tooltipID}`);\n const highlightElement = getHighlightElement(shadowRoot);\n\n if (tooltip && highlightElement) {\n const positionData = positionTooltip(tooltip, highlightElement);\n\n if (positionData) {\n addTooltipArrow(\n tooltip,\n highlightElement.getBoundingClientRect(),\n positionData.top,\n positionData.tooltipRect\n );\n }\n }\n}\n\nfunction handleShowTooltipEvent(event, shadowRoot) {\n showTooltip(event.detail, shadowRoot);\n}\n\nfunction handleRemoveTooltipEvent(shadowRoot) {\n removeTooltip(shadowRoot);\n}\n\nfunction setupEventListeners(shadowRoot) {\n window.addEventListener('resize', () => handleTooltipResize(shadowRoot));\n window.addEventListener('scroll', () => handleTooltipResize(shadowRoot));\n\n document.addEventListener('lvdbg:show-tooltip', (event) =>\n handleShowTooltipEvent(event, shadowRoot)\n );\n document.addEventListener('lvdbg:remove-tooltip', () =>\n handleRemoveTooltipEvent(shadowRoot)\n );\n}\n\nexport default function initTooltip(shadowRoot) {\n setupEventListeners(shadowRoot);\n}\n", "// This file is being run in the client's debugged application\n// It introduces browser features that are not mandatory for LiveDebugger to run\n\nimport initDebugMenu from './components/debug_menu';\nimport initHighlight from './services/highlight';\nimport initDebugSocket from './services/debug_socket';\nimport initElementInspection from './services/inspect';\nimport initTooltip from './components/tooltip/tooltip';\n\nimport {\n getMetaTag,\n fetchLiveDebuggerBaseURL,\n fetchDebuggedSocketIDs,\n} from './utils/meta';\n\nwindow.document.addEventListener('DOMContentLoaded', async () => {\n const metaTag = getMetaTag();\n const baseURL = fetchLiveDebuggerBaseURL(metaTag);\n let { mainSocketID, rootSocketIDs } = await fetchDebuggedSocketIDs();\n\n if (!mainSocketID) {\n [mainSocketID, ...rootSocketIDs] = rootSocketIDs;\n } else {\n rootSocketIDs = [];\n }\n\n if (mainSocketID) {\n const sessionURL = `${baseURL}/redirect/${mainSocketID}`;\n\n const { debugChannel } = initDebugSocket(\n baseURL,\n mainSocketID,\n rootSocketIDs\n );\n\n debugChannel.on('ping', (resp) => {\n console.log('Received ping', resp);\n debugChannel.push('pong', resp);\n });\n\n const shadowHost = document.createElement('div');\n shadowHost.style.position = 'absolute';\n shadowHost.style.width = '0px';\n shadowHost.style.height = '0px';\n shadowHost.style.left = '0px';\n shadowHost.style.top = '0px';\n shadowHost.style.zIndex = '2147483647';\n document.body.appendChild(shadowHost);\n\n const shadowRoot = shadowHost.attachShadow({ mode: 'closed' });\n\n const cssLink = document.createElement('link');\n cssLink.rel = 'stylesheet';\n cssLink.href = `${baseURL}/assets/live_debugger/client.css`;\n shadowRoot.appendChild(cssLink);\n\n const { debugButton } = initDebugMenu(\n metaTag,\n sessionURL,\n debugChannel,\n shadowRoot\n );\n initElementInspection({\n baseURL,\n debugChannel,\n socketID: mainSocketID,\n debugButton,\n });\n initTooltip(shadowRoot);\n initHighlight(debugChannel, shadowRoot);\n }\n\n console.info(`LiveDebugger available at: ${baseURL}`);\n});\n"], - "mappings": "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", - "names": ["createElement", "html", "tempDiv", "dispatchCustomEvent", "event", "payload", "customEvent", "initDebugButton", "debugButton", "createElement", "debug_button_default", "isDragging", "onClick", "placeButton", "dispatchCustomEvent", "dragButton", "onMouseMove", "event", "buttonWidth", "buttonHeight", "maxLeft", "maxTop", "newLeft", "newTop", "ensureButtonInViewport", "buttonRect", "initDebugOptions", "liveDebuggerURL", "debugChannel", "debugOptions", "createElement", "debug_options_default", "isVisible", "showDebugOptions", "debugButtonRect", "debugOptionsRect", "debugOptionsWidth", "debugOptionsHeight", "hideDebugOptions", "onDebugButtonClick", "event", "onNewTabButtonClick", "onInspectButtonClick", "dispatchCustomEvent", "onMoveButtonClick", "fetchDebuggedSocketIDs", "resolve", "liveViewElements", "rootIDsMapping", "mainID", "handleMutation", "mutation", "isRootIDAttributeChanged", "registerRootID", "isAllRootIDsRegistered", "observer", "getRootSocketIDs", "mutations", "el", "rootIDs", "target", "rootSocketIDs", "getMetaTag", "metaTag", "message", "fetchLiveDebuggerBaseURL", "isDebugButtonEnabled", "initDebugMenu", "metaTag", "liveDebuggerURL", "debugChannel", "shadowRoot", "debugButton", "initDebugButton", "debugMenu", "initDebugOptions", "suppressOutsideClick", "suppressNext", "mount", "unmount", "isDebugButtonEnabled", "enabled", "event", "path", "clickedInside", "node", "dispatchCustomEvent", "highlightElementID", "highlightPulseElementID", "liveViewColors", "liveComponentsColors", "streamItemColors", "isElementVisible", "element", "style", "getHighlightColors", "type", "createHighlightElement", "activeElement", "detail", "id", "rect", "highlight", "removeHighlightElement", "shadowRoot", "highlightElement", "dispatchCustomEvent", "handleHighlight", "toClear", "sameElement", "showTooltip", "handleHighlightResize", "handlePulse", "highlightPulse", "w", "h", "colors", "key", "props", "initHighlight", "debugChannel", "event", "e", "byteToHex", "i", "unsafeStringify", "arr", "offset", "getRandomValues", "rnds8", "rng", "randomUUID", "native_default", "v4", "options", "buf", "offset", "native_default", "rnds", "rng", "unsafeStringify", "v4_default", "pushWindowInitialized", "debugChannel", "socketID", "windowID", "maybeSetWindowID", "newWindowID", "v4_default", "initDebugSocket", "baseURL", "socketID", "rootSocketIDs", "websocketURL", "debugSocket", "debugChannel", "pushWindowInitialized", "resp", "initElementInspection", "baseURL", "debugChannel", "socketID", "debugButton", "inspectMode", "lastID", "sourceLiveViews", "event", "pushShowTooltipEvent", "enableInspectMode", "pid", "disableInspectMode", "handleMove", "elementInfo", "getClosestElementInfo", "detail", "getHighlightDetail", "id", "pushHighlightEvent", "handleInspect", "pushPulseEvent", "url", "getElementURL", "handleRightClick", "handleEscape", "handleMouseLeave", "pushClearEvent", "pushRemoveTooltipEvent", "dispatchCustomEvent", "target", "liveViewElement", "componentElement", "rootElementId", "element", "type", "phxRootId", "phxId", "setTypeIcon", "tooltip", "data", "componentIcon", "viewIcon", "populateTypeInfo", "typeInfo", "typeText", "typeSquare", "populateIdInfo", "idInfo", "label", "value", "populateInfoSection", "setModuleName", "moduleName", "createTooltip", "shadowRoot", "createElement", "tooltip_default", "calculateInitialPosition", "highlightRect", "tooltipRect", "top", "left", "adjustVerticalPosition", "viewportHeight", "adjustHorizontalPosition", "viewportWidth", "applyPosition", "tooltip", "positionTooltip", "highlightElement", "removeExistingArrow", "tooltip", "existingArrow", "createArrowElement", "arrow", "determineArrowDirection", "tooltipTop", "tooltipRect", "highlightRect", "tooltipBottom", "highlightTop", "addTooltipArrow", "tooltipID", "highlightElementID", "getHighlightElement", "shadowRoot", "removeTooltip", "existingTooltip", "showTooltip", "data", "highlightElement", "tooltip", "createTooltip", "positionData", "positionTooltip", "addTooltipArrow", "handleTooltipResize", "handleShowTooltipEvent", "event", "handleRemoveTooltipEvent", "setupEventListeners", "initTooltip", "metaTag", "getMetaTag", "baseURL", "fetchLiveDebuggerBaseURL", "mainSocketID", "rootSocketIDs", "fetchDebuggedSocketIDs", "sessionURL", "debugChannel", "initDebugSocket", "resp", "shadowHost", "shadowRoot", "cssLink", "debugButton", "initDebugMenu", "initElementInspection", "initTooltip", "initHighlight"] + "sourcesContent": ["export function createElement(html) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = html;\n return tempDiv.firstElementChild;\n}\n\nexport function dispatchCustomEvent(event, payload = {}) {\n const customEvent = new CustomEvent(event, payload);\n document.dispatchEvent(customEvent);\n}\n", "import debugButtonHtml from './debug_button.html';\nimport { createElement, dispatchCustomEvent } from '../../utils/dom';\n\nexport default function initDebugButton() {\n const debugButton = createElement(debugButtonHtml);\n\n let isDragging = false;\n\n const onClick = () => {\n if (isDragging) {\n placeButton();\n } else {\n dispatchCustomEvent('lvdbg:debug-button-click', {\n detail: {\n buttonRect: debugButton.getBoundingClientRect(),\n },\n });\n }\n };\n\n const dragButton = () => {\n isDragging = true;\n debugButton.style.cursor = 'grabbing';\n document.addEventListener('mousemove', onMouseMove);\n };\n\n const placeButton = () => {\n isDragging = false;\n debugButton.style.cursor = 'pointer';\n document.removeEventListener('mousemove', onMouseMove);\n };\n\n const onMouseMove = (event) => {\n const buttonWidth = debugButton.offsetWidth;\n const buttonHeight = debugButton.offsetHeight;\n\n // Make sure the button doesn't overflow the viewport\n const maxLeft = window.innerWidth - buttonWidth;\n const maxTop = window.innerHeight - buttonHeight;\n\n const newLeft = Math.max(\n 0,\n Math.min(event.clientX - buttonWidth / 2, maxLeft)\n );\n const newTop = Math.max(\n 0,\n Math.min(event.clientY - buttonHeight / 2, maxTop)\n );\n\n debugButton.style.left = `${newLeft}px`;\n debugButton.style.top = `${newTop}px`;\n debugButton.style.right = 'auto';\n debugButton.style.bottom = 'auto';\n };\n\n const ensureButtonInViewport = () => {\n const buttonRect = debugButton.getBoundingClientRect();\n\n const isVisible =\n buttonRect.top >= 0 &&\n buttonRect.left >= 0 &&\n buttonRect.bottom <= window.innerHeight &&\n buttonRect.right <= window.innerWidth;\n\n if (!isVisible) {\n debugButton.style.left = 'auto';\n debugButton.style.top = 'auto';\n debugButton.style.right = '20px';\n debugButton.style.bottom = '20px';\n }\n };\n\n debugButton.addEventListener('click', onClick);\n document.addEventListener('lvdbg:move-button-click', dragButton);\n window.addEventListener('resize', () => ensureButtonInViewport());\n\n return debugButton;\n}\n", "import debugOptionsHtml from './debug_options.html';\nimport { createElement, dispatchCustomEvent } from '../../utils/dom';\n\nexport default function initDebugOptions({ liveDebuggerURL, debugChannel }) {\n const debugOptions = createElement(debugOptionsHtml);\n\n let isVisible = false;\n\n const showDebugOptions = (debugButtonRect) => {\n debugOptions.style.display = 'block';\n\n const debugOptionsRect = debugOptions.getBoundingClientRect();\n const debugOptionsWidth = debugOptionsRect.width;\n const debugOptionsHeight = debugOptionsRect.height;\n\n // Check if the debug options would overflow on the right\n if (debugButtonRect.right + debugOptionsWidth > window.innerWidth) {\n debugOptions.style.left = `${debugButtonRect.left - debugOptionsWidth}px`;\n } else {\n debugOptions.style.left = `${debugButtonRect.right}px`;\n }\n\n // Check if the debug options would overflow on the bottom\n if (debugButtonRect.top + debugOptionsHeight > window.innerHeight) {\n debugOptions.style.top = `${debugButtonRect.bottom - debugOptionsHeight}px`;\n } else {\n debugOptions.style.top = `${debugButtonRect.top}px`;\n }\n\n isVisible = true;\n };\n\n const hideDebugOptions = () => {\n debugOptions.style.display = 'none';\n isVisible = false;\n };\n\n const onDebugButtonClick = (event) => {\n const debugButtonRect = event.detail.buttonRect;\n if (isVisible) {\n hideDebugOptions();\n } else {\n showDebugOptions(debugButtonRect);\n }\n };\n\n const onNewTabButtonClick = () => {\n window.open(liveDebuggerURL, '_blank');\n hideDebugOptions();\n };\n\n const onInspectButtonClick = () => {\n dispatchCustomEvent('lvdbg:inspect-button-click');\n hideDebugOptions();\n };\n\n const onMoveButtonClick = () => {\n dispatchCustomEvent('lvdbg:move-button-click');\n hideDebugOptions();\n };\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-open-in-new-tab')\n .addEventListener('click', onNewTabButtonClick);\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-inspect-elements')\n .addEventListener('click', onInspectButtonClick);\n\n debugOptions\n .querySelector('#live-debugger-debug-tooltip-move-button')\n .addEventListener('click', onMoveButtonClick);\n\n document.addEventListener('lvdbg:debug-button-click', onDebugButtonClick);\n document.addEventListener('lvdbg:click-outside-debug-menu', hideDebugOptions);\n\n debugChannel.on('inspect-mode-changed', hideDebugOptions);\n\n window.addEventListener('resize', () => {\n if (isVisible) {\n hideDebugOptions();\n }\n });\n\n return debugOptions;\n}\n", "export function fetchDebuggedSocketIDs() {\n return new Promise((resolve) => {\n const liveViewElements = document.querySelectorAll('[data-phx-session]');\n const rootIDsMapping = {};\n const mainID = document.querySelector('[data-phx-main]')?.id;\n\n const handleMutation = (mutation) => {\n if (!isRootIDAttributeChanged(mutation)) return;\n\n registerRootID(rootIDsMapping, mutation.target);\n\n if (isAllRootIDsRegistered(rootIDsMapping, liveViewElements)) {\n observer.disconnect();\n\n resolve({\n mainSocketID: mainID,\n rootSocketIDs: getRootSocketIDs(rootIDsMapping, mainID),\n });\n }\n };\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(handleMutation);\n });\n\n liveViewElements.forEach((el) => {\n observer.observe(el, { attributes: true });\n });\n });\n}\n\nfunction isRootIDAttributeChanged(mutation) {\n return (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'data-phx-root-id'\n );\n}\n\nfunction registerRootID(rootIDs, target) {\n rootIDs[target.id] = target.getAttribute('data-phx-root-id');\n}\n\nfunction isAllRootIDsRegistered(rootIDs, liveViewElements) {\n return Object.keys(rootIDs).length >= liveViewElements.length;\n}\n\nfunction getRootSocketIDs(rootIDs, mainID) {\n const rootSocketIDs = new Set(Object.values(rootIDs));\n rootSocketIDs.delete(mainID);\n return [...rootSocketIDs];\n}\n\nexport function getMetaTag() {\n const metaTag = document.querySelector('meta[name=\"live-debugger-config\"]');\n\n if (metaTag) {\n return metaTag;\n } else {\n const message = `\n LiveDebugger meta tag not found!\n If you have recently bumped LiveDebugger version, please update your layout according to the instructions in the GitHub README.\n You can find it here: https://github.com/software-mansion/live-debugger#installation\n `;\n\n throw new Error(message);\n }\n}\n\nexport function fetchLiveDebuggerBaseURL(metaTag) {\n return metaTag.getAttribute('url');\n}\n\nexport function isDebugButtonEnabled(metaTag) {\n return metaTag.hasAttribute('debug-button');\n}\n", "import initDebugButton from './debug_button/debug_button';\nimport initDebugOptions from './debug_options/debug_options';\nimport { dispatchCustomEvent } from '../utils/dom';\nimport { isDebugButtonEnabled } from '../utils/meta';\n\nexport default function initDebugMenu(\n metaTag,\n liveDebuggerURL,\n debugChannel,\n shadowRoot\n) {\n const debugButton = initDebugButton();\n const debugMenu = initDebugOptions({ liveDebuggerURL, debugChannel });\n let suppressOutsideClick = false;\n\n const suppressNext = () => {\n suppressOutsideClick = true;\n setTimeout(() => {\n suppressOutsideClick = false;\n }, 0);\n };\n\n debugButton.addEventListener('click', suppressNext, true);\n debugMenu.addEventListener('click', suppressNext, true);\n\n const mount = () => {\n shadowRoot.appendChild(debugButton);\n shadowRoot.appendChild(debugMenu);\n };\n\n const unmount = () => {\n debugButton.remove();\n debugMenu.remove();\n };\n\n if (isDebugButtonEnabled(metaTag)) mount();\n\n debugChannel.on('toggle-debug-button', ({ enabled }) => {\n if (enabled) {\n mount();\n } else {\n unmount();\n }\n });\n\n // Hide menu when clicking outside\n document.addEventListener('click', (event) => {\n const path = event.composedPath?.() ?? [event.target];\n const clickedInside =\n path.includes(debugButton) ||\n path.includes(debugMenu) ||\n path.some((node) => node?.getRootNode?.() === shadowRoot);\n\n if (suppressOutsideClick) return;\n\n if (!clickedInside) {\n dispatchCustomEvent('lvdbg:click-outside-debug-menu');\n }\n });\n\n return { debugButton, debugMenu };\n}\n", "import { dispatchCustomEvent } from '../utils/dom';\n\nconst highlightElementID = 'live-debugger-highlight-element';\nconst highlightPulseElementID = 'live-debugger-highlight-pulse-element';\nconst liveViewColors = ['#ffe78080', '#ffe78060', '#ffe78030', '#ffe78000'];\nconst liveComponentsColors = [\n '#87CCE880',\n '#87CCE860',\n '#87CCE830',\n '#87CCE800',\n];\nconst streamItemColors = ['#8bca8480'];\n\nconst isElementVisible = (element) => {\n if (!element) return false;\n\n if (element.checkVisibility) {\n return element.checkVisibility();\n }\n\n const style = window.getComputedStyle(element);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0'\n );\n};\n\nfunction getHighlightColors(type) {\n switch (type) {\n case 'LiveComponent':\n return liveComponentsColors;\n case 'LiveView':\n return liveViewColors;\n case 'StreamItem':\n return streamItemColors;\n default:\n return liveViewColors;\n }\n}\n\nfunction createHighlightElement(activeElement, detail, id) {\n const rect = activeElement.getBoundingClientRect();\n const highlight = document.createElement('div');\n\n highlight.id = id;\n highlight.dataset.attr = detail.attr;\n highlight.dataset.val = detail.val;\n\n highlight.style.position = 'absolute';\n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${activeElement.offsetWidth}px`;\n highlight.style.height = `${activeElement.offsetHeight}px`;\n highlight.style.backgroundColor = getHighlightColors(detail.type)[0];\n highlight.style.zIndex = '10000';\n highlight.style.pointerEvents = 'none';\n\n return highlight;\n}\n\nfunction removeHighlightElement(shadowRoot) {\n const highlightElement = shadowRoot.querySelector(`#${highlightElementID}`);\n\n if (highlightElement) {\n highlightElement.remove();\n }\n\n dispatchCustomEvent('lvdbg:remove-tooltip');\n}\n\nfunction handleHighlight({ detail }, shadowRoot) {\n let highlightElement = shadowRoot.querySelector(`#${highlightElementID}`);\n\n if (highlightElement) {\n highlightElement.remove();\n dispatchCustomEvent('lvdbg:remove-tooltip');\n\n const toClear = detail.attr === undefined || detail.val === undefined;\n const sameElement = highlightElement.dataset.val === detail.val;\n\n if (toClear || sameElement) {\n return;\n }\n }\n\n const activeElement = document.querySelector(\n `[${detail.attr}=\"${detail.val}\"]`\n );\n\n if (isElementVisible(activeElement)) {\n highlightElement = createHighlightElement(\n activeElement,\n detail,\n highlightElementID\n );\n\n shadowRoot.appendChild(highlightElement);\n showTooltip(detail);\n }\n}\n\nfunction handleHighlightResize(shadowRoot) {\n const highlight = shadowRoot.querySelector(`#${highlightElementID}`);\n if (highlight) {\n const activeElement = document.querySelector(\n `[${highlight.dataset.attr}=\"${highlight.dataset.val}\"]`\n );\n const rect = activeElement.getBoundingClientRect();\n\n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${activeElement.offsetWidth}px`;\n highlight.style.height = `${activeElement.offsetHeight}px`;\n }\n}\n\nfunction handlePulse({ detail }, shadowRoot) {\n const activeElement = document.querySelector(\n `[${detail.attr}=\"${detail.val}\"]`\n );\n\n if (isElementVisible(activeElement)) {\n const highlightPulse = createHighlightElement(\n activeElement,\n detail,\n highlightPulseElementID\n );\n\n shadowRoot.appendChild(highlightPulse);\n\n const w = highlightPulse.offsetWidth;\n const h = highlightPulse.offsetHeight;\n\n const colors = getHighlightColors(detail.type);\n\n highlightPulse.animate(\n [\n {\n width: `${w}px`,\n height: `${h}px`,\n transform: 'translate(0, 0)',\n backgroundColor: colors[1],\n },\n {\n width: `${w + 20}px`,\n height: `${h + 20}px`,\n transform: 'translate(-10px, -10px)',\n backgroundColor: colors[2],\n },\n {\n width: `${w + 40}px`,\n height: `${h + 40}px`,\n transform: 'translate(-20px, -20px)',\n backgroundColor: colors[3],\n },\n ],\n {\n duration: 500,\n iterations: 1,\n delay: 200,\n }\n ).onfinish = () => {\n highlightPulse.remove();\n };\n }\n}\n\nfunction showTooltip(detail) {\n const requiredKeys = ['module', 'type', 'id_key', 'id_value'];\n const hasAllKeys = requiredKeys.every((key) => detail.hasOwnProperty(key));\n\n if (!hasAllKeys) {\n return;\n }\n\n const props = {\n detail: {\n module: detail.module,\n type: detail.type,\n id_key: detail.id_key,\n id_value: detail.id_value,\n },\n };\n\n dispatchCustomEvent('lvdbg:show-tooltip', props);\n}\n\nexport default function initHighlight(debugChannel, shadowRoot) {\n document.addEventListener('lvdbg:inspect-highlight', (event) =>\n handleHighlight(event, shadowRoot)\n );\n document.addEventListener('lvdbg:inspect-pulse', (event) =>\n handlePulse(event, shadowRoot)\n );\n document.addEventListener('lvdbg:inspect-clear', () =>\n removeHighlightElement(shadowRoot)\n );\n\n debugChannel.on('highlight', (e) =>\n handleHighlight({ detail: e }, shadowRoot)\n );\n debugChannel.on('pulse', (e) => handlePulse({ detail: e }, shadowRoot));\n\n window.addEventListener('resize', () => handleHighlightResize(shadowRoot));\n}\n", "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n", "const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n", "import { v4 as uuidv4 } from 'uuid';\n\nexport default function pushWindowInitialized(debugChannel, socketID) {\n const windowID = maybeSetWindowID();\n\n debugChannel.push('window-initialized', {\n window_id: windowID,\n socket_id: socketID,\n });\n}\n\nfunction maybeSetWindowID() {\n const windowID = window.name;\n if (windowID) {\n return windowID;\n }\n\n const newWindowID = uuidv4();\n window.name = newWindowID;\n return newWindowID;\n}\n", "import pushWindowInitialized from './window_identifier';\n\nexport default function initDebugSocket(baseURL, socketID, rootSocketIDs) {\n const websocketURL = baseURL.replace(/^http/, 'ws') + '/client';\n\n const debugSocket = new window.Phoenix.Socket(websocketURL, {\n params: { socketID, rootSocketIDs },\n });\n\n debugSocket.connect();\n\n const debugChannel = debugSocket.channel(`client:${socketID}`);\n\n debugChannel\n .join()\n .receive('ok', () => {\n pushWindowInitialized(debugChannel, socketID);\n console.log('LiveDebugger debug connection established!');\n })\n .receive('error', (resp) => {\n console.error(\n 'LiveDebugger was unable to establish websocket debug connection! Browser features will not work:\\n',\n resp\n );\n });\n\n return { debugSocket, debugChannel };\n}\n", "import { dispatchCustomEvent } from '../utils/dom';\n\nexport default function initElementInspection({\n baseURL,\n debugChannel,\n socketID,\n debugButton,\n}) {\n let inspectMode = false;\n let lastID = null;\n let sourceLiveViews = [];\n\n debugChannel.on('found-node-element', (event) => {\n pushShowTooltipEvent({\n module: event.module,\n type: event.type,\n id_key: event.id_key,\n id_value: event.id_value,\n });\n });\n\n debugChannel.on('inspect-mode-changed', (event) => {\n if (event.inspect_mode) {\n enableInspectMode();\n sourceLiveViews.push(event.pid);\n } else {\n sourceLiveViews = sourceLiveViews.filter((pid) => pid !== event.pid);\n\n if (sourceLiveViews.length === 0) {\n disableInspectMode();\n }\n }\n });\n\n const handleMove = (event) => {\n const elementInfo = getClosestElementInfo(event.target);\n\n if (!elementInfo) {\n return;\n }\n\n const detail = getHighlightDetail(elementInfo);\n\n if (detail.val === lastID) {\n return;\n }\n\n const id =\n elementInfo.type == 'LiveComponent'\n ? elementInfo.element.dataset.phxComponent\n : elementInfo.element.id;\n\n debugChannel.push('request-node-element', {\n root_socket_id: socketID,\n socket_id: elementInfo.phxId,\n type: elementInfo.type,\n id,\n });\n\n lastID = detail.val;\n\n pushHighlightEvent({\n attr: detail.attr,\n val: detail.val,\n type: elementInfo.type,\n });\n };\n\n const handleInspect = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n const elementInfo = getClosestElementInfo(event.target);\n\n if (!elementInfo) {\n return;\n }\n\n const detail = getHighlightDetail(elementInfo);\n\n pushPulseEvent({\n attr: detail.attr,\n val: detail.val,\n type: elementInfo.type,\n });\n\n const url = getElementURL(baseURL, elementInfo);\n\n if (sourceLiveViews.length === 0) {\n window.open(url, '_blank');\n } else {\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('element-inspected', {\n pid: pid,\n url: url,\n });\n });\n }\n\n sourceLiveViews = [];\n disableInspectMode();\n };\n\n const handleRightClick = (event) => {\n event.preventDefault();\n\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('inspect-mode-changed', {\n inspect_mode: false,\n pid: pid,\n });\n });\n\n sourceLiveViews = [];\n disableInspectMode();\n };\n\n const handleEscape = (event) => {\n if (event.key === 'Escape') {\n sourceLiveViews.forEach((pid) => {\n debugChannel.push('inspect-mode-changed', {\n inspect_mode: false,\n pid: pid,\n });\n });\n\n sourceLiveViews = [];\n disableInspectMode();\n }\n };\n\n const handleMouseLeave = () => {\n pushClearEvent();\n lastID = null;\n };\n\n const disableInspectMode = () => {\n if (!inspectMode) {\n return;\n }\n\n inspectMode = false;\n lastID = null;\n\n if (debugButton) debugButton.classList.remove('live-debugger-inspect-mode');\n\n pushClearEvent();\n pushRemoveTooltipEvent();\n\n document.body.classList.remove('live-debugger-inspect-mode');\n document.body.removeEventListener('click', handleInspect);\n document.body.removeEventListener('mouseover', handleMove);\n document.removeEventListener('mouseleave', handleMouseLeave);\n document.removeEventListener('contextmenu', handleRightClick);\n document.removeEventListener('keydown', handleEscape);\n };\n\n const enableInspectMode = () => {\n if (inspectMode) {\n return;\n }\n\n inspectMode = true;\n\n if (debugButton) debugButton.classList.add('live-debugger-inspect-mode');\n\n document.body.classList.add('live-debugger-inspect-mode');\n document.body.addEventListener('click', handleInspect);\n document.body.addEventListener('mouseover', handleMove);\n document.body.addEventListener('mouseleave', handleMouseLeave);\n document.addEventListener('contextmenu', handleRightClick);\n document.addEventListener('keydown', handleEscape);\n };\n\n document.addEventListener('lvdbg:inspect-button-click', (event) => {\n setTimeout(enableInspectMode);\n });\n}\n\nfunction pushHighlightEvent(detail) {\n dispatchCustomEvent('lvdbg:inspect-highlight', {\n detail,\n });\n}\n\nfunction pushPulseEvent(detail) {\n dispatchCustomEvent('lvdbg:inspect-pulse', {\n detail,\n });\n}\n\nfunction pushClearEvent() {\n dispatchCustomEvent('lvdbg:inspect-clear');\n}\n\nfunction pushShowTooltipEvent(detail) {\n dispatchCustomEvent('lvdbg:show-tooltip', {\n detail,\n });\n}\n\nfunction pushRemoveTooltipEvent() {\n dispatchCustomEvent('lvdbg:remove-tooltip');\n}\n\nfunction getClosestElementInfo(target) {\n const liveViewElement = target.closest('[data-phx-session]');\n const componentElement = target.closest('[data-phx-component]');\n\n if (!liveViewElement) return null;\n\n const rootElementId = liveViewElement.getAttribute('data-phx-root-id');\n\n if (componentElement && liveViewElement.contains(componentElement)) {\n return {\n element: componentElement,\n type: 'LiveComponent',\n phxRootId: rootElementId,\n phxId: liveViewElement.id,\n };\n }\n\n return {\n element: liveViewElement,\n type: 'LiveView',\n phxRootId: rootElementId,\n phxId: liveViewElement.id,\n };\n}\n\nfunction getElementURL(baseURL, { element, type, phxRootId, phxId }) {\n const url = new URL(`${baseURL}/redirect/${phxId}`);\n\n if (phxRootId !== phxId) {\n url.searchParams.set('root_id', phxRootId);\n }\n\n if (type === 'LiveComponent') {\n url.searchParams.set('node_id', element.dataset.phxComponent);\n }\n url.searchParams.set('from', 'inspect_button');\n return url;\n}\n\nfunction getHighlightDetail({ type, element, phxId }) {\n if (type === 'LiveComponent') {\n return {\n attr: 'data-phx-id',\n val: `c${element.dataset.phxComponent}-${phxId}`,\n };\n }\n\n return {\n attr: 'id',\n val: element.id,\n };\n}\n", "import tooltipHtml from './tooltip.html';\nimport { createElement } from '../../utils/dom';\n\nfunction setTypeIcon(tooltip, data) {\n const componentIcon = tooltip.querySelector(\n '.live-debugger-tooltip-icon-component'\n );\n componentIcon.style.display =\n data.type === 'LiveComponent' ? 'block' : 'none';\n\n const viewIcon = tooltip.querySelector('.live-debugger-tooltip-icon-view');\n viewIcon.style.display = data.type === 'LiveView' ? 'block' : 'none';\n}\n\nfunction populateTypeInfo(tooltip, data) {\n const typeInfo = tooltip.querySelector('.type-info');\n const typeText = typeInfo.querySelector('.type-text');\n const typeSquare = typeInfo.querySelector('.live-debugger-type-square');\n\n typeText.textContent = data.type;\n typeSquare.style.backgroundColor =\n data.type === 'LiveComponent' ? '#87CCE8' : '#ffe780';\n}\n\nfunction populateIdInfo(tooltip, data) {\n const idInfo = tooltip.querySelector('.id-info');\n const label = idInfo.querySelector('.label');\n const value = idInfo.querySelector('.value');\n\n label.textContent = `${data.id_key}:`;\n value.textContent = data.id_value;\n}\n\nfunction populateInfoSection(tooltip, data) {\n populateTypeInfo(tooltip, data);\n populateIdInfo(tooltip, data);\n}\n\nfunction setModuleName(tooltip, data) {\n const moduleName = tooltip.querySelector('.live-debugger-tooltip-module');\n moduleName.textContent = data.module || 'Element';\n}\n\nexport function createTooltip(data, shadowRoot) {\n const tooltip = createElement(tooltipHtml);\n\n setModuleName(tooltip, data);\n setTypeIcon(tooltip, data);\n populateInfoSection(tooltip, data);\n\n shadowRoot.appendChild(tooltip);\n return tooltip;\n}\n", "function calculateInitialPosition(highlightRect, tooltipRect) {\n let top = highlightRect.top - tooltipRect.height - 10;\n let left = highlightRect.left;\n\n return { top, left };\n}\n\nfunction adjustVerticalPosition(\n top,\n highlightRect,\n tooltipRect,\n viewportHeight\n) {\n // Check if tooltip would overflow top\n if (top < 10) {\n // Position below the highlight element\n top = highlightRect.bottom + 10;\n }\n\n // Check if tooltip would overflow bottom\n if (top + tooltipRect.height > viewportHeight - 10) {\n // Try to position above instead\n top = highlightRect.top - tooltipRect.height - 10;\n if (top < 10) {\n // If still overflowing, position at the top of viewport\n top = 10;\n }\n }\n\n // Ensure tooltip doesn't go off-screen vertically\n if (top < 10) top = 10;\n if (top + tooltipRect.height > viewportHeight - 10) {\n top = viewportHeight - tooltipRect.height - 10;\n }\n\n return top;\n}\n\nfunction adjustHorizontalPosition(left, tooltipRect, viewportWidth) {\n // Check if tooltip would overflow right\n if (left + tooltipRect.width > viewportWidth - 10) {\n left = viewportWidth - tooltipRect.width - 10;\n }\n\n // Check if tooltip would overflow left\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off-screen horizontally\n if (left < 10) left = 10;\n if (left + tooltipRect.width > viewportWidth - 10) {\n left = viewportWidth - tooltipRect.width - 10;\n }\n\n return left;\n}\n\nfunction applyPosition(tooltip, top, left) {\n tooltip.style.top = `${top + window.scrollY}px`;\n tooltip.style.left = `${left + window.scrollX}px`;\n}\n\nexport function positionTooltip(tooltip, highlightElement) {\n if (!highlightElement || !tooltip) return;\n\n const highlightRect = highlightElement.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let { top, left } = calculateInitialPosition(highlightRect, tooltipRect);\n\n top = adjustVerticalPosition(top, highlightRect, tooltipRect, viewportHeight);\n left = adjustHorizontalPosition(left, tooltipRect, viewportWidth);\n\n applyPosition(tooltip, top, left);\n\n return { top, left, tooltipRect };\n}\n", "function removeExistingArrow(tooltip) {\n const existingArrow = tooltip.querySelector('.live-debugger-tooltip-arrow');\n if (existingArrow) {\n existingArrow.remove();\n }\n}\n\nfunction createArrowElement() {\n const arrow = document.createElement('div');\n arrow.className = 'live-debugger-tooltip-arrow';\n return arrow;\n}\n\nfunction determineArrowDirection(tooltipTop, tooltipRect, highlightRect) {\n const tooltipBottom = tooltipTop + tooltipRect.height;\n const highlightTop = highlightRect.top;\n\n return tooltipBottom < highlightTop ? 'down' : 'up';\n}\n\nexport function addTooltipArrow(\n tooltip,\n highlightRect,\n tooltipTop,\n tooltipRect\n) {\n removeExistingArrow(tooltip);\n\n const arrow = createArrowElement();\n const direction = determineArrowDirection(\n tooltipTop,\n tooltipRect,\n highlightRect\n );\n\n if (direction === 'down') {\n arrow.classList.add('live-debugger-tooltip-arrow-down');\n } else {\n arrow.classList.add('live-debugger-tooltip-arrow-up');\n }\n\n tooltip.appendChild(arrow);\n}\n", "import { createTooltip } from './tooltip_creator';\nimport { positionTooltip } from './tooltip_positioner';\nimport { addTooltipArrow } from './tooltip_arrow';\n\nconst tooltipID = 'live-debugger-tooltip';\nconst highlightElementID = 'live-debugger-highlight-element';\n\nfunction getHighlightElement(shadowRoot) {\n return shadowRoot.querySelector(`#${highlightElementID}`);\n}\n\nfunction removeTooltip(shadowRoot) {\n const existingTooltip = shadowRoot.querySelector(`#${tooltipID}`);\n if (existingTooltip) {\n existingTooltip.remove();\n }\n}\n\nfunction showTooltip(data, shadowRoot) {\n const highlightElement = getHighlightElement(shadowRoot);\n if (!highlightElement) {\n return;\n }\n\n removeTooltip(shadowRoot);\n const tooltip = createTooltip(data, shadowRoot);\n const positionData = positionTooltip(tooltip, highlightElement);\n\n if (positionData) {\n addTooltipArrow(\n tooltip,\n highlightElement.getBoundingClientRect(),\n positionData.top,\n positionData.tooltipRect\n );\n }\n}\n\nfunction handleTooltipResize(shadowRoot) {\n const tooltip = shadowRoot.querySelector(`#${tooltipID}`);\n const highlightElement = getHighlightElement(shadowRoot);\n\n if (tooltip && highlightElement) {\n const positionData = positionTooltip(tooltip, highlightElement);\n\n if (positionData) {\n addTooltipArrow(\n tooltip,\n highlightElement.getBoundingClientRect(),\n positionData.top,\n positionData.tooltipRect\n );\n }\n }\n}\n\nfunction handleShowTooltipEvent(event, shadowRoot) {\n showTooltip(event.detail, shadowRoot);\n}\n\nfunction handleRemoveTooltipEvent(shadowRoot) {\n removeTooltip(shadowRoot);\n}\n\nfunction setupEventListeners(shadowRoot) {\n window.addEventListener('resize', () => handleTooltipResize(shadowRoot));\n window.addEventListener('scroll', () => handleTooltipResize(shadowRoot));\n\n document.addEventListener('lvdbg:show-tooltip', (event) =>\n handleShowTooltipEvent(event, shadowRoot)\n );\n document.addEventListener('lvdbg:remove-tooltip', () =>\n handleRemoveTooltipEvent(shadowRoot)\n );\n}\n\nexport default function initTooltip(shadowRoot) {\n setupEventListeners(shadowRoot);\n}\n", "// This file is being run in the client's debugged application\n// It introduces browser features that are not mandatory for LiveDebugger to run\n\nimport initDebugMenu from './components/debug_menu';\nimport initHighlight from './services/highlight';\nimport initDebugSocket from './services/debug_socket';\nimport initElementInspection from './services/inspect';\nimport initTooltip from './components/tooltip/tooltip';\n\nimport {\n getMetaTag,\n fetchLiveDebuggerBaseURL,\n fetchDebuggedSocketIDs,\n} from './utils/meta';\n\nwindow.document.addEventListener('DOMContentLoaded', async () => {\n const metaTag = getMetaTag();\n const baseURL = fetchLiveDebuggerBaseURL(metaTag);\n let { mainSocketID, rootSocketIDs } = await fetchDebuggedSocketIDs();\n\n if (!mainSocketID) {\n [mainSocketID, ...rootSocketIDs] = rootSocketIDs;\n } else {\n rootSocketIDs = [];\n }\n\n if (mainSocketID) {\n const sessionURL = `${baseURL}/redirect/${mainSocketID}`;\n\n const { debugChannel } = initDebugSocket(\n baseURL,\n mainSocketID,\n rootSocketIDs\n );\n\n debugChannel.on('ping', (resp) => {\n console.log('Received ping', resp);\n debugChannel.push('pong', resp);\n });\n\n const shadowHost = document.createElement('div');\n shadowHost.style.position = 'absolute';\n shadowHost.style.width = '0px';\n shadowHost.style.height = '0px';\n shadowHost.style.left = '0px';\n shadowHost.style.top = '0px';\n shadowHost.style.zIndex = '2147483647';\n document.body.appendChild(shadowHost);\n\n const mode = metaTag.getAttribute('e2e') === 'true' ? 'open' : 'closed';\n const shadowRoot = shadowHost.attachShadow({ mode });\n\n const cssLink = document.createElement('link');\n cssLink.rel = 'stylesheet';\n cssLink.href = `${baseURL}/assets/live_debugger/client.css`;\n shadowRoot.appendChild(cssLink);\n\n const { debugButton } = initDebugMenu(\n metaTag,\n sessionURL,\n debugChannel,\n shadowRoot\n );\n initElementInspection({\n baseURL,\n debugChannel,\n socketID: mainSocketID,\n debugButton,\n });\n initTooltip(shadowRoot);\n initHighlight(debugChannel, shadowRoot);\n }\n\n console.info(`LiveDebugger available at: ${baseURL}`);\n});\n"], + "mappings": "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", + "names": ["createElement", "html", "tempDiv", "dispatchCustomEvent", "event", "payload", "customEvent", "initDebugButton", "debugButton", "createElement", "debug_button_default", "isDragging", "onClick", "placeButton", "dispatchCustomEvent", "dragButton", "onMouseMove", "event", "buttonWidth", "buttonHeight", "maxLeft", "maxTop", "newLeft", "newTop", "ensureButtonInViewport", "buttonRect", "initDebugOptions", "liveDebuggerURL", "debugChannel", "debugOptions", "createElement", "debug_options_default", "isVisible", "showDebugOptions", "debugButtonRect", "debugOptionsRect", "debugOptionsWidth", "debugOptionsHeight", "hideDebugOptions", "onDebugButtonClick", "event", "onNewTabButtonClick", "onInspectButtonClick", "dispatchCustomEvent", "onMoveButtonClick", "fetchDebuggedSocketIDs", "resolve", "liveViewElements", "rootIDsMapping", "mainID", "handleMutation", "mutation", "isRootIDAttributeChanged", "registerRootID", "isAllRootIDsRegistered", "observer", "getRootSocketIDs", "mutations", "el", "rootIDs", "target", "rootSocketIDs", "getMetaTag", "metaTag", "message", "fetchLiveDebuggerBaseURL", "isDebugButtonEnabled", "initDebugMenu", "metaTag", "liveDebuggerURL", "debugChannel", "shadowRoot", "debugButton", "initDebugButton", "debugMenu", "initDebugOptions", "suppressOutsideClick", "suppressNext", "mount", "unmount", "isDebugButtonEnabled", "enabled", "event", "path", "clickedInside", "node", "dispatchCustomEvent", "highlightElementID", "highlightPulseElementID", "liveViewColors", "liveComponentsColors", "streamItemColors", "isElementVisible", "element", "style", "getHighlightColors", "type", "createHighlightElement", "activeElement", "detail", "id", "rect", "highlight", "removeHighlightElement", "shadowRoot", "highlightElement", "dispatchCustomEvent", "handleHighlight", "toClear", "sameElement", "showTooltip", "handleHighlightResize", "handlePulse", "highlightPulse", "w", "h", "colors", "key", "props", "initHighlight", "debugChannel", "event", "e", "byteToHex", "i", "unsafeStringify", "arr", "offset", "getRandomValues", "rnds8", "rng", "randomUUID", "native_default", "v4", "options", "buf", "offset", "native_default", "rnds", "rng", "unsafeStringify", "v4_default", "pushWindowInitialized", "debugChannel", "socketID", "windowID", "maybeSetWindowID", "newWindowID", "v4_default", "initDebugSocket", "baseURL", "socketID", "rootSocketIDs", "websocketURL", "debugSocket", "debugChannel", "pushWindowInitialized", "resp", "initElementInspection", "baseURL", "debugChannel", "socketID", "debugButton", "inspectMode", "lastID", "sourceLiveViews", "event", "pushShowTooltipEvent", "enableInspectMode", "pid", "disableInspectMode", "handleMove", "elementInfo", "getClosestElementInfo", "detail", "getHighlightDetail", "id", "pushHighlightEvent", "handleInspect", "pushPulseEvent", "url", "getElementURL", "handleRightClick", "handleEscape", "handleMouseLeave", "pushClearEvent", "pushRemoveTooltipEvent", "dispatchCustomEvent", "target", "liveViewElement", "componentElement", "rootElementId", "element", "type", "phxRootId", "phxId", "setTypeIcon", "tooltip", "data", "componentIcon", "viewIcon", "populateTypeInfo", "typeInfo", "typeText", "typeSquare", "populateIdInfo", "idInfo", "label", "value", "populateInfoSection", "setModuleName", "moduleName", "createTooltip", "shadowRoot", "createElement", "tooltip_default", "calculateInitialPosition", "highlightRect", "tooltipRect", "top", "left", "adjustVerticalPosition", "viewportHeight", "adjustHorizontalPosition", "viewportWidth", "applyPosition", "tooltip", "positionTooltip", "highlightElement", "removeExistingArrow", "tooltip", "existingArrow", "createArrowElement", "arrow", "determineArrowDirection", "tooltipTop", "tooltipRect", "highlightRect", "tooltipBottom", "highlightTop", "addTooltipArrow", "tooltipID", "highlightElementID", "getHighlightElement", "shadowRoot", "removeTooltip", "existingTooltip", "showTooltip", "data", "highlightElement", "tooltip", "createTooltip", "positionData", "positionTooltip", "addTooltipArrow", "handleTooltipResize", "handleShowTooltipEvent", "event", "handleRemoveTooltipEvent", "setupEventListeners", "initTooltip", "metaTag", "getMetaTag", "baseURL", "fetchLiveDebuggerBaseURL", "mainSocketID", "rootSocketIDs", "fetchDebuggedSocketIDs", "sessionURL", "debugChannel", "initDebugSocket", "resp", "shadowHost", "mode", "shadowRoot", "cssLink", "debugButton", "initDebugMenu", "initElementInspection", "initTooltip", "initHighlight"] }