katalyst-kpop 3.2.2 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4af623f3903480fcc58650dcdf3d16d783af8d31085fe8b7247476068b8c6890
4
- data.tar.gz: ddaf0d48f02c5e6d90ea4dcd2fc0a59e342e358f8adb822ee4aaf2f134cedf1e
3
+ metadata.gz: 8b6cb8f5e2350fddaa33e54ad14df165de7f60127c4e23c7374284449bc32489
4
+ data.tar.gz: 8739ddffe7c7fab98c5df3a6496fc37c8de6c184531f635c5d613a53b9fecb97
5
5
  SHA512:
6
- metadata.gz: 762d57889cba4dfe08988704102dd99513a10ba6c387ccc5ca6bab354b93cc497e49fcc749b82dd29638d87e6470656e5b9d9c4e401f48557fc703b0b8527773
7
- data.tar.gz: '086bb09810e9fa07599092dde7f71b8db04fad073b422a196957f38fb07d3f32f11d9844a3ad7df906d2739d673a5a1017ab8776b2b6dbc6676d6214e1a26cbd'
6
+ metadata.gz: 74c2eb1d96f21af9755f7b6605b061e7b8ffe049f2d1f71b309bd66623c8f729e9deb7feaa50a8fcc4ebc4c6f0ba393c213ee90fd902f218d9652f7f99036a0f
7
+ data.tar.gz: dd567f20c4af53b1d258bf3ab059e9c753ccbf3b9e3fd258a0e328638469222580fd82bde3853fa01378b1d9ead1bcd9e817ddb74c8cb66b4f160cedb014db4c
@@ -1 +1 @@
1
- {"version":3,"file":"kpop.min.js","sources":["../../../javascript/kpop/modals/modal.js","../../../javascript/kpop/modals/content_modal.js","../../../javascript/kpop/modals/frame_modal.js","../../../javascript/kpop/controllers/frame_controller.js","../../../javascript/kpop/controllers/scrim_controller.js","../../../javascript/kpop/modals/stream_modal.js","../../../javascript/kpop/utils/stream_renderer.js","../../../javascript/kpop/turbo_actions.js","../../../javascript/kpop/application.js","../../../javascript/kpop/controllers/modal_controller.js"],"sourcesContent":["import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport DEBUG from \"../debug\";\n\nexport class Modal {\n constructor(id) {\n this.id = id;\n }\n\n async open() {\n this.debug(\"open\");\n }\n\n async dismiss() {\n this.debug(`dismiss`);\n }\n\n beforeVisit(frame, e) {\n this.debug(`before-visit`, e.detail.url);\n }\n\n popstate(frame, e) {\n this.debug(`popstate`, e.state);\n }\n\n async pop(event, callback) {\n this.debug(`pop`);\n\n const promise = new Promise((resolve) => {\n window.addEventListener(\n event,\n () => {\n resolve();\n },\n { once: true },\n );\n });\n\n callback();\n\n return promise;\n }\n\n get frameElement() {\n return document.getElementById(this.id);\n }\n\n get controller() {\n return this.frameElement?.kpop;\n }\n\n get modalElement() {\n return this.frameElement?.querySelector(\"[data-controller*='kpop--modal']\");\n }\n\n get currentLocationValue() {\n return this.modalElement?.dataset[\"kpop-ModalCurrentLocationValue\"] || \"/\";\n }\n\n get fallbackLocationValue() {\n return this.modalElement?.dataset[\"kpop-ModalFallbackLocationValue\"];\n }\n\n get isCurrentLocation() {\n return (\n window.history.state?.turbo && Turbo.session.location.href === this.src\n );\n }\n\n static debug(event, ...args) {\n if (DEBUG) console.debug(`${this.name}:${event}`, ...args);\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`${this.constructor.name}:${event}`, ...args);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class ContentModal extends Modal {\n static connect(frame, element) {\n frame.open(new ContentModal(element.id), { animate: false });\n }\n\n constructor(id, src = null) {\n super(id);\n\n if (src) this.src = src;\n }\n\n /**\n * When the modal is dismissed we can't rely on a back navigation to close the\n * modal as the user may have navigated to a different location. Instead we\n * remove the content from the dom and replace the current history state with\n * the fallback location, if set.\n *\n * If there is no fallback location, we may be showing a stream modal that was\n * injected and cached by turbo. In this case, we clear the frame element and\n * do not change history.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n const fallbackLocation = this.fallbackLocationValue;\n\n await super.dismiss();\n\n if (this.visitStarted) {\n this.debug(\"skipping dismiss, visit started\");\n return;\n }\n if (!this.isCurrentLocation) {\n this.debug(\"skipping dismiss, not current location\");\n return;\n }\n\n this.frameElement.innerHTML = \"\";\n\n if (fallbackLocation) {\n window.history.replaceState(window.history.state, \"\", fallbackLocation);\n }\n }\n\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n this.visitStarted = true;\n\n frame.scrimOutlet.hide({ animate: false });\n }\n\n get src() {\n return new URL(\n this.currentLocationValue.toString(),\n document.baseURI,\n ).toString();\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class FrameModal extends Modal {\n /**\n * When the FrameController detects a frame element on connect, it runs this\n * method to sanity check the frame src and restore the modal state.\n *\n * @param frame FrameController\n * @param element TurboFrame element\n */\n static connect(frame, element) {\n const modal = new FrameModal(element.id, element.src);\n\n // state reconciliation for turbo restore of invalid frames\n if (modal.isCurrentLocation) {\n // restoration visit\n this.debug(\"restore\", element.src);\n return frame.open(modal, { animate: false });\n } else {\n console.warn(\n \"kpop: restored frame src doesn't match window href\",\n modal.src,\n window.location.href,\n );\n return frame.clear();\n }\n }\n\n /**\n * When a user clicks a kpop link, turbo intercepts the click and calls\n * #navigateFrame on the turbo frame controller before setting the TurboFrame\n * element's src attribute. KPOP intercepts this call and calls this method\n * first so we cancel problematic navigations that might cache invalid states.\n *\n * @param location URL requested by turbo\n * @param frame FrameController\n * @param element TurboFrame element\n * @param resolve continuation chain\n */\n static visit(location, frame, element, resolve) {\n // Ensure that turbo doesn't cache the frame in a loading state by cancelling\n // the current request (if any) by clearing the src.\n // Known issue: this won't work if the frame was previously rendering a useful src.\n if (element.hasAttribute(\"busy\")) {\n this.debug(\"clearing src to cancel turbo request\");\n element.src = \"\";\n }\n\n if (element.src === location) {\n this.debug(\"skipping navigate as already on location\");\n return;\n }\n\n if (element.src && element.src !== window.location.href) {\n console.warn(\n \"kpop: frame src doesn't match window\",\n element.src,\n window.location.href,\n location,\n );\n frame.clear();\n }\n\n this.debug(\"navigate to\", location);\n resolve();\n }\n\n constructor(id, src) {\n super(id);\n this.src = src;\n }\n\n /**\n * FrameModals are closed by running pop state and awaiting the turbo:load\n * event that follows on history restoration.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n await super.dismiss();\n\n if (!this.isCurrentLocation) {\n this.debug(\"skipping dismiss, not current location\");\n } else {\n await this.pop(\"turbo:load\", () => window.history.back());\n }\n\n // no specific close action required, this is turbo's responsibility\n }\n\n /**\n * When user navigates from inside a Frame modal, dismiss the modal first so\n * that the modal does not appear in the history stack.\n *\n * @param frame FrameController\n * @param e Turbo navigation event\n */\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n e.preventDefault();\n\n frame.dismiss({ animate: false }).then(() => {\n Turbo.visit(e.detail.url);\n\n this.debug(\"before-visit-end\");\n });\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\nimport { ContentModal } from \"../modals/content_modal\";\nimport { FrameModal } from \"../modals/frame_modal\";\n\nexport default class Kpop__FrameController extends Controller {\n static outlets = [\"scrim\"];\n static targets = [\"modal\"];\n static values = {\n open: Boolean,\n };\n\n connect() {\n this.debug(\"connect\", this.element.src);\n\n this.element.kpop = this;\n\n // allow our code to intercept frame navigation requests before dom changes\n installNavigationInterception(this);\n\n if (this.element.src && this.element.complete) {\n this.debug(\"new frame modal\", this.element.src);\n FrameModal.connect(this, this.element);\n } else if (this.modalElements.length > 0) {\n this.debug(\"new content modal\", window.location.pathname);\n ContentModal.connect(this, this.element);\n } else {\n this.debug(\"no modal\");\n this.clear();\n }\n }\n\n disconnect() {\n this.debug(\"disconnect\", this.element.src);\n\n delete this.element.kpop;\n delete this.modal;\n }\n\n scrimOutletConnected(scrim) {\n this.debug(\"scrim-connected\");\n\n this.scrimConnected = true;\n\n if (this.openValue) {\n scrim.show({ animate: false });\n } else {\n scrim.hide({ animate: false });\n }\n }\n\n openValueChanged(open) {\n this.debug(\"open-changed\", open);\n\n this.element.parentElement.style.display = open ? \"flex\" : \"none\";\n }\n\n async open(modal, { animate = true } = {}) {\n if (this.isOpen) {\n this.debug(\"skip open as already open\");\n this.modal ||= modal;\n return false;\n }\n\n await this.dismissing;\n\n return (this.opening ||= this.#nextFrame(() =>\n this.#open(modal, { animate }),\n ));\n }\n\n async dismiss({ animate = true, reason = \"\" } = {}) {\n if (!this.isOpen) {\n this.debug(\"skip dismiss as already closed\");\n return false;\n }\n\n await this.opening;\n\n return (this.dismissing ||= this.#nextFrame(() =>\n this.#dismiss({ animate, reason }),\n ));\n }\n\n async clear() {\n // clear the src from the frame (if any)\n this.element.src = \"\";\n\n // remove any open modal(s)\n this.modalElements.forEach((element) => element.remove());\n\n // mark the modal as hidden (will hide scrim on connect)\n this.openValue = false;\n\n // close the scrim, if connected\n if (this.scrimConnected) {\n return this.scrimOutlet.hide({ animate: false });\n }\n\n // unset modal\n this.modal = null;\n }\n\n // EVENTS\n\n popstate(event) {\n this.modal?.popstate(this, event);\n }\n\n /**\n * Incoming frame render, dismiss the current modal (if any) first.\n *\n * We're starting the actual visit\n *\n * @param event turbo:before-render\n */\n beforeFrameRender(event) {\n this.debug(\"before-frame-render\", event.detail.newFrame.baseURI);\n\n event.preventDefault();\n\n this.dismiss({ animate: true, reason: \"before-frame-render\" }).then(() => {\n this.debug(\"resume-frame-render\", event.detail.newFrame.baseURI);\n event.detail.resume();\n });\n }\n\n beforeStreamRender(event) {\n this.debug(\"before-stream-render\", event.detail);\n\n const resume = event.detail.render;\n\n // Defer rendering until dismiss is complete.\n // Dismiss may change history so we need to wait for it to complete to avoid\n // losing DOM changes on restoration visits.\n event.detail.render = async (stream) => {\n await this.dismissing;\n\n this.debug(\"stream-render\", stream);\n\n await resume(stream);\n };\n }\n\n beforeVisit(e) {\n this.debug(\"before-visit\", e.detail.url);\n\n // ignore visits to the current frame, these fire when the frame navigates\n if (e.detail.url === this.element.src) return;\n\n // ignore unless we're open\n if (!this.isOpen) return;\n\n this.modal.beforeVisit(this, e);\n }\n\n frameLoad(event) {\n this.debug(\"frame-load\");\n\n const modal = new FrameModal(this.element.id, this.element.src);\n\n window.addEventListener(\n \"turbo:visit\",\n (e) => {\n this.open(modal, { animate: true });\n },\n { once: true },\n );\n }\n\n get isOpen() {\n return this.openValue && !this.dismissing;\n }\n\n get modalElements() {\n return this.element.querySelectorAll(\"[data-controller*='kpop--modal']\");\n }\n\n async #open(modal, { animate = true } = {}) {\n this.debug(\"open-start\", { animate });\n\n const scrim = this.scrimConnected && this.scrimOutlet;\n\n this.modal = modal;\n this.openValue = true;\n\n await modal.open({ animate });\n await scrim?.show({ animate });\n\n delete this.opening;\n\n this.debug(\"open-end\");\n\n // Detect https://github.com/hotwired/turbo-rails/issues/580\n if (Turbo.session.view.forceReloaded) {\n console.error(\"Turbo-Frame response is incompatible with current page\");\n }\n }\n\n async #dismiss({ animate = true, reason = \"\" } = {}) {\n this.debug(\"dismiss-start\", { animate, reason });\n\n // if this element is detached then we've experienced a turbo navigation\n if (!this.element.isConnected) {\n this.debug(\"skip dismiss, element detached\");\n return;\n }\n\n if (!this.modal) {\n console.warn(\"modal missing on dismiss\");\n if (DEBUG) debugger;\n }\n\n await this.scrimOutlet.hide({ animate });\n await this.modal?.dismiss();\n\n this.openValue = false;\n this.modal = null;\n delete this.dismissing;\n\n this.debug(\"dismiss-end\");\n }\n\n async #nextFrame(callback) {\n return new Promise(window.requestAnimationFrame).then(callback);\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`FrameController:${event}`, ...args);\n }\n}\n\n/**\n * Monkey patch for Turbo#FrameController.\n *\n * Intercept calls to linkClickIntercepted(element, location) and ensures\n * that src is cleared if the frame is busy so that we don't restore an\n * in-progress src on restoration visits.\n *\n * See Turbo issue: https://github.com/hotwired/turbo/issues/1055\n *\n * @param controller FrameController\n */\nfunction installNavigationInterception(controller) {\n const TurboFrameController =\n controller.element.delegate.constructor.prototype;\n\n if (TurboFrameController._linkClickIntercepted) return;\n\n TurboFrameController._linkClickIntercepted =\n TurboFrameController.linkClickIntercepted;\n TurboFrameController.linkClickIntercepted = function (element, location) {\n // #findFrameElement\n const id =\n element?.getAttribute(\"data-turbo-frame\") ||\n this.element.getAttribute(\"target\");\n let frame = document.getElementById(id);\n if (!(frame instanceof Turbo.FrameElement)) {\n frame = this.element;\n }\n\n if (frame.kpop) {\n frame.kpop.debug(\"navigate-frame %s => %s\", frame.src, location);\n FrameModal.visit(location, frame.kpop, frame, () => {\n TurboFrameController._linkClickIntercepted.call(\n this,\n element,\n location,\n );\n });\n } else {\n TurboFrameController._linkClickIntercepted.call(this, element, location);\n }\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\n\n/**\n * Scrim controller wraps an element that creates a whole page layer.\n * It is intended to be used behind a modal or nav drawer.\n *\n * If the Scrim element receives a click event, it automatically triggers \"scrim:hide\".\n *\n * You can show and hide the scrim programmatically by calling show/hide on the controller, e.g. using an outlet.\n *\n * If you need to respond to the scrim showing or hiding you should subscribe to \"scrim:show\" and \"scrim:hide\".\n */\nexport default class ScrimController extends Controller {\n static values = {\n open: Boolean,\n captive: Boolean,\n zIndex: Number,\n };\n\n connect() {\n if (DEBUG) console.debug(\"scrim:connect\");\n\n this.defaultZIndexValue = this.zIndexValue;\n this.defaultCaptiveValue = this.captiveValue;\n\n this.element.scrim = this;\n }\n\n disconnect() {\n if (DEBUG) console.debug(\"scrim:disconnect\");\n\n delete this.element.scrim;\n }\n\n async show({\n captive = this.defaultCaptiveValue,\n zIndex = this.defaultZIndexValue,\n top = window.scrollY,\n animate = true,\n } = {}) {\n if (DEBUG) console.debug(\"scrim:before-show\");\n\n // hide the scrim before opening the new one if it's already open\n if (this.openValue) {\n await this.hide({ animate });\n }\n\n // update internal state\n this.openValue = true;\n\n // notify listeners of pending request\n this.dispatch(\"show\", { bubbles: true });\n\n if (DEBUG) console.debug(\"scrim:show-start\");\n\n // update state, perform style updates\n this.#show(captive, zIndex, top);\n\n if (animate) {\n // animate opening\n // this will trigger an animationEnd event via CSS that completes the open\n this.element.dataset.showAnimating = \"\";\n\n await new Promise((resolve) => {\n this.element.addEventListener(\"animationend\", () => resolve(), {\n once: true,\n });\n });\n\n delete this.element.dataset.showAnimating;\n }\n\n if (DEBUG) console.debug(\"scrim:show-end\");\n }\n\n async hide({ animate = true } = {}) {\n if (!this.openValue || this.element.dataset.hideAnimating) return;\n\n if (DEBUG) console.debug(\"scrim:before-hide\");\n\n // notify listeners of pending request\n this.dispatch(\"hide\", { bubbles: true });\n\n if (DEBUG) console.debug(\"scrim:hide-start\");\n\n if (animate) {\n // set animation state\n // this will trigger an animationEnd event via CSS that completes the hide\n this.element.dataset.hideAnimating = \"\";\n\n await new Promise((resolve) => {\n this.element.addEventListener(\"animationend\", () => resolve(), {\n once: true,\n });\n });\n\n delete this.element.dataset.hideAnimating;\n }\n\n this.#hide();\n\n this.openValue = false;\n\n if (DEBUG) console.debug(\"scrim:hide-end\");\n }\n\n dismiss(event) {\n if (DEBUG) console.debug(\"scrim:dismiss\");\n\n if (!this.captiveValue) this.dispatch(\"dismiss\", { bubbles: true });\n }\n\n escape(event) {\n if (\n event.key === \"Escape\" &&\n !this.captiveValue &&\n !event.defaultPrevented\n ) {\n this.dispatch(\"dismiss\", { bubbles: true });\n }\n }\n\n /**\n * Clips body to viewport size and sets the z-index\n */\n #show(captive, zIndex, top) {\n this.captiveValue = captive;\n this.zIndexValue = zIndex;\n this.scrollY = top;\n\n this.previousPosition = document.body.style.position;\n this.previousTop = document.body.style.top;\n\n this.element.style.zIndex = this.zIndexValue;\n document.body.style.top = `-${top}px`;\n document.body.style.position = \"fixed\";\n }\n\n /**\n * Unclips body from viewport size and unsets the z-index\n */\n #hide() {\n this.captiveValue = this.defaultCaptiveValue;\n this.zIndexValue = this.defaultZIndexValue;\n\n resetStyle(this.element, \"z-index\", null);\n resetStyle(document.body, \"position\", null);\n resetStyle(document.body, \"top\", null);\n\n window.scrollTo({ left: 0, top: this.scrollY, behavior: \"instant\" });\n\n delete this.scrollY;\n delete this.previousPosition;\n delete this.previousTop;\n }\n}\n\nfunction resetStyle(element, property, previousValue) {\n if (previousValue) {\n element.style.setProperty(property, previousValue);\n } else {\n element.style.removeProperty(property);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class StreamModal extends Modal {\n constructor(id, action) {\n super(id);\n\n this.action = action;\n }\n\n /**\n * When the modal opens, push a state event for the current location so that\n * the user can dismiss the modal by navigating back.\n *\n * @returns {Promise<void>}\n */\n async open() {\n await super.open();\n\n window.history.pushState({ kpop: true, id: this.id }, \"\", window.location);\n }\n\n /**\n * On dismiss, pop the state event that was pushed when the modal opened,\n * then clear any modals from the turbo frame element.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n await super.dismiss();\n\n if (this.isCurrentLocation) {\n await this.pop(\"popstate\", () => window.history.back());\n }\n\n this.frameElement.innerHTML = \"\";\n }\n\n /**\n * On navigation from inside the modal, dismiss the modal first so that the\n * modal does not appear in the history stack.\n *\n * @param frame TurboFrame element\n * @param e Turbo navigation event\n */\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n e.preventDefault();\n\n frame.dismiss({ animate: false }).then(() => {\n Turbo.visit(e.detail.url);\n\n this.debug(\"before-visit-end\");\n });\n }\n\n /**\n * If the user pops state, dismiss the modal.\n *\n * @param frame FrameController\n * @param e history event\n */\n popstate(frame, e) {\n super.popstate(frame, e);\n\n frame.dismiss({ animate: true, reason: \"popstate\" });\n }\n\n get isCurrentLocation() {\n return window.history.state?.kpop && window.history.state?.id === this.id;\n }\n}\n","import DEBUG from \"../debug\";\n\nexport class StreamRenderer {\n constructor(frame, action) {\n this.frame = frame;\n this.action = action;\n }\n\n render() {\n if (DEBUG) console.debug(\"stream-renderer:render\");\n this.frame.src = \"\";\n this.frame.innerHTML = \"\";\n this.frame.append(this.action.templateContent);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport DEBUG from \"./debug\";\n\nimport { StreamModal } from \"./modals/stream_modal\";\nimport { StreamRenderer } from \"./utils/stream_renderer\";\n\nfunction kpop(action) {\n return action.targetElements[0]?.kpop;\n}\n\nTurbo.StreamActions.kpop_open = function () {\n const animate = !kpop(this).openValue;\n\n kpop(this)\n ?.dismiss({ animate, reason: \"before-turbo-stream\" })\n .then(() => {\n new StreamRenderer(this.targetElements[0], this).render();\n kpop(this)?.open(new StreamModal(this.target, this), { animate });\n });\n};\n\nTurbo.StreamActions.kpop_dismiss = function () {\n kpop(this)?.dismiss({ reason: \"turbo_stream.kpop.dismiss\" });\n};\n\nTurbo.StreamActions.kpop_redirect_to = function () {\n if (this.dataset.turboFrame === this.target) {\n if (DEBUG)\n console.debug(\n `kpop: redirecting ${this.target} to ${this.getAttribute(\"href\")}`,\n );\n const a = document.createElement(\"A\");\n a.setAttribute(\"data-turbo-action\", \"replace\");\n this.targetElements[0].delegate.linkClickIntercepted(\n a,\n this.getAttribute(\"href\"),\n );\n } else {\n if (DEBUG)\n console.debug(`kpop: redirecting to ${this.getAttribute(\"href\")}`);\n Turbo.visit(this.getAttribute(\"href\"), {\n action: this.dataset.turboAction,\n });\n }\n};\n","import FrameController from \"../kpop/controllers/frame_controller\";\nimport ModalController from \"../kpop/controllers/modal_controller\";\nimport ScrimController from \"../kpop/controllers/scrim_controller\";\n\nimport \"./turbo_actions\";\n\nconst Definitions = [\n { identifier: \"kpop--frame\", controllerConstructor: FrameController },\n { identifier: \"kpop--modal\", controllerConstructor: ModalController },\n { identifier: \"scrim\", controllerConstructor: ScrimController },\n];\n\nexport { Definitions as default };\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\n\nexport default class Kpop__ModalController extends Controller {\n static values = {\n fallback_location: String,\n layout: String,\n };\n\n connect() {\n this.debug(\"connect\");\n\n if (this.layoutValue) {\n document.querySelector(\"#kpop\").classList.toggle(this.layoutValue, true);\n }\n }\n\n disconnect() {\n this.debug(\"disconnect\");\n\n if (this.layoutValue) {\n document.querySelector(\"#kpop\").classList.toggle(this.layoutValue, false);\n }\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`ModalController:${event}`, ...args);\n }\n}\n"],"names":["Modal","constructor","id","this","open","debug","dismiss","beforeVisit","frame","e","detail","url","popstate","state","pop","event","callback","promise","Promise","resolve","window","addEventListener","once","frameElement","document","getElementById","controller","kpop","modalElement","querySelector","currentLocationValue","dataset","fallbackLocationValue","isCurrentLocation","history","turbo","Turbo","session","location","href","src","args","ContentModal","connect","element","animate","super","fallbackLocation","visitStarted","innerHTML","replaceState","scrimOutlet","hide","URL","toString","baseURI","FrameModal","modal","console","warn","clear","visit","hasAttribute","back","preventDefault","then","Kpop__FrameController","Controller","static","Boolean","TurboFrameController","delegate","prototype","_linkClickIntercepted","linkClickIntercepted","getAttribute","FrameElement","call","installNavigationInterception","complete","modalElements","length","pathname","disconnect","scrimOutletConnected","scrim","scrimConnected","openValue","show","openValueChanged","parentElement","style","display","isOpen","dismissing","opening","nextFrame","reason","forEach","remove","beforeFrameRender","newFrame","resume","beforeStreamRender","render","async","stream","frameLoad","querySelectorAll","view","forceReloaded","error","isConnected","requestAnimationFrame","ScrimController","captive","zIndex","Number","defaultZIndexValue","zIndexValue","defaultCaptiveValue","captiveValue","top","scrollY","dispatch","bubbles","showAnimating","hideAnimating","escape","key","defaultPrevented","previousPosition","body","position","previousTop","resetStyle","scrollTo","left","behavior","property","previousValue","removeProperty","StreamModal","action","pushState","StreamRenderer","append","templateContent","targetElements","StreamActions","kpop_open","target","kpop_dismiss","kpop_redirect_to","turboFrame","a","createElement","setAttribute","turboAction","Definitions","identifier","controllerConstructor","FrameController","fallback_location","String","layout","layoutValue","classList","toggle"],"mappings":"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"}
1
+ {"version":3,"file":"kpop.min.js","sources":["../../../javascript/kpop/modals/modal.js","../../../javascript/kpop/modals/content_modal.js","../../../javascript/kpop/modals/frame_modal.js","../../../javascript/kpop/controllers/frame_controller.js","../../../javascript/kpop/controllers/scrim_controller.js","../../../javascript/kpop/modals/stream_modal.js","../../../javascript/kpop/utils/stream_renderer.js","../../../javascript/kpop/turbo_actions.js","../../../javascript/kpop/application.js","../../../javascript/kpop/controllers/modal_controller.js"],"sourcesContent":["import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport DEBUG from \"../debug\";\n\nexport class Modal {\n constructor(id) {\n this.id = id;\n }\n\n async open() {\n this.debug(\"open\");\n }\n\n async dismiss() {\n this.debug(`dismiss`);\n }\n\n beforeVisit(frame, e) {\n this.debug(`before-visit`, e.detail.url);\n }\n\n popstate(frame, e) {\n this.debug(`popstate`, e.state);\n }\n\n async pop(event, callback) {\n this.debug(`pop`);\n\n const promise = new Promise((resolve) => {\n window.addEventListener(\n event,\n () => {\n resolve();\n },\n { once: true },\n );\n });\n\n callback();\n\n return promise;\n }\n\n get frameElement() {\n return document.getElementById(this.id);\n }\n\n get controller() {\n return this.frameElement?.kpop;\n }\n\n get modalElement() {\n return this.frameElement?.querySelector(\"[data-controller*='kpop--modal']\");\n }\n\n get currentLocationValue() {\n return this.modalElement?.dataset[\"kpop-ModalCurrentLocationValue\"] || \"/\";\n }\n\n get fallbackLocationValue() {\n return this.modalElement?.dataset[\"kpop-ModalFallbackLocationValue\"];\n }\n\n get isCurrentLocation() {\n return (\n window.history.state?.turbo && Turbo.session.location.href === this.src\n );\n }\n\n static debug(event, ...args) {\n if (DEBUG) console.debug(`${this.name}:${event}`, ...args);\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`${this.constructor.name}:${event}`, ...args);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class ContentModal extends Modal {\n static connect(frame, element) {\n frame.open(new ContentModal(element.id), { animate: false });\n }\n\n constructor(id, src = null) {\n super(id);\n\n if (src) this.src = src;\n }\n\n /**\n * When the modal is dismissed we can't rely on a back navigation to close the\n * modal as the user may have navigated to a different location. Instead we\n * remove the content from the dom and replace the current history state with\n * the fallback location, if set.\n *\n * If there is no fallback location, we may be showing a stream modal that was\n * injected and cached by turbo. In this case, we clear the frame element and\n * do not change history.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n const fallbackLocation = this.fallbackLocationValue;\n\n await super.dismiss();\n\n if (this.visitStarted) {\n this.debug(\"skipping dismiss, visit started\");\n return;\n }\n if (!this.isCurrentLocation) {\n this.debug(\"skipping dismiss, not current location\");\n return;\n }\n\n this.frameElement.innerHTML = \"\";\n\n if (fallbackLocation) {\n window.history.replaceState(window.history.state, \"\", fallbackLocation);\n }\n }\n\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n this.visitStarted = true;\n\n frame.scrimOutlet.hide({ animate: false });\n }\n\n get src() {\n return new URL(\n this.currentLocationValue.toString(),\n document.baseURI,\n ).toString();\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class FrameModal extends Modal {\n /**\n * When the FrameController detects a frame element on connect, it runs this\n * method to sanity check the frame src and restore the modal state.\n *\n * @param frame FrameController\n * @param element TurboFrame element\n */\n static connect(frame, element) {\n const modal = new FrameModal(element.id, element.src);\n\n // state reconciliation for turbo restore of invalid frames\n if (modal.isCurrentLocation) {\n // restoration visit\n this.debug(\"restore\", element.src);\n return frame.open(modal, { animate: false });\n } else {\n console.warn(\n \"kpop: restored frame src doesn't match window href\",\n modal.src,\n window.location.href,\n );\n return frame.clear();\n }\n }\n\n /**\n * When a user clicks a kpop link, turbo intercepts the click and calls\n * #navigateFrame on the turbo frame controller before setting the TurboFrame\n * element's src attribute. KPOP intercepts this call and calls this method\n * first so we cancel problematic navigations that might cache invalid states.\n *\n * @param location URL requested by turbo\n * @param frame FrameController\n * @param element TurboFrame element\n * @param resolve continuation chain\n */\n static visit(location, frame, element, resolve) {\n // Ensure that turbo doesn't cache the frame in a loading state by cancelling\n // the current request (if any) by clearing the src.\n // Known issue: this won't work if the frame was previously rendering a useful src.\n if (element.hasAttribute(\"busy\")) {\n this.debug(\"clearing src to cancel turbo request\");\n element.src = \"\";\n }\n\n if (element.src === location) {\n this.debug(\"skipping navigate as already on location\");\n return;\n }\n\n if (element.src && element.src !== window.location.href) {\n console.warn(\n \"kpop: frame src doesn't match window\",\n element.src,\n window.location.href,\n location,\n );\n frame.clear();\n }\n\n this.debug(\"navigate to\", location);\n resolve();\n }\n\n constructor(id, src) {\n super(id);\n this.src = src;\n }\n\n /**\n * FrameModals are closed by running pop state and awaiting the turbo:load\n * event that follows on history restoration.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n await super.dismiss();\n\n if (!this.isCurrentLocation) {\n this.debug(\"skipping dismiss, not current location\");\n } else {\n await this.pop(\"turbo:load\", () => window.history.back());\n }\n\n // no specific close action required, this is turbo's responsibility\n }\n\n /**\n * When user navigates from inside a Frame modal, dismiss the modal first so\n * that the modal does not appear in the history stack.\n *\n * @param frame FrameController\n * @param e Turbo navigation event\n */\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n e.preventDefault();\n\n frame.dismiss({ animate: false }).then(() => {\n Turbo.visit(e.detail.url);\n\n this.debug(\"before-visit-end\");\n });\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\nimport { ContentModal } from \"../modals/content_modal\";\nimport { FrameModal } from \"../modals/frame_modal\";\n\nexport default class Kpop__FrameController extends Controller {\n static outlets = [\"scrim\"];\n static targets = [\"modal\"];\n static values = {\n open: Boolean,\n };\n\n connect() {\n this.debug(\"connect\", this.element.src);\n\n this.element.kpop = this;\n\n // allow our code to intercept frame navigation requests before dom changes\n installNavigationInterception(this);\n\n if (this.element.src && this.element.complete) {\n this.debug(\"new frame modal\", this.element.src);\n FrameModal.connect(this, this.element);\n } else if (this.modalElements.length > 0) {\n this.debug(\"new content modal\", window.location.pathname);\n ContentModal.connect(this, this.element);\n } else {\n this.debug(\"no modal\");\n this.clear();\n }\n }\n\n disconnect() {\n this.debug(\"disconnect\", this.element.src);\n\n delete this.element.kpop;\n delete this.modal;\n }\n\n scrimOutletConnected(scrim) {\n this.debug(\"scrim-connected\");\n\n this.scrimConnected = true;\n\n if (this.openValue) {\n scrim.show({ animate: false });\n } else {\n scrim.hide({ animate: false });\n }\n }\n\n openValueChanged(open) {\n this.debug(\"open-changed\", open);\n\n this.element.parentElement.style.display = open ? \"flex\" : \"none\";\n }\n\n async open(modal, { animate = true } = {}) {\n if (this.isOpen) {\n this.debug(\"skip open as already open\");\n this.modal ||= modal;\n return false;\n }\n\n await this.dismissing;\n\n return (this.opening ||= this.#nextFrame(() =>\n this.#open(modal, { animate }),\n ));\n }\n\n async dismiss({ animate = true, reason = \"\" } = {}) {\n if (!this.isOpen) {\n this.debug(\"skip dismiss as already closed\");\n return false;\n }\n\n await this.opening;\n\n return (this.dismissing ||= this.#nextFrame(() =>\n this.#dismiss({ animate, reason }),\n ));\n }\n\n async clear() {\n // clear the src from the frame (if any)\n this.element.src = \"\";\n\n // remove any open modal(s)\n this.modalElements.forEach((element) => element.remove());\n\n // mark the modal as hidden (will hide scrim on connect)\n this.openValue = false;\n\n // close the scrim, if connected\n if (this.scrimConnected) {\n return this.scrimOutlet.hide({ animate: false });\n }\n\n // unset modal\n this.modal = null;\n }\n\n // EVENTS\n\n popstate(event) {\n this.modal?.popstate(this, event);\n }\n\n /**\n * Incoming frame render, dismiss the current modal (if any) first.\n *\n * We're starting the actual visit\n *\n * @param event turbo:before-render\n */\n beforeFrameRender(event) {\n this.debug(\"before-frame-render\", event.detail.newFrame.baseURI);\n\n event.preventDefault();\n\n this.dismiss({ animate: true, reason: \"before-frame-render\" }).then(() => {\n this.debug(\"resume-frame-render\", event.detail.newFrame.baseURI);\n event.detail.resume();\n });\n }\n\n beforeStreamRender(event) {\n this.debug(\"before-stream-render\", event.detail);\n\n const resume = event.detail.render;\n\n // Defer rendering until dismiss is complete.\n // Dismiss may change history so we need to wait for it to complete to avoid\n // losing DOM changes on restoration visits.\n event.detail.render = async (stream) => {\n await this.dismissing;\n\n this.debug(\"stream-render\", stream);\n\n await resume(stream);\n };\n }\n\n beforeVisit(e) {\n this.debug(\"before-visit\", e.detail.url);\n\n // ignore visits to the current frame, these fire when the frame navigates\n if (e.detail.url === this.element.src) return;\n\n // ignore unless we're open\n if (!this.isOpen) return;\n\n this.modal.beforeVisit(this, e);\n }\n\n frameLoad(event) {\n this.debug(\"frame-load\");\n\n const modal = new FrameModal(this.element.id, this.element.src);\n\n window.addEventListener(\n \"turbo:visit\",\n (e) => {\n this.open(modal, { animate: true });\n },\n { once: true },\n );\n }\n\n get isOpen() {\n return this.openValue && !this.dismissing;\n }\n\n get modalElements() {\n return this.element.querySelectorAll(\"[data-controller*='kpop--modal']\");\n }\n\n async #open(modal, { animate = true } = {}) {\n this.debug(\"open-start\", { animate });\n\n const scrim = this.scrimConnected && this.scrimOutlet;\n\n this.modal = modal;\n this.openValue = true;\n\n await modal.open({ animate });\n await scrim?.show({ animate });\n\n delete this.opening;\n\n this.debug(\"open-end\");\n\n // Detect https://github.com/hotwired/turbo-rails/issues/580\n if (Turbo.session.view.forceReloaded) {\n console.error(\"Turbo-Frame response is incompatible with current page\");\n }\n }\n\n async #dismiss({ animate = true, reason = \"\" } = {}) {\n this.debug(\"dismiss-start\", { animate, reason });\n\n // if this element is detached then we've experienced a turbo navigation\n if (!this.element.isConnected) {\n this.debug(\"skip dismiss, element detached\");\n return;\n }\n\n if (!this.modal) {\n console.warn(\"modal missing on dismiss\");\n if (DEBUG) debugger;\n }\n\n await this.scrimOutlet.hide({ animate });\n await this.modal?.dismiss();\n\n this.openValue = false;\n this.modal = null;\n delete this.dismissing;\n\n this.debug(\"dismiss-end\");\n }\n\n async #nextFrame(callback) {\n return new Promise(window.requestAnimationFrame).then(callback);\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`FrameController:${event}`, ...args);\n }\n}\n\n/**\n * Monkey patch for Turbo#FrameController.\n *\n * Intercept calls to linkClickIntercepted(element, location) and ensures\n * that src is cleared if the frame is busy so that we don't restore an\n * in-progress src on restoration visits.\n *\n * See Turbo issue: https://github.com/hotwired/turbo/issues/1055\n *\n * @param controller FrameController\n */\nfunction installNavigationInterception(controller) {\n const TurboFrameController =\n controller.element.delegate.constructor.prototype;\n\n if (TurboFrameController._linkClickIntercepted) return;\n\n TurboFrameController._linkClickIntercepted =\n TurboFrameController.linkClickIntercepted;\n TurboFrameController.linkClickIntercepted = function (element, location) {\n // #findFrameElement\n const id =\n element?.getAttribute(\"data-turbo-frame\") ||\n this.element.getAttribute(\"target\");\n let frame = document.getElementById(id);\n if (!(frame instanceof Turbo.FrameElement)) {\n frame = this.element;\n }\n\n if (frame.kpop) {\n frame.kpop.debug(\"navigate-frame %s => %s\", frame.src, location);\n FrameModal.visit(location, frame.kpop, frame, () => {\n TurboFrameController._linkClickIntercepted.call(\n this,\n element,\n location,\n );\n });\n } else {\n TurboFrameController._linkClickIntercepted.call(this, element, location);\n }\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\n\n/**\n * Scrim controller wraps an element that creates a whole page layer.\n * It is intended to be used behind a modal or nav drawer.\n *\n * If the Scrim element receives a click event, it automatically triggers \"scrim:hide\".\n *\n * You can show and hide the scrim programmatically by calling show/hide on the controller, e.g. using an outlet.\n *\n * If you need to respond to the scrim showing or hiding you should subscribe to \"scrim:show\" and \"scrim:hide\".\n */\nexport default class ScrimController extends Controller {\n static values = {\n open: Boolean,\n captive: Boolean,\n zIndex: Number,\n };\n\n connect() {\n if (DEBUG) console.debug(\"scrim:connect\");\n\n this.defaultZIndexValue = this.zIndexValue;\n this.defaultCaptiveValue = this.captiveValue;\n\n this.element.scrim = this;\n }\n\n disconnect() {\n if (DEBUG) console.debug(\"scrim:disconnect\");\n\n delete this.element.scrim;\n }\n\n async show({\n captive = this.defaultCaptiveValue,\n zIndex = this.defaultZIndexValue,\n top = window.scrollY,\n animate = true,\n } = {}) {\n if (DEBUG) console.debug(\"scrim:before-show\");\n\n // hide the scrim before opening the new one if it's already open\n if (this.openValue) {\n await this.hide({ animate });\n }\n\n // update internal state\n this.openValue = true;\n\n // notify listeners of pending request\n this.dispatch(\"show\", { bubbles: true });\n\n if (DEBUG) console.debug(\"scrim:show-start\");\n\n // update state, perform style updates\n this.#show(captive, zIndex, top);\n\n if (animate) {\n // animate opening\n // this will trigger an animationEnd event via CSS that completes the open\n this.element.dataset.showAnimating = \"\";\n\n await new Promise((resolve) => {\n this.element.addEventListener(\"animationend\", () => resolve(), {\n once: true,\n });\n });\n\n delete this.element.dataset.showAnimating;\n }\n\n if (DEBUG) console.debug(\"scrim:show-end\");\n }\n\n async hide({ animate = true } = {}) {\n if (!this.openValue || this.element.dataset.hideAnimating) return;\n\n if (DEBUG) console.debug(\"scrim:before-hide\");\n\n // notify listeners of pending request\n this.dispatch(\"hide\", { bubbles: true });\n\n if (DEBUG) console.debug(\"scrim:hide-start\");\n\n if (animate) {\n // set animation state\n // this will trigger an animationEnd event via CSS that completes the hide\n this.element.dataset.hideAnimating = \"\";\n\n await new Promise((resolve) => {\n this.element.addEventListener(\"animationend\", () => resolve(), {\n once: true,\n });\n });\n\n delete this.element.dataset.hideAnimating;\n }\n\n this.#hide();\n\n this.openValue = false;\n\n if (DEBUG) console.debug(\"scrim:hide-end\");\n }\n\n dismiss(event) {\n if (DEBUG) console.debug(\"scrim:dismiss\");\n\n if (!this.captiveValue) this.dispatch(\"dismiss\", { bubbles: true });\n }\n\n escape(event) {\n if (\n event.key === \"Escape\" &&\n !this.captiveValue &&\n !event.defaultPrevented\n ) {\n this.dispatch(\"dismiss\", { bubbles: true });\n }\n }\n\n /**\n * Clips body to viewport size and sets the z-index\n */\n #show(captive, zIndex, top) {\n this.captiveValue = captive;\n this.zIndexValue = zIndex;\n this.scrollY = top;\n\n this.previousPosition = document.body.style.position;\n this.previousTop = document.body.style.top;\n\n this.element.style.zIndex = this.zIndexValue;\n document.body.style.top = `-${top}px`;\n document.body.style.position = \"fixed\";\n }\n\n /**\n * Unclips body from viewport size and unsets the z-index\n */\n #hide() {\n this.captiveValue = this.defaultCaptiveValue;\n this.zIndexValue = this.defaultZIndexValue;\n\n resetStyle(this.element, \"z-index\", null);\n resetStyle(document.body, \"position\", null);\n resetStyle(document.body, \"top\", null);\n\n window.scrollTo({ left: 0, top: this.scrollY, behavior: \"instant\" });\n\n delete this.scrollY;\n delete this.previousPosition;\n delete this.previousTop;\n }\n}\n\nfunction resetStyle(element, property, previousValue) {\n if (previousValue) {\n element.style.setProperty(property, previousValue);\n } else {\n element.style.removeProperty(property);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport { Modal } from \"./modal\";\n\nexport class StreamModal extends Modal {\n constructor(id, action) {\n super(id);\n\n this.action = action;\n }\n\n /**\n * When the modal opens, push a state event for the current location so that\n * the user can dismiss the modal by navigating back.\n *\n * @returns {Promise<void>}\n */\n async open() {\n await super.open();\n\n window.history.pushState({ kpop: true, id: this.id }, \"\", window.location);\n }\n\n /**\n * On dismiss, pop the state event that was pushed when the modal opened,\n * then clear any modals from the turbo frame element.\n *\n * @returns {Promise<void>}\n */\n async dismiss() {\n await super.dismiss();\n\n if (this.isCurrentLocation) {\n await this.pop(\"popstate\", () => window.history.back());\n }\n\n this.frameElement.innerHTML = \"\";\n }\n\n /**\n * On navigation from inside the modal, dismiss the modal first so that the\n * modal does not appear in the history stack.\n *\n * @param frame TurboFrame element\n * @param e Turbo navigation event\n */\n beforeVisit(frame, e) {\n super.beforeVisit(frame, e);\n\n e.preventDefault();\n\n frame.dismiss({ animate: false }).then(() => {\n Turbo.visit(e.detail.url);\n\n this.debug(\"before-visit-end\");\n });\n }\n\n /**\n * If the user pops state, dismiss the modal.\n *\n * @param frame FrameController\n * @param e history event\n */\n popstate(frame, e) {\n super.popstate(frame, e);\n\n frame.dismiss({ animate: true, reason: \"popstate\" });\n }\n\n get isCurrentLocation() {\n return window.history.state?.kpop && window.history.state?.id === this.id;\n }\n}\n","import DEBUG from \"../debug\";\n\nexport class StreamRenderer {\n constructor(frame, action) {\n this.frame = frame;\n this.action = action;\n }\n\n render() {\n if (DEBUG) console.debug(\"stream-renderer:render\");\n this.frame.src = \"\";\n this.frame.innerHTML = \"\";\n this.frame.append(this.action.templateContent);\n }\n}\n","import { Turbo } from \"@hotwired/turbo-rails\";\n\nimport DEBUG from \"./debug\";\n\nimport { StreamModal } from \"./modals/stream_modal\";\nimport { StreamRenderer } from \"./utils/stream_renderer\";\n\nfunction kpop(action) {\n return action.targetElements[0]?.kpop;\n}\n\nTurbo.StreamActions.kpop_open = function () {\n const animate = !kpop(this).openValue;\n\n kpop(this)\n ?.dismiss({ animate, reason: \"before-turbo-stream\" })\n .then(() => {\n new StreamRenderer(this.targetElements[0], this).render();\n kpop(this)?.open(new StreamModal(this.target, this), { animate });\n });\n};\n\nTurbo.StreamActions.kpop_dismiss = function () {\n kpop(this)?.dismiss({ reason: \"turbo_stream.kpop.dismiss\" });\n};\n\nTurbo.StreamActions.kpop_redirect_to = function () {\n if (this.dataset.turboFrame === this.target) {\n if (DEBUG)\n console.debug(\n `kpop: redirecting ${this.target} to ${this.getAttribute(\"href\")}`,\n );\n const a = document.createElement(\"A\");\n a.setAttribute(\"data-turbo-action\", \"replace\");\n this.targetElements[0].delegate.linkClickIntercepted(\n a,\n this.getAttribute(\"href\"),\n );\n } else {\n if (DEBUG)\n console.debug(`kpop: redirecting to ${this.getAttribute(\"href\")}`);\n Turbo.visit(this.getAttribute(\"href\"), {\n action: this.dataset.turboAction,\n });\n }\n};\n","import FrameController from \"../kpop/controllers/frame_controller\";\nimport ModalController from \"../kpop/controllers/modal_controller\";\nimport ScrimController from \"../kpop/controllers/scrim_controller\";\n\nimport \"./turbo_actions\";\n\nconst Definitions = [\n { identifier: \"kpop--frame\", controllerConstructor: FrameController },\n { identifier: \"kpop--modal\", controllerConstructor: ModalController },\n { identifier: \"scrim\", controllerConstructor: ScrimController },\n];\n\nexport { Definitions as default };\n","import { Controller } from \"@hotwired/stimulus\";\n\nimport DEBUG from \"../debug\";\n\nexport default class Kpop__ModalController extends Controller {\n static values = {\n fallback_location: String,\n layout: String,\n };\n\n connect() {\n this.debug(\"connect\");\n\n if (this.layoutValue) {\n document.querySelector(\"#kpop\").classList.toggle(this.layoutValue, true);\n }\n }\n\n disconnect() {\n this.debug(\"disconnect\");\n\n if (this.layoutValue) {\n document.querySelector(\"#kpop\").classList.toggle(this.layoutValue, false);\n }\n }\n\n debug(event, ...args) {\n if (DEBUG) console.debug(`ModalController:${event}`, ...args);\n }\n}\n"],"names":["Modal","constructor","id","this","open","debug","dismiss","beforeVisit","frame","e","detail","url","popstate","state","pop","event","callback","promise","Promise","resolve","window","addEventListener","once","frameElement","document","getElementById","controller","kpop","modalElement","querySelector","currentLocationValue","dataset","fallbackLocationValue","isCurrentLocation","history","turbo","Turbo","session","location","href","src","args","ContentModal","connect","element","animate","super","fallbackLocation","visitStarted","innerHTML","replaceState","scrimOutlet","hide","URL","toString","baseURI","FrameModal","modal","console","warn","clear","visit","hasAttribute","back","preventDefault","then","Kpop__FrameController","Controller","static","Boolean","TurboFrameController","delegate","prototype","_linkClickIntercepted","linkClickIntercepted","getAttribute","FrameElement","call","installNavigationInterception","complete","modalElements","length","pathname","disconnect","scrimOutletConnected","scrim","scrimConnected","openValue","show","openValueChanged","parentElement","style","display","isOpen","dismissing","opening","nextFrame","reason","forEach","remove","beforeFrameRender","newFrame","resume","beforeStreamRender","render","async","stream","frameLoad","querySelectorAll","view","forceReloaded","error","isConnected","requestAnimationFrame","ScrimController","captive","zIndex","Number","defaultZIndexValue","zIndexValue","defaultCaptiveValue","captiveValue","top","scrollY","dispatch","bubbles","showAnimating","hideAnimating","escape","key","defaultPrevented","previousPosition","body","position","previousTop","resetStyle","scrollTo","left","behavior","property","previousValue","removeProperty","StreamModal","action","pushState","StreamRenderer","append","templateContent","targetElements","StreamActions","kpop_open","target","kpop_dismiss","kpop_redirect_to","turboFrame","a","createElement","setAttribute","turboAction","Definitions","identifier","controllerConstructor","FrameController","fallback_location","String","layout","layoutValue","classList","toggle"],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  <html>
2
2
  <head>
3
+ <%# Workaround for https://github.com/hotwired/turbo-rails/issues/669 %>
4
+ <%= csrf_meta_tags %>
5
+ <%= csp_meta_tag %>
6
+
3
7
  <%# include all turbo-track elements so turbo knows it can cache frame visits %>
4
8
  <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
5
9
  <%= javascript_importmap_tags %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katalyst-kpop
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.2
4
+ version: 3.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katalyst Interactive
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-17 00:00:00.000000000 Z
11
+ date: 2024-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: katalyst-html-attributes
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  requirements: []
133
- rubygems_version: 3.5.11
133
+ rubygems_version: 3.5.16
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Modal library that uses Turbo and Stimulus.