{"version":3,"file":"overlastic.min.js","sources":["../../javascript/overlastic/clickInterceptor.js","../../javascript/overlastic/streamAction.js"],"sourcesContent":["// Save the clicked element for use down the line.\naddEventListener(\"click\", event => {\n window._overlasticInitiator = event.target\n}, true)\n\n// Overlay anchors come with target _blank to serve as fallback in case JS is not enabled.\naddEventListener(\"click\", _event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n\n if (anchor) {\n anchor.removeAttribute(\"target\")\n }\n}, true)\n\n// Allow progressive enhancement by telling the server if a request is handled by Turbo.\naddEventListener(\"turbo:before-fetch-request\", event => {\n event.detail.fetchOptions.headers[\"Overlay-Enabled\"] = \"1\"\n})\n\n// When an overlay anchor is clicked,\n// send its type, target and args along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n const name = anchor?.dataset?.overlayName\n const type = anchor?.dataset?.overlayType\n const target = anchor?.dataset?.overlayTarget\n const args = anchor?.dataset?.overlayArgs\n\n if (anchor) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (target) {\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n})\n\n// When the redirect script triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const script = document.querySelector(\"script[overlay]\")\n\n if (script) {\n const overlay = document.querySelector(`overlastic[id=${script.getAttribute(\"overlay\")}]`)\n\n if (overlay) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n }\n})\n\n// When any other element triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const initiator = window._overlasticInitiator?.closest(\"a, form\")\n const overlay = initiator?.closest(\"overlastic\")\n\n if (overlay && !initiator.dataset.overlay && !initiator.dataset.overlayName) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const initiator = overlay.dataset?.overlayInitiator\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n\n if (initiator) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = initiator\n }\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n\n delete window._overlasticInitiator\n})\n","// Custom Stream action that allows for finer control of the overlay lifecycle.\n//\n// Lifecycle events:\n// - overlastic:disconnect right before removing an overlay from the DOM\n// - overlastic:connect right after attaching an overlay to the DOM\n//\n// Both events target the firstElementChild of the overlastic tag to allow for\n// a cleaner listening approach in libraries like Stimulus or Alpine.\n//\n// The disconnect event is dispatched once for every overlay that will be removed.\n// They can be paused and resumed. The new overlay won't be attached until all events\n// have been resumed.\nTurbo.StreamActions[\"replaceOverlay\"] = function() {\n let overlaysReadyToDisconnect = []\n let callsToResume = 0\n\n const oldOverlay = this.targetElements[0]\n const overlayName = oldOverlay.id\n const renderNewOverlay = () => {\n callsToResume++\n\n if (callsToResume >= overlaysReadyToDisconnect.filter(status => status === false).length) {\n Turbo.StreamActions[\"replace\"].bind(this)()\n\n const newOverlay = document.getElementById(overlayName)\n const connectTarget = newOverlay.firstElementChild || newOverlay\n const connectEvent = new Event(\"overlastic:connect\", { bubbles: true, cancelable: false })\n\n connectTarget.dispatchEvent(connectEvent)\n }\n }\n\n overlaysReadyToDisconnect = [oldOverlay, ...oldOverlay.querySelectorAll(\"overlastic\")].map(element => {\n const disconnectTarget = element.firstElementChild || element\n const disconnectEvent =\n new CustomEvent(\"overlastic:disconnect\", { bubbles: true, cancelable: true, detail: { resume: renderNewOverlay } })\n\n return disconnectTarget.dispatchEvent(disconnectEvent)\n })\n\n if (overlaysReadyToDisconnect.every(status => status === true)) {\n renderNewOverlay()\n }\n}\n"],"names":["addEventListener","event","window","_overlasticInitiator","target","_event","anchor","closest","removeAttribute","detail","fetchOptions","headers","name","dataset","overlayName","type","overlayType","overlayTarget","args","overlayArgs","script","document","querySelector","overlay","getAttribute","id","initiator","overlayInitiator","Turbo","StreamActions","overlaysReadyToDisconnect","callsToResume","oldOverlay","this","targetElements","renderNewOverlay","filter","status","length","bind","newOverlay","getElementById","connectTarget","firstElementChild","connectEvent","Event","bubbles","cancelable","dispatchEvent","querySelectorAll","map","element","disconnectTarget","disconnectEvent","CustomEvent","resume","every"],"mappings":"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"}