katalyst-kpop 3.2.6 → 3.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 265b8f849c193acd5f380b24bb75956fcb9f604a19f8b26c66b53eafcb08e3bc
4
- data.tar.gz: 725b40a50766355cff40f51698c1005c23f9216579aa6e5d3a8f9229b8349ba0
3
+ metadata.gz: 130f02cc7a50dbe2cdba04a6ba7abd39100ba19e02a9bc6b6c9ffa1386d6817d
4
+ data.tar.gz: fa2bd7dc46e41540ef60a622b46066cb3f65b32da22a595c0d012c32eaf26864
5
5
  SHA512:
6
- metadata.gz: 74871018734d6733953c916e28b462bb6d48797fb936393f47729dec86e935e10f9e88a47bd8ab181802079f0556fb083b517ce707688614196f5dad302cd067
7
- data.tar.gz: c2abd44da054ceec49b88745614570b102b0bd04cdd286344710f82acfc011bfccf8397e6a62b4fe9acc83ccb703f12372e603df67d6dfed2af897b521b07a22
6
+ metadata.gz: dc83006e65292fb98728c05650720d1c447c4cbe6c2c40f1071ec2af3b3095660b942ebe0bf76e9e1faf166608d2557ba2e87da5ad00afb57db2cf70cd501d2d
7
+ data.tar.gz: cd825634f4b532b1bec33dbee81e6c0041e20f18ad2db716d5cd29f5125d3c50bf820d1a840635d5ad6b07018acc8818d34ac936006a204a1981d790b2821704
@@ -652,12 +652,14 @@ class ScrimController extends Controller {
652
652
  this.zIndexValue = zIndex;
653
653
  this.scrollY = top;
654
654
 
655
- this.previousPosition = document.body.style.position;
656
- this.previousTop = document.body.style.top;
657
-
658
655
  this.element.style.zIndex = this.zIndexValue;
659
656
  document.body.style.top = `-${top}px`;
660
657
  document.body.style.position = "fixed";
658
+ document.body.style.paddingRight = `-${this.scrollPadding}px`;
659
+
660
+ if (document.body.scrollHeight > window.innerHeight) {
661
+ document.body.style.overflowY = "scroll";
662
+ }
661
663
  }
662
664
 
663
665
  /**
@@ -667,21 +669,14 @@ class ScrimController extends Controller {
667
669
  this.captiveValue = this.defaultCaptiveValue;
668
670
  this.zIndexValue = this.defaultZIndexValue;
669
671
 
670
- resetStyle(this.element, "z-index");
671
- resetStyle(document.body, "position");
672
- resetStyle(document.body, "top");
672
+ this.element.style.removeProperty("z-index");
673
+ document.body.style.removeProperty("position");
674
+ document.body.style.removeProperty("top");
675
+ document.body.style.removeProperty("overflow-y");
673
676
 
674
677
  window.scrollTo({ left: 0, top: this.scrollY, behavior: "instant" });
675
678
 
676
679
  delete this.scrollY;
677
- delete this.previousPosition;
678
- delete this.previousTop;
679
- }
680
- }
681
-
682
- function resetStyle(element, property, previousValue) {
683
- {
684
- element.style.removeProperty(property);
685
680
  }
686
681
  }
687
682
 
@@ -652,12 +652,14 @@ class ScrimController extends Controller {
652
652
  this.zIndexValue = zIndex;
653
653
  this.scrollY = top;
654
654
 
655
- this.previousPosition = document.body.style.position;
656
- this.previousTop = document.body.style.top;
657
-
658
655
  this.element.style.zIndex = this.zIndexValue;
659
656
  document.body.style.top = `-${top}px`;
660
657
  document.body.style.position = "fixed";
658
+ document.body.style.paddingRight = `-${this.scrollPadding}px`;
659
+
660
+ if (document.body.scrollHeight > window.innerHeight) {
661
+ document.body.style.overflowY = "scroll";
662
+ }
661
663
  }
662
664
 
663
665
  /**
@@ -667,21 +669,14 @@ class ScrimController extends Controller {
667
669
  this.captiveValue = this.defaultCaptiveValue;
668
670
  this.zIndexValue = this.defaultZIndexValue;
669
671
 
670
- resetStyle(this.element, "z-index");
671
- resetStyle(document.body, "position");
672
- resetStyle(document.body, "top");
672
+ this.element.style.removeProperty("z-index");
673
+ document.body.style.removeProperty("position");
674
+ document.body.style.removeProperty("top");
675
+ document.body.style.removeProperty("overflow-y");
673
676
 
674
677
  window.scrollTo({ left: 0, top: this.scrollY, behavior: "instant" });
675
678
 
676
679
  delete this.scrollY;
677
- delete this.previousPosition;
678
- delete this.previousTop;
679
- }
680
- }
681
-
682
- function resetStyle(element, property, previousValue) {
683
- {
684
- element.style.removeProperty(property);
685
680
  }
686
681
  }
687
682
 
@@ -1,2 +1,2 @@
1
- import{Controller as e}from"@hotwired/stimulus";import{Turbo as t}from"@hotwired/turbo-rails";class i{constructor(e){this.id=e}async open(){this.debug("open")}async dismiss(){this.debug("dismiss")}beforeVisit(e,t){this.debug("before-visit",t.detail.url)}popstate(e,t){this.debug("popstate",t.state)}async pop(e,t){this.debug("pop");const i=new Promise((t=>{window.addEventListener(e,(()=>{t()}),{once:!0})}));return t(),i}get frameElement(){return document.getElementById(this.id)}get controller(){return this.frameElement?.kpop}get modalElement(){return this.frameElement?.querySelector("[data-controller*='kpop--modal']")}get currentLocationValue(){return this.modalElement?.dataset["kpop-ModalCurrentLocationValue"]||"/"}get fallbackLocationValue(){return this.modalElement?.dataset["kpop-ModalFallbackLocationValue"]}get isCurrentLocation(){return window.history.state?.turbo&&t.session.location.href===this.src}static debug(e,...t){}debug(e,...t){}}class s extends i{static connect(e,t){e.open(new s(t.id),{animate:!1})}constructor(e,t=null){super(e),t&&(this.src=t)}async dismiss(){const e=this.fallbackLocationValue;await super.dismiss(),this.visitStarted?this.debug("skipping dismiss, visit started"):this.isCurrentLocation?(this.frameElement.innerHTML="",e&&window.history.replaceState(window.history.state,"",e)):this.debug("skipping dismiss, not current location")}beforeVisit(e,t){super.beforeVisit(e,t),this.visitStarted=!0,e.scrimOutlet.hide({animate:!1})}get src(){return new URL(this.currentLocationValue.toString(),document.baseURI).toString()}}class n extends i{static connect(e,t){const i=new n(t.id,t.src);return i.isCurrentLocation?(this.debug("restore",t.src),e.open(i,{animate:!1})):(console.warn("kpop: restored frame src doesn't match window href",i.src,window.location.href),e.clear())}static visit(e,t,i,s){i.hasAttribute("busy")&&(this.debug("clearing src to cancel turbo request"),i.src=""),i.src!==e?(i.src&&i.src!==window.location.href&&(console.warn("kpop: frame src doesn't match window",i.src,window.location.href,e),t.clear()),this.debug("navigate to",e),s()):this.debug("skipping navigate as already on location")}constructor(e,t){super(e),this.src=t}async dismiss(){await super.dismiss(),this.isCurrentLocation?await this.pop("turbo:load",(()=>window.history.back())):this.debug("skipping dismiss, not current location")}beforeVisit(e,i){super.beforeVisit(e,i),i.preventDefault(),e.dismiss({animate:!1}).then((()=>{t.visit(i.detail.url),this.debug("before-visit-end")}))}}class a extends e{static outlets=["scrim"];static targets=["modal"];static values={open:Boolean};connect(){this.debug("connect",this.element.src),this.element.kpop=this,function(e){const t=e.element.delegate.constructor.prototype;if(t._linkClickIntercepted)return;t._linkClickIntercepted=t.linkClickIntercepted,t.linkClickIntercepted=function(e,i){const s=e?.getAttribute("data-turbo-frame")||this.element.getAttribute("target");let a=document.getElementById(s);a instanceof Turbo.FrameElement||(a=this.element),a.kpop?(a.kpop.debug("navigate-frame %s => %s",a.src,i),n.visit(i,a.kpop,a,(()=>{t._linkClickIntercepted.call(this,e,i)}))):t._linkClickIntercepted.call(this,e,i)}}(this),this.element.src&&this.element.complete?(this.debug("new frame modal",this.element.src),n.connect(this,this.element)):this.modalElements.length>0?(this.debug("new content modal",window.location.pathname),s.connect(this,this.element)):(this.debug("no modal"),this.clear())}disconnect(){this.debug("disconnect",this.element.src),delete this.element.kpop,delete this.modal}scrimOutletConnected(e){this.debug("scrim-connected"),this.scrimConnected=!0,this.openValue?e.show({animate:!1}):e.hide({animate:!1})}openValueChanged(e){this.debug("open-changed",e),this.element.parentElement.style.display=e?"flex":"none"}async open(e,{animate:t=!0}={}){return this.isOpen?(this.debug("skip open as already open"),this.modal||=e,!1):(await this.dismissing,this.opening||=this.#e((()=>this.#t(e,{animate:t}))))}async dismiss({animate:e=!0,reason:t=""}={}){return this.isOpen?(await this.opening,this.dismissing||=this.#e((()=>this.#i({animate:e,reason:t})))):(this.debug("skip dismiss as already closed"),!1)}async clear(){if(this.element.src="",this.modalElements.forEach((e=>e.remove())),this.openValue=!1,this.scrimConnected)return this.scrimOutlet.hide({animate:!1});this.modal=null}popstate(e){this.modal?.popstate(this,e)}beforeFrameRender(e){this.debug("before-frame-render",e.detail.newFrame.baseURI),e.detail.newFrame.id===this.element.id&&(e.preventDefault(),this.dismiss({animate:!0,reason:"before-frame-render"}).then((()=>{this.debug("resume-frame-render",e.detail.newFrame.baseURI),e.detail.resume()})))}beforeStreamRender(e){this.debug("before-stream-render",e.detail);const t=e.detail.render;e.detail.render=async e=>{await this.dismissing,this.debug("stream-render",e),await t(e)}}beforeVisit(e){this.debug("before-visit",e.detail.url),e.detail.url!==this.element.src&&this.isOpen&&this.modal.beforeVisit(this,e)}frameLoad(e){this.debug("frame-load");const t=new n(this.element.id,this.element.src);window.addEventListener("turbo:visit",(e=>{this.open(t,{animate:!0})}),{once:!0})}get isOpen(){return this.openValue&&!this.dismissing}get modalElements(){return this.element.querySelectorAll("[data-controller*='kpop--modal']")}async#t(e,{animate:t=!0}={}){this.debug("open-start",{animate:t});const i=this.scrimConnected&&this.scrimOutlet;this.modal=e,this.openValue=!0,await e.open({animate:t}),await(i?.show({animate:t})),delete this.opening,this.debug("open-end"),Turbo.session.view.forceReloaded&&console.error("Turbo-Frame response is incompatible with current page")}async#i({animate:e=!0,reason:t=""}={}){this.debug("dismiss-start",{animate:e,reason:t}),this.element.isConnected?(this.modal||console.warn("modal missing on dismiss"),await this.scrimOutlet.hide({animate:e}),await(this.modal?.dismiss()),this.openValue=!1,this.modal=null,delete this.dismissing,this.debug("dismiss-end")):this.debug("skip dismiss, element detached")}async#e(e){return new Promise(window.requestAnimationFrame).then(e)}debug(e,...t){}}class o extends e{static values={open:Boolean,captive:Boolean,zIndex:Number};connect(){this.defaultZIndexValue=this.zIndexValue,this.defaultCaptiveValue=this.captiveValue,this.element.scrim=this}disconnect(){delete this.element.scrim}async show({captive:e=this.defaultCaptiveValue,zIndex:t=this.defaultZIndexValue,top:i=window.scrollY,animate:s=!0}={}){this.openValue&&await this.hide({animate:s}),this.openValue=!0,this.dispatch("show",{bubbles:!0}),this.#s(e,t,i),s&&(this.element.dataset.showAnimating="",await new Promise((e=>{this.element.addEventListener("animationend",(()=>e()),{once:!0})})),delete this.element.dataset.showAnimating)}async hide({animate:e=!0}={}){this.openValue&&!this.element.dataset.hideAnimating&&(this.dispatch("hide",{bubbles:!0}),e&&(this.element.dataset.hideAnimating="",await new Promise((e=>{this.element.addEventListener("animationend",(()=>e()),{once:!0})})),delete this.element.dataset.hideAnimating),this.#n(),this.openValue=!1)}dismiss(e){this.captiveValue||this.dispatch("dismiss",{bubbles:!0})}escape(e){"Escape"!==e.key||this.captiveValue||e.defaultPrevented||this.dispatch("dismiss",{bubbles:!0})}#s(e,t,i){this.captiveValue=e,this.zIndexValue=t,this.scrollY=i,this.previousPosition=document.body.style.position,this.previousTop=document.body.style.top,this.element.style.zIndex=this.zIndexValue,document.body.style.top=`-${i}px`,document.body.style.position="fixed"}#n(){this.captiveValue=this.defaultCaptiveValue,this.zIndexValue=this.defaultZIndexValue,r(this.element,"z-index"),r(document.body,"position"),r(document.body,"top"),window.scrollTo({left:0,top:this.scrollY,behavior:"instant"}),delete this.scrollY,delete this.previousPosition,delete this.previousTop}}function r(e,t,i){e.style.removeProperty(t)}class d extends i{constructor(e,t){super(e),this.action=t}async open(){await super.open(),window.history.pushState({kpop:!0,id:this.id},"",window.location)}async dismiss(){await super.dismiss(),this.isCurrentLocation&&await this.pop("popstate",(()=>window.history.back())),this.frameElement.innerHTML=""}beforeVisit(e,i){super.beforeVisit(e,i),i.preventDefault(),e.dismiss({animate:!1}).then((()=>{t.visit(i.detail.url),this.debug("before-visit-end")}))}popstate(e,t){super.popstate(e,t),e.dismiss({animate:!0,reason:"popstate"})}get isCurrentLocation(){return window.history.state?.kpop&&window.history.state?.id===this.id}}class l{constructor(e,t){this.frame=e,this.action=t}render(){this.frame.src="",this.frame.innerHTML="",this.frame.append(this.action.templateContent)}}function c(e){return e.targetElements[0]?.kpop}t.StreamActions.kpop_open=function(){const e=!c(this).openValue;c(this)?.dismiss({animate:e,reason:"before-turbo-stream"}).then((()=>{new l(this.targetElements[0],this).render(),c(this)?.open(new d(this.target,this),{animate:e})}))},t.StreamActions.kpop_dismiss=function(){c(this)?.dismiss({reason:"turbo_stream.kpop.dismiss"})},t.StreamActions.kpop_redirect_to=function(){if(this.dataset.turboFrame===this.target){const e=document.createElement("A");e.setAttribute("data-turbo-action","replace"),this.targetElements[0].delegate.linkClickIntercepted(e,this.getAttribute("href"))}else t.visit(this.getAttribute("href"),{action:this.dataset.turboAction})};const h=[{identifier:"kpop--frame",controllerConstructor:a},{identifier:"kpop--modal",controllerConstructor:class extends e{static values={fallback_location:String,layout:String};connect(){this.debug("connect"),this.layoutValue&&document.querySelector("#kpop").classList.toggle(this.layoutValue,!0)}disconnect(){this.debug("disconnect"),this.layoutValue&&document.querySelector("#kpop").classList.toggle(this.layoutValue,!1)}debug(e,...t){}}},{identifier:"scrim",controllerConstructor:o}];export{h as default};
1
+ import{Controller as e}from"@hotwired/stimulus";import{Turbo as t}from"@hotwired/turbo-rails";class i{constructor(e){this.id=e}async open(){this.debug("open")}async dismiss(){this.debug("dismiss")}beforeVisit(e,t){this.debug("before-visit",t.detail.url)}popstate(e,t){this.debug("popstate",t.state)}async pop(e,t){this.debug("pop");const i=new Promise((t=>{window.addEventListener(e,(()=>{t()}),{once:!0})}));return t(),i}get frameElement(){return document.getElementById(this.id)}get controller(){return this.frameElement?.kpop}get modalElement(){return this.frameElement?.querySelector("[data-controller*='kpop--modal']")}get currentLocationValue(){return this.modalElement?.dataset["kpop-ModalCurrentLocationValue"]||"/"}get fallbackLocationValue(){return this.modalElement?.dataset["kpop-ModalFallbackLocationValue"]}get isCurrentLocation(){return window.history.state?.turbo&&t.session.location.href===this.src}static debug(e,...t){}debug(e,...t){}}class s extends i{static connect(e,t){e.open(new s(t.id),{animate:!1})}constructor(e,t=null){super(e),t&&(this.src=t)}async dismiss(){const e=this.fallbackLocationValue;await super.dismiss(),this.visitStarted?this.debug("skipping dismiss, visit started"):this.isCurrentLocation?(this.frameElement.innerHTML="",e&&window.history.replaceState(window.history.state,"",e)):this.debug("skipping dismiss, not current location")}beforeVisit(e,t){super.beforeVisit(e,t),this.visitStarted=!0,e.scrimOutlet.hide({animate:!1})}get src(){return new URL(this.currentLocationValue.toString(),document.baseURI).toString()}}class n extends i{static connect(e,t){const i=new n(t.id,t.src);return i.isCurrentLocation?(this.debug("restore",t.src),e.open(i,{animate:!1})):(console.warn("kpop: restored frame src doesn't match window href",i.src,window.location.href),e.clear())}static visit(e,t,i,s){i.hasAttribute("busy")&&(this.debug("clearing src to cancel turbo request"),i.src=""),i.src!==e?(i.src&&i.src!==window.location.href&&(console.warn("kpop: frame src doesn't match window",i.src,window.location.href,e),t.clear()),this.debug("navigate to",e),s()):this.debug("skipping navigate as already on location")}constructor(e,t){super(e),this.src=t}async dismiss(){await super.dismiss(),this.isCurrentLocation?await this.pop("turbo:load",(()=>window.history.back())):this.debug("skipping dismiss, not current location")}beforeVisit(e,i){super.beforeVisit(e,i),i.preventDefault(),e.dismiss({animate:!1}).then((()=>{t.visit(i.detail.url),this.debug("before-visit-end")}))}}class a extends e{static outlets=["scrim"];static targets=["modal"];static values={open:Boolean};connect(){this.debug("connect",this.element.src),this.element.kpop=this,function(e){const t=e.element.delegate.constructor.prototype;if(t._linkClickIntercepted)return;t._linkClickIntercepted=t.linkClickIntercepted,t.linkClickIntercepted=function(e,i){const s=e?.getAttribute("data-turbo-frame")||this.element.getAttribute("target");let a=document.getElementById(s);a instanceof Turbo.FrameElement||(a=this.element),a.kpop?(a.kpop.debug("navigate-frame %s => %s",a.src,i),n.visit(i,a.kpop,a,(()=>{t._linkClickIntercepted.call(this,e,i)}))):t._linkClickIntercepted.call(this,e,i)}}(this),this.element.src&&this.element.complete?(this.debug("new frame modal",this.element.src),n.connect(this,this.element)):this.modalElements.length>0?(this.debug("new content modal",window.location.pathname),s.connect(this,this.element)):(this.debug("no modal"),this.clear())}disconnect(){this.debug("disconnect",this.element.src),delete this.element.kpop,delete this.modal}scrimOutletConnected(e){this.debug("scrim-connected"),this.scrimConnected=!0,this.openValue?e.show({animate:!1}):e.hide({animate:!1})}openValueChanged(e){this.debug("open-changed",e),this.element.parentElement.style.display=e?"flex":"none"}async open(e,{animate:t=!0}={}){return this.isOpen?(this.debug("skip open as already open"),this.modal||=e,!1):(await this.dismissing,this.opening||=this.#e((()=>this.#t(e,{animate:t}))))}async dismiss({animate:e=!0,reason:t=""}={}){return this.isOpen?(await this.opening,this.dismissing||=this.#e((()=>this.#i({animate:e,reason:t})))):(this.debug("skip dismiss as already closed"),!1)}async clear(){if(this.element.src="",this.modalElements.forEach((e=>e.remove())),this.openValue=!1,this.scrimConnected)return this.scrimOutlet.hide({animate:!1});this.modal=null}popstate(e){this.modal?.popstate(this,e)}beforeFrameRender(e){this.debug("before-frame-render",e.detail.newFrame.baseURI),e.detail.newFrame.id===this.element.id&&(e.preventDefault(),this.dismiss({animate:!0,reason:"before-frame-render"}).then((()=>{this.debug("resume-frame-render",e.detail.newFrame.baseURI),e.detail.resume()})))}beforeStreamRender(e){this.debug("before-stream-render",e.detail);const t=e.detail.render;e.detail.render=async e=>{await this.dismissing,this.debug("stream-render",e),await t(e)}}beforeVisit(e){this.debug("before-visit",e.detail.url),e.detail.url!==this.element.src&&this.isOpen&&this.modal.beforeVisit(this,e)}frameLoad(e){this.debug("frame-load");const t=new n(this.element.id,this.element.src);window.addEventListener("turbo:visit",(e=>{this.open(t,{animate:!0})}),{once:!0})}get isOpen(){return this.openValue&&!this.dismissing}get modalElements(){return this.element.querySelectorAll("[data-controller*='kpop--modal']")}async#t(e,{animate:t=!0}={}){this.debug("open-start",{animate:t});const i=this.scrimConnected&&this.scrimOutlet;this.modal=e,this.openValue=!0,await e.open({animate:t}),await(i?.show({animate:t})),delete this.opening,this.debug("open-end"),Turbo.session.view.forceReloaded&&console.error("Turbo-Frame response is incompatible with current page")}async#i({animate:e=!0,reason:t=""}={}){this.debug("dismiss-start",{animate:e,reason:t}),this.element.isConnected?(this.modal||console.warn("modal missing on dismiss"),await this.scrimOutlet.hide({animate:e}),await(this.modal?.dismiss()),this.openValue=!1,this.modal=null,delete this.dismissing,this.debug("dismiss-end")):this.debug("skip dismiss, element detached")}async#e(e){return new Promise(window.requestAnimationFrame).then(e)}debug(e,...t){}}class o extends e{static values={open:Boolean,captive:Boolean,zIndex:Number};connect(){this.defaultZIndexValue=this.zIndexValue,this.defaultCaptiveValue=this.captiveValue,this.element.scrim=this}disconnect(){delete this.element.scrim}async show({captive:e=this.defaultCaptiveValue,zIndex:t=this.defaultZIndexValue,top:i=window.scrollY,animate:s=!0}={}){this.openValue&&await this.hide({animate:s}),this.openValue=!0,this.dispatch("show",{bubbles:!0}),this.#s(e,t,i),s&&(this.element.dataset.showAnimating="",await new Promise((e=>{this.element.addEventListener("animationend",(()=>e()),{once:!0})})),delete this.element.dataset.showAnimating)}async hide({animate:e=!0}={}){this.openValue&&!this.element.dataset.hideAnimating&&(this.dispatch("hide",{bubbles:!0}),e&&(this.element.dataset.hideAnimating="",await new Promise((e=>{this.element.addEventListener("animationend",(()=>e()),{once:!0})})),delete this.element.dataset.hideAnimating),this.#n(),this.openValue=!1)}dismiss(e){this.captiveValue||this.dispatch("dismiss",{bubbles:!0})}escape(e){"Escape"!==e.key||this.captiveValue||e.defaultPrevented||this.dispatch("dismiss",{bubbles:!0})}#s(e,t,i){this.captiveValue=e,this.zIndexValue=t,this.scrollY=i,this.element.style.zIndex=this.zIndexValue,document.body.style.top=`-${i}px`,document.body.style.position="fixed",document.body.style.paddingRight=`-${this.scrollPadding}px`,document.body.scrollHeight>window.innerHeight&&(document.body.style.overflowY="scroll")}#n(){this.captiveValue=this.defaultCaptiveValue,this.zIndexValue=this.defaultZIndexValue,this.element.style.removeProperty("z-index"),document.body.style.removeProperty("position"),document.body.style.removeProperty("top"),document.body.style.removeProperty("overflow-y"),window.scrollTo({left:0,top:this.scrollY,behavior:"instant"}),delete this.scrollY}}class r extends i{constructor(e,t){super(e),this.action=t}async open(){await super.open(),window.history.pushState({kpop:!0,id:this.id},"",window.location)}async dismiss(){await super.dismiss(),this.isCurrentLocation&&await this.pop("popstate",(()=>window.history.back())),this.frameElement.innerHTML=""}beforeVisit(e,i){super.beforeVisit(e,i),i.preventDefault(),e.dismiss({animate:!1}).then((()=>{t.visit(i.detail.url),this.debug("before-visit-end")}))}popstate(e,t){super.popstate(e,t),e.dismiss({animate:!0,reason:"popstate"})}get isCurrentLocation(){return window.history.state?.kpop&&window.history.state?.id===this.id}}class d{constructor(e,t){this.frame=e,this.action=t}render(){this.frame.src="",this.frame.innerHTML="",this.frame.append(this.action.templateContent)}}function l(e){return e.targetElements[0]?.kpop}t.StreamActions.kpop_open=function(){const e=!l(this).openValue;l(this)?.dismiss({animate:e,reason:"before-turbo-stream"}).then((()=>{new d(this.targetElements[0],this).render(),l(this)?.open(new r(this.target,this),{animate:e})}))},t.StreamActions.kpop_dismiss=function(){l(this)?.dismiss({reason:"turbo_stream.kpop.dismiss"})},t.StreamActions.kpop_redirect_to=function(){if(this.dataset.turboFrame===this.target){const e=document.createElement("A");e.setAttribute("data-turbo-action","replace"),this.targetElements[0].delegate.linkClickIntercepted(e,this.getAttribute("href"))}else t.visit(this.getAttribute("href"),{action:this.dataset.turboAction})};const c=[{identifier:"kpop--frame",controllerConstructor:a},{identifier:"kpop--modal",controllerConstructor:class extends e{static values={fallback_location:String,layout:String};connect(){this.debug("connect"),this.layoutValue&&document.querySelector("#kpop").classList.toggle(this.layoutValue,!0)}disconnect(){this.debug("disconnect"),this.layoutValue&&document.querySelector("#kpop").classList.toggle(this.layoutValue,!1)}debug(e,...t){}}},{identifier:"scrim",controllerConstructor:o}];export{c as default};
2
2
  //# sourceMappingURL=kpop.min.js.map
@@ -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 if (event.detail.newFrame.id !== this.element.id) return;\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 if (event.detail.newFrame.id !== this.element.id) return;\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.element.style.zIndex = this.zIndexValue;\n document.body.style.top = `-${top}px`;\n document.body.style.position = \"fixed\";\n document.body.style.paddingRight = `-${this.scrollPadding}px`;\n\n if (document.body.scrollHeight > window.innerHeight) {\n document.body.style.overflowY = \"scroll\";\n }\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 this.element.style.removeProperty(\"z-index\");\n document.body.style.removeProperty(\"position\");\n document.body.style.removeProperty(\"top\");\n document.body.style.removeProperty(\"overflow-y\");\n\n window.scrollTo({ left: 0, top: this.scrollY, behavior: \"instant\" });\n\n delete this.scrollY;\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","body","position","paddingRight","scrollPadding","scrollHeight","innerHeight","overflowY","removeProperty","scrollTo","left","behavior","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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"}
@@ -130,12 +130,14 @@ export default class ScrimController extends Controller {
130
130
  this.zIndexValue = zIndex;
131
131
  this.scrollY = top;
132
132
 
133
- this.previousPosition = document.body.style.position;
134
- this.previousTop = document.body.style.top;
135
-
136
133
  this.element.style.zIndex = this.zIndexValue;
137
134
  document.body.style.top = `-${top}px`;
138
135
  document.body.style.position = "fixed";
136
+ document.body.style.paddingRight = `-${this.scrollPadding}px`;
137
+
138
+ if (document.body.scrollHeight > window.innerHeight) {
139
+ document.body.style.overflowY = "scroll";
140
+ }
139
141
  }
140
142
 
141
143
  /**
@@ -145,22 +147,13 @@ export default class ScrimController extends Controller {
145
147
  this.captiveValue = this.defaultCaptiveValue;
146
148
  this.zIndexValue = this.defaultZIndexValue;
147
149
 
148
- resetStyle(this.element, "z-index", null);
149
- resetStyle(document.body, "position", null);
150
- resetStyle(document.body, "top", null);
150
+ this.element.style.removeProperty("z-index");
151
+ document.body.style.removeProperty("position");
152
+ document.body.style.removeProperty("top");
153
+ document.body.style.removeProperty("overflow-y");
151
154
 
152
155
  window.scrollTo({ left: 0, top: this.scrollY, behavior: "instant" });
153
156
 
154
157
  delete this.scrollY;
155
- delete this.previousPosition;
156
- delete this.previousTop;
157
- }
158
- }
159
-
160
- function resetStyle(element, property, previousValue) {
161
- if (previousValue) {
162
- element.style.setProperty(property, previousValue);
163
- } else {
164
- element.style.removeProperty(property);
165
158
  }
166
159
  }
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katalyst-kpop
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.6
4
+ version: 3.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katalyst Interactive
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-18 00:00:00.000000000 Z
10
+ date: 2025-02-26 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: katalyst-html-attributes
@@ -52,7 +51,6 @@ dependencies:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
53
  version: '0'
55
- description:
56
54
  email:
57
55
  - developers@katalyst.com.au
58
56
  executables: []
@@ -115,7 +113,6 @@ licenses:
115
113
  - MIT
116
114
  metadata:
117
115
  rubygems_mfa_required: 'true'
118
- post_install_message:
119
116
  rdoc_options: []
120
117
  require_paths:
121
118
  - lib
@@ -130,8 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
127
  - !ruby/object:Gem::Version
131
128
  version: '0'
132
129
  requirements: []
133
- rubygems_version: 3.5.22
134
- signing_key:
130
+ rubygems_version: 3.6.2
135
131
  specification_version: 4
136
132
  summary: Modal library that uses Turbo and Stimulus.
137
133
  test_files: []