From 9f0e0da8d97fb7809b1d6a564ba2d3861dbf1417 Mon Sep 17 00:00:00 2001 From: Sub-Xaero Date: Sat, 24 Apr 2021 01:47:29 +0100 Subject: [PATCH] feat: TimeoutController - a utility controller that fires an event after x seconds to wire up to other controllers --- .../utility/timeout_controller.d.ts | 13 +++++ .../utility/timeout_controller.d.ts.map | 1 + dist/index.d.ts | 1 + dist/index.d.ts.map | 2 +- dist/stimulus-library.js | 2 +- dist/stimulus-library.js.map | 2 +- dist/stimulus-library.modern.js | 2 +- dist/stimulus-library.modern.js.map | 2 +- dist/stimulus-library.module.js | 2 +- dist/stimulus-library.module.js.map | 2 +- dist/stimulus-library.umd.js | 2 +- dist/stimulus-library.umd.js.map | 2 +- docs/docs/controllers/timeout_controller.mdx | 57 +++++++++++++++++++ docs/sidebars.js | 1 + src/controllers/utility/timeout_controller.ts | 30 ++++++++++ src/index.ts | 1 + 16 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 dist/controllers/utility/timeout_controller.d.ts create mode 100644 dist/controllers/utility/timeout_controller.d.ts.map create mode 100644 docs/docs/controllers/timeout_controller.mdx create mode 100644 src/controllers/utility/timeout_controller.ts diff --git a/dist/controllers/utility/timeout_controller.d.ts b/dist/controllers/utility/timeout_controller.d.ts new file mode 100644 index 00000000..0ece0b67 --- /dev/null +++ b/dist/controllers/utility/timeout_controller.d.ts @@ -0,0 +1,13 @@ +import { BaseController } from "../../utilities/base_controller"; +export declare class TimeoutController extends BaseController { + static values: { + seconds: NumberConstructor; + }; + readonly secondsValue: number; + _timeoutHandle: null | number; + initialize(): void; + connect(): void; + disconnect(): void; + _timeout(): void; +} +//# sourceMappingURL=timeout_controller.d.ts.map \ No newline at end of file diff --git a/dist/controllers/utility/timeout_controller.d.ts.map b/dist/controllers/utility/timeout_controller.d.ts.map new file mode 100644 index 00000000..27c09be8 --- /dev/null +++ b/dist/controllers/utility/timeout_controller.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"timeout_controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/utility/timeout_controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAE/D,qBAAa,iBAAkB,SAAQ,cAAc;IAEnD,MAAM,CAAC,MAAM;;MAAqB;IAElC,SAAiB,YAAY,EAAE,MAAM,CAAC;IACtC,cAAc,EAAE,IAAI,GAAG,MAAM,CAAQ;IAErC,UAAU;IAIV,OAAO;IAMP,UAAU;IAMV,QAAQ;CAIT"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 6cc0106f..77b7dc07 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -39,6 +39,7 @@ export { StickyController } from "./controllers/sticky_controller"; export { TableSortController } from "./controllers/tables/table_sort_controller"; export { TableTruncateController } from "./controllers/tables/table_truncate_controller"; export { TeleportController } from "./controllers/teleport_controller"; +export { TimeoutController } from "./controllers/utility/timeout_controller"; export { ToggleClassController } from "./controllers/toggle_class_controller"; export { TurboFrameRCController } from "./controllers/turbo_frame_rc_controller"; export { TurboFrameRefreshController } from "./controllers/turbo_frame_refresh_controller"; diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index 1f47ef1b..5503ec59 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/stimulus-library.js b/dist/stimulus-library.js index 13da2322..8ee9eabb 100644 --- a/dist/stimulus-library.js +++ b/dist/stimulus-library.js @@ -1,2 +1,2 @@ -var e=require("stimulus"),t=require("lodash-es/get"),n=require("lodash-es/set"),i=require("dialog-polyfill"),r=require("camelcase");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,t}var a=s(t),l=s(n),c=s(i),u=s(r);function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}var b=function(e){function t(t){var n;return n=e.call(this,t)||this,new Proxy(m(n),{get:function(e,t){var i=Reflect.get(e,t),r=m(n);if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(e,n,i){return r.log(t.toString(),{args:i}),Reflect.apply(e,n,i)}});n.log(t.toString())}return i}})||m(n)}p(t,e);var n=t.prototype;return n.dispatch=function(e,t,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},n);i.detail.target&&(i.detail.target=e);var r=new CustomEvent(t,i);this.logEvent(t,r,e),e.dispatchEvent(r)},n.log=function(e,t){if(void 0===t&&(t={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+e,"color: #3B82F6","color: unset"),n.log(f({element:this.element},t)),n.groupEnd()}},n.logEvent=function(e,t,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+e+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},d(t,[{key:"el",get:function(){return this.element}}]),t}(e.Controller),y=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._checkAnchor(),window.addEventListener("hashchange",e._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(e){null==e||e.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},d(t,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(e){window.location.hash=e}}]),t}(b);y.values={key:String};var _=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var e=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){e._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},t}(b),E=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var e=this,t=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(e){return e.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,e.hasSelectorValue){var s=r.querySelectorAll(e.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);t.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(e._errorMessage),t.dispatch(n,"ajax:error")}).finally(function(){t.dispatch(n,"ajax:complete")})},d(t,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),t}(b);E.targets=["replace"],E.values={endpoint:String,errorMessage:String,selector:String};var w=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.addEventListener("change",e.submit)})},n.disconnect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.removeEventListener("change",e.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},t}(b);const k=(e,t)=>{const n=e[t];return"function"==typeof n?n:(...e)=>{}},C=(e,t,n)=>{let i=e;return!0===n?i=`${t.identifier}:${e}`:"string"==typeof n&&(i=`${n}:${e}`),i},T=(e,t,n)=>{const{bubbles:i,cancelable:r,composed:s}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:r,composed:s,detail:n})},V={dispatchEvent:!0,eventPrefix:!0},S=(e,t={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},V,t),r=(null==t?void 0:t.element)||e.element,s=e.disconnect.bind(e),o=new IntersectionObserver(t=>{const[s]=t;s.isIntersecting?(t=>{if(e.isVisible=!0,k(e,"appear").call(e,t),n){const n=C("appear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s):e.isVisible&&(t=>{if(e.isVisible=!1,k(e,"disappear").call(e,t),n){const n=C("disappear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s)},t),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(e,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},L={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},x={debug:!1,logger:console};class A{constructor(e,t={}){var n,i,r;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==t?void 0:t.debug)&&void 0!==n?n:e.application.stimulusUseDebug)&&void 0!==i?i:x.debug,this.logger=null!==(r=null==t?void 0:t.logger)&&void 0!==r?r:x.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class D extends A{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{k(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{k(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class I extends A{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{k(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const M=(e,t={})=>{const n=new I(e,t);return[n.observe,n.unobserve]},N=e=>{const t=t=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:t};k(e,"windowResize").call(e,r)},n=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},r=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){r(),n()}}),i(),[i,r]},O=(e,t=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>e.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,t)}};var H=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var e=this;N(this),requestAnimationFrame(function(){e._handler();var t=e.el;t.style.resize="none",t.style.boxSizing="border-box",t.addEventListener("input",e._handler),t.addEventListener("focus",e._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(e){var t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"},t}(b),R=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.inputTarget.addEventListener("input",e._updateCharCount),e._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);R.targets=["input","output"],R.values={min:Number,max:Number},R.classes=["error"];var z=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.hasSelectAllTarget&&(e.selectAllTarget.addEventListener("change",e._toggle),e.checkboxTargets.forEach(function(t){return t.addEventListener("change",e._refresh)}),e._refresh())})},n.disconnect=function(){var e=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(t){return t.removeEventListener("change",e._refresh)}))},n._toggle=function(e){e.preventDefault();var t=e.target;this.checkboxTargets.forEach(function(e){return e.checked=t.checked})},n._refresh=function(){var e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t0&&(q(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:q(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),t}(b);se.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var oe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){S(this,{threshold:this._threshold,element:this.el})},n.appear=function(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},d(t,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(e){return Number.parseFloat(e.trim())}).filter(function(e){return e>=0&&e<=1}):[0,1]}}]),t}(b);oe.values={threshold:String};var ae,le=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){if("IntersectionObserver"in window){var e=S(this,{element:this.el,threshold:.3});this.observe=e[0],this.unobserve=e[1]}else this.loadContent()},n.appear=function(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},t}(E),ce=function(e,t){var n=void 0===t?{}:t,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,a=void 0===s?"start":s,l=n.inline,c=void 0===l?"nearest":l;try{var u=function(){e.scrollIntoView({behavior:r,block:a,inline:c})},h=function(){if("smooth"==r&&!ue)return Promise.resolve(function(){try{return Promise.resolve(Promise.resolve().then(function(){return o(require("smoothscroll-polyfill"))})).then(function(e){ae||(ae=!0,(0,e.polyfill)())})}catch(e){return Promise.reject(e)}}()).then(function(){})}();return Promise.resolve(h&&h.then?h.then(u):u())}catch(e){return Promise.reject(e)}},ue="scrollBehavior"in document.documentElement.style;function he(e){if(!e)return null;var t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:he(e.parentElement)||document.body}var de=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._dialog=null,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var e=this,t=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),t.insertAdjacentElement("afterend",this._dialog),c.default.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),ce(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return e._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var e=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,ce(this.el,{behavior:"smooth",block:"end"}).catch(function(){return e.el.scrollIntoView(!1)}))},d(t,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),t}(b);de.values={src:String,srcSet:String,sizes:String},de.classes=["modal","image"];var fe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var e=this;this.inputTargets.forEach(function(t){return t.addEventListener("change",e.handleInputs)})},n.disconnect=function(){var e=this;this.inputTargets.forEach(function(t){return t.removeEventListener("change",e.handleInputs)})},n.handleInputs=function(e){var t=this.inputTargets.reduce(function(e,t){return t.checked?e+1:e},0),n=e.target;t>this.maxValue?(e.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},t}(b);fe.targets=["input","error"],fe.values={max:Number,message:String};var pe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(e){try{return null==e||e.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(e){return Promise.reject(e)}},n.pause=function(e){null==e||e.preventDefault(),this.mediaTarget.pause()},n.restart=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5},t}(b);pe.targets=["media"];var me=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){this._checkStructure()},n.add=function(e){null==e||e.preventDefault();var t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)},n.remove=function(e){e.preventDefault();var t=e.target.closest("."+this._wrapperClass);if(null==t)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";var n=t.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},d(t,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),t}(b);me.targets=["target","template"],me.values={insertMode:String,wrapperClass:String};var ve=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.addEventListener("change",e.checkPasswordsMatch)})},n.disconnect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.removeEventListener("change",e.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var e=new Set(this.passwordTargets.map(function(e){return e.value}));return e.has("")||1==e.size},n.checkPasswordsMatch=function(){var e=this,t=this.el;this._allPasswordsMatch()?(this.dispatch(t,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.remove(e.errorClass)})):(this.dispatch(t,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.add(e.errorClass)}))},t}(b);ve.targets=["password"],ve.classes=["error"];var ge=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.peak=function(e){null==e||e.preventDefault(),this.passwordTarget.type="text"},n.hide=function(e){null==e||e.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},t}(b);ge.targets=["password"];var be=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.replace=function(e){var t=e.detail[0];if(t instanceof Node){var n=t.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",t)},d(t,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),t}(b);be.targets=[],be.values={selector:String};var ye=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(e){var t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)},n.resize=function(e){this.el.style.height=e+"px"},t}(b),_e=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e,t,n;window.self!==window.top&&(N(this),t={},null===(n=(e=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(e[n]=O(e[n],null==t?void 0:t.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;e[i]=O(e[i],r||(null==t?void 0:t.wait))}}),this.postUpdate())},n.windowResize=function(e){this.postUpdate()},n.postUpdate=function(){var e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")},n.getHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},t}(b);_e.debounces=["postUpdate"];var Ee=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(e){var t,n,i,r=this;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;var s=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");e.dataset.target=(null==(n=e.dataset.target)?void 0:n.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-target")],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-action")],""==e.dataset.action&&delete e.dataset.action;var o=this.constructor.values;o&&Object.keys(o).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-value")]});var a=this.constructor.classes;a&&Object.keys(a).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-class")]})},t}(b),we=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.connect=function(){var e=this;requestAnimationFrame(function(){ce(e.el,{behavior:e.hasBehaviorValue?e.behaviorValue:"smooth",block:e.hasBlockValue?e.blockValue:"center",inline:e.hasInlineValue?e.inlineValue:"center"}).catch(function(){return e.el.scrollIntoView()}),e._cleanupSelf()})},t}(Ee);we.values={behavior:String,block:String,inline:String};var ke=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"end"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);ke.values={mode:String};var Ce=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(){var e=document.querySelector(this.selectorValue);e?ce(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return e.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},t}(b);Ce.values={selector:String,behavior:String,block:String,inline:String};var Te=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"start"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);Te.values={mode:String};var Ve=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeout=null,t}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeout=setTimeout(function(){return e.el.remove()},1e3*e.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},t}(b);Ve.values={seconds:Number};var Se=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._magicElement=null,t}p(t,e);var n=t.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var e=this,t=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===e._magicElement&&(0===n.intersectionRatio?t.classList.add(e.hasStuckClass?e.stuckClass:"stuck"):1===n.intersectionRatio&&t.classList.remove(e.hasStuckClass?e.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},d(t,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),t}(b);Se.classes=["stuck"],Se.values={mode:String};var Le=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._lastIndex=null,t._reverse=!1,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._tableHeaders.forEach(function(t){return t.addEventListener("click",e.sort)}),e.hasStartSortValue&&e._sortByColumn(e.startSortValue)})},n.disconnect=function(){var e=this;this._tableHeaders.forEach(function(t){return t.removeEventListener("click",e.sort)})},n.sort=function(e){e.preventDefault();var t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)},n._indexOfHeaderCell=function(e){return this._tableHeaders.indexOf(e)},n._sortByColumn=function(e){var t=this;this._reverse=e===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[e])?void 0:r.innerText)||"",c=(null==(s=a[e])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:t._reverse?u>0?-1:1:u}).forEach(function(e){return n.appendChild(e)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=e},d(t,[{key:"_tableHead",get:function(){var e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}},{key:"_tableHeaders",get:function(){var e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),t}(b);Le.values={startSort:Number};var xe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var e=this;M(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){e.truncate(),e.showMoreTarget.addEventListener("click",e.expand)})},n.truncate=function(e){var t=this;null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(e){var t=this;this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._hideElement(this.showMoreTarget)},n.mutate=function(e){this._truncated&&this._reTruncate()},n._showElement=function(e){e.style.display=""},n._hideElement=function(e){e.style.display="none"},n._reTruncate=function(){var e=this;this._tableRows.slice(0,this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)},d(t,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(e){this.truncatedValue=e}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),t}(b);xe.targets=["showMore"],xe.values={limit:Number,truncated:Boolean};var Ae=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){e.hasImmediateValue&&e.immediateValue&&e.execute()})},n.execute=function(e){null==e||e.preventDefault();var t=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}else this.dispatch(t,"teleport:error")},t}(Ee);Ae.values={target:String,insert:String,immediate:Boolean};var De=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new D(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},L,t),o=r=>{const o=(null==t?void 0:t.element)||e.element;if(!(o.contains(r.target)||!function(e){const t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=n&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(o)&&n)&&(e.clickOutside&&e.clickOutside(r),i)){const t=C("click:outside",e,s),n=T(t,r,{controller:e});o.dispatchEvent(n)}},a=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==r||r.forEach(e=>{window.removeEventListener(e,o,!1)}),a()}}),null==r||r.forEach(e=>{window.addEventListener(e,o,!1)})})(this),requestAnimationFrame(function(){e.hasInitialValue&&e.toggleTargets.forEach("on"===e.initialValue?function(t){return e._elementOn(t)}:function(t){return e._elementOff(t)})})},n.clickOutside=function(){var e=this;this.toggleTargets.forEach(function(t){e._elementWasToggled(t)&&(e._elementToggleStatus(t),e._elementToggle(t))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOn(e)})},n.off=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOff(e)})},n.toggle=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementToggle(e)})},n._elementWasToggled=function(e){return"true"==e.dataset.toggled},n._elementToggleStatus=function(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"},n._elementToggle=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t)})},n._elementOn=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!0)})},n._elementOff=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!1)})},t}(b);function Ie(e){return"TURBO-FRAME"==e.nodeName}De.targets=["toggle"],De.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var Me=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.toggle=function(e){null==e||e.preventDefault();var t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(e){null==e||e.preventDefault(),this._setSrc()},n.clear=function(e){null==e||e.preventDefault(),this._clear()},n._setSrc=function(){var e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()},n._clear=function(){var e=this._getFrame();e.src="",e.innerHTML=""},n._getFrame=function(){var e=document.getElementById(""+this.frameIdValue);if(null==e)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(Ie(e))return e;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var e=this.el;if(this.hasSrcValue)return this.srcValue;if(B(e))return e.href;throw new Error("No link given to drive frame to")},t}(b);Me.values={frameId:String,src:String,loadingMessage:String};var Ne=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var e=this,t=this.el;if(!Ie(t))throw new Error("Expected controller to be mounted on a element.");if(t.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return e._timeoutHandle=setTimeout(function(){return e.refresh()},e.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(e){null==e||e.preventDefault();var t=this.el;t.src=t.src},d(t,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),t}(b);Ne.values={interval:Number,poll:Boolean};var Oe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var e=0,t=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(e=t&&t.length||0).toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);Oe.targets=["input","output"],Oe.values={min:Number,max:Number},Oe.classes=["error"],exports.AnchorSpyController=y,exports.AppearanceController=_,exports.AsyncBlockController=E,exports.AutoSubmitFormController=w,exports.AutosizeController=H,exports.CharCountController=R,exports.CheckboxSelectAllController=z,exports.ClipboardController=F,exports.ConfirmController=U,exports.ConfirmNavigationController=J,exports.DebugController=Y,exports.DetectDirtyController=G,exports.DetectDirtyFormController=K,exports.DisableInputsController=Q,exports.DisableWithController=X,exports.DismissableController=Z,exports.ElementSaveController=ee,exports.EmptyDomController=te,exports.EnableInputsController=ne,exports.FallbackImageController=ie,exports.FormRcController=re,exports.FormSaveController=se,exports.IntersectionController=oe,exports.LazyBlockController=le,exports.LightboxImageController=de,exports.LimitedSelectionCheckboxesController=fe,exports.MediaPlayerController=pe,exports.NestedFormController=me,exports.PasswordConfirmController=ve,exports.PasswordPeekController=ge,exports.RemoteFormController=be,exports.ResponsiveIframeBodyController=_e,exports.ResponsiveIframeWrapperController=ye,exports.ScrollIntoFocusController=we,exports.ScrollToBottomController=ke,exports.ScrollToController=Ce,exports.ScrollToTopController=Te,exports.SelfDestructController=Ve,exports.StickyController=Se,exports.TableSortController=Le,exports.TableTruncateController=xe,exports.TeleportController=Ae,exports.ToggleClassController=De,exports.TurboFrameRCController=Me,exports.TurboFrameRefreshController=Ne,exports.WordCountController=Oe; +var e=require("stimulus"),t=require("lodash-es/get"),n=require("lodash-es/set"),i=require("dialog-polyfill"),r=require("camelcase");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,t}var a=s(t),l=s(n),c=s(i),u=s(r);function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}var b=function(e){function t(t){var n;return n=e.call(this,t)||this,new Proxy(m(n),{get:function(e,t){var i=Reflect.get(e,t),r=m(n);if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(e,n,i){return r.log(t.toString(),{args:i}),Reflect.apply(e,n,i)}});n.log(t.toString())}return i}})||m(n)}p(t,e);var n=t.prototype;return n.dispatch=function(e,t,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},n);i.detail.target&&(i.detail.target=e);var r=new CustomEvent(t,i);this.logEvent(t,r,e),e.dispatchEvent(r)},n.log=function(e,t){if(void 0===t&&(t={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+e,"color: #3B82F6","color: unset"),n.log(f({element:this.element},t)),n.groupEnd()}},n.logEvent=function(e,t,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+e+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},d(t,[{key:"el",get:function(){return this.element}}]),t}(e.Controller),y=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._checkAnchor(),window.addEventListener("hashchange",e._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(e){null==e||e.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},d(t,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(e){window.location.hash=e}}]),t}(b);y.values={key:String};var _=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var e=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){e._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},t}(b),E=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var e=this,t=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(e){return e.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,e.hasSelectorValue){var s=r.querySelectorAll(e.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);t.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(e._errorMessage),t.dispatch(n,"ajax:error")}).finally(function(){t.dispatch(n,"ajax:complete")})},d(t,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),t}(b);E.targets=["replace"],E.values={endpoint:String,errorMessage:String,selector:String};var w=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.addEventListener("change",e.submit)})},n.disconnect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.removeEventListener("change",e.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},t}(b);const k=(e,t)=>{const n=e[t];return"function"==typeof n?n:(...e)=>{}},C=(e,t,n)=>{let i=e;return!0===n?i=`${t.identifier}:${e}`:"string"==typeof n&&(i=`${n}:${e}`),i},T=(e,t,n)=>{const{bubbles:i,cancelable:r,composed:s}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:r,composed:s,detail:n})},V={dispatchEvent:!0,eventPrefix:!0},S=(e,t={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},V,t),r=(null==t?void 0:t.element)||e.element,s=e.disconnect.bind(e),o=new IntersectionObserver(t=>{const[s]=t;s.isIntersecting?(t=>{if(e.isVisible=!0,k(e,"appear").call(e,t),n){const n=C("appear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s):e.isVisible&&(t=>{if(e.isVisible=!1,k(e,"disappear").call(e,t),n){const n=C("disappear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s)},t),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(e,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},L={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},x={debug:!1,logger:console};class A{constructor(e,t={}){var n,i,r;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==t?void 0:t.debug)&&void 0!==n?n:e.application.stimulusUseDebug)&&void 0!==i?i:x.debug,this.logger=null!==(r=null==t?void 0:t.logger)&&void 0!==r?r:x.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class D extends A{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{k(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{k(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class I extends A{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{k(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const M=(e,t={})=>{const n=new I(e,t);return[n.observe,n.unobserve]},N=e=>{const t=t=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:t};k(e,"windowResize").call(e,r)},n=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},r=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){r(),n()}}),i(),[i,r]},O=(e,t=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>e.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,t)}};var H=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var e=this;N(this),requestAnimationFrame(function(){e._handler();var t=e.el;t.style.resize="none",t.style.boxSizing="border-box",t.addEventListener("input",e._handler),t.addEventListener("focus",e._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(e){var t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"},t}(b),z=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.inputTarget.addEventListener("input",e._updateCharCount),e._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);z.targets=["input","output"],z.values={min:Number,max:Number},z.classes=["error"];var F=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.hasSelectAllTarget&&(e.selectAllTarget.addEventListener("change",e._toggle),e.checkboxTargets.forEach(function(t){return t.addEventListener("change",e._refresh)}),e._refresh())})},n.disconnect=function(){var e=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(t){return t.removeEventListener("change",e._refresh)}))},n._toggle=function(e){e.preventDefault();var t=e.target;this.checkboxTargets.forEach(function(e){return e.checked=t.checked})},n._refresh=function(){var e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t0&&(j(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:j(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),t}(b);se.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var oe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){S(this,{threshold:this._threshold,element:this.el})},n.appear=function(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},d(t,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(e){return Number.parseFloat(e.trim())}).filter(function(e){return e>=0&&e<=1}):[0,1]}}]),t}(b);oe.values={threshold:String};var ae,le=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){if("IntersectionObserver"in window){var e=S(this,{element:this.el,threshold:.3});this.observe=e[0],this.unobserve=e[1]}else this.loadContent()},n.appear=function(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},t}(E),ce=function(e,t){var n=void 0===t?{}:t,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,a=void 0===s?"start":s,l=n.inline,c=void 0===l?"nearest":l;try{var u=function(){e.scrollIntoView({behavior:r,block:a,inline:c})},h=function(){if("smooth"==r&&!ue)return Promise.resolve(function(){try{return Promise.resolve(Promise.resolve().then(function(){return o(require("smoothscroll-polyfill"))})).then(function(e){ae||(ae=!0,(0,e.polyfill)())})}catch(e){return Promise.reject(e)}}()).then(function(){})}();return Promise.resolve(h&&h.then?h.then(u):u())}catch(e){return Promise.reject(e)}},ue="scrollBehavior"in document.documentElement.style;function he(e){if(!e)return null;var t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:he(e.parentElement)||document.body}var de=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._dialog=null,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var e=this,t=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),t.insertAdjacentElement("afterend",this._dialog),c.default.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),ce(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return e._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var e=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,ce(this.el,{behavior:"smooth",block:"end"}).catch(function(){return e.el.scrollIntoView(!1)}))},d(t,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),t}(b);de.values={src:String,srcSet:String,sizes:String},de.classes=["modal","image"];var fe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var e=this;this.inputTargets.forEach(function(t){return t.addEventListener("change",e.handleInputs)})},n.disconnect=function(){var e=this;this.inputTargets.forEach(function(t){return t.removeEventListener("change",e.handleInputs)})},n.handleInputs=function(e){var t=this.inputTargets.reduce(function(e,t){return t.checked?e+1:e},0),n=e.target;t>this.maxValue?(e.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},t}(b);fe.targets=["input","error"],fe.values={max:Number,message:String};var pe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(e){try{return null==e||e.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(e){return Promise.reject(e)}},n.pause=function(e){null==e||e.preventDefault(),this.mediaTarget.pause()},n.restart=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5},t}(b);pe.targets=["media"];var me=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){this._checkStructure()},n.add=function(e){null==e||e.preventDefault();var t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)},n.remove=function(e){e.preventDefault();var t=e.target.closest("."+this._wrapperClass);if(null==t)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";var n=t.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},d(t,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),t}(b);me.targets=["target","template"],me.values={insertMode:String,wrapperClass:String};var ve=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.addEventListener("change",e.checkPasswordsMatch)})},n.disconnect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.removeEventListener("change",e.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var e=new Set(this.passwordTargets.map(function(e){return e.value}));return e.has("")||1==e.size},n.checkPasswordsMatch=function(){var e=this,t=this.el;this._allPasswordsMatch()?(this.dispatch(t,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.remove(e.errorClass)})):(this.dispatch(t,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.add(e.errorClass)}))},t}(b);ve.targets=["password"],ve.classes=["error"];var ge=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.peak=function(e){null==e||e.preventDefault(),this.passwordTarget.type="text"},n.hide=function(e){null==e||e.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},t}(b);ge.targets=["password"];var be=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.replace=function(e){var t=e.detail[0];if(t instanceof Node){var n=t.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",t)},d(t,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),t}(b);be.targets=[],be.values={selector:String};var ye=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(e){var t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)},n.resize=function(e){this.el.style.height=e+"px"},t}(b),_e=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e,t,n;window.self!==window.top&&(N(this),t={},null===(n=(e=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(e[n]=O(e[n],null==t?void 0:t.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;e[i]=O(e[i],r||(null==t?void 0:t.wait))}}),this.postUpdate())},n.windowResize=function(e){this.postUpdate()},n.postUpdate=function(){var e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")},n.getHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},t}(b);_e.debounces=["postUpdate"];var Ee=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(e){var t,n,i,r=this;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;var s=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");e.dataset.target=(null==(n=e.dataset.target)?void 0:n.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-target")],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-action")],""==e.dataset.action&&delete e.dataset.action;var o=this.constructor.values;o&&Object.keys(o).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-value")]});var a=this.constructor.classes;a&&Object.keys(a).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-class")]})},t}(b),we=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.connect=function(){var e=this;requestAnimationFrame(function(){ce(e.el,{behavior:e.hasBehaviorValue?e.behaviorValue:"smooth",block:e.hasBlockValue?e.blockValue:"center",inline:e.hasInlineValue?e.inlineValue:"center"}).catch(function(){return e.el.scrollIntoView()}),e._cleanupSelf()})},t}(Ee);we.values={behavior:String,block:String,inline:String};var ke=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"end"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);ke.values={mode:String};var Ce=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(){var e=document.querySelector(this.selectorValue);e?ce(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return e.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},t}(b);Ce.values={selector:String,behavior:String,block:String,inline:String};var Te=function(e){function t(){return e.apply(this,arguments)||this}return p(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"start"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);Te.values={mode:String};var Ve=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeout=null,t}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeout=setTimeout(function(){return e.el.remove()},1e3*e.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},t}(b);Ve.values={seconds:Number};var Se=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._magicElement=null,t}p(t,e);var n=t.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var e=this,t=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===e._magicElement&&(0===n.intersectionRatio?t.classList.add(e.hasStuckClass?e.stuckClass:"stuck"):1===n.intersectionRatio&&t.classList.remove(e.hasStuckClass?e.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},d(t,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),t}(b);Se.classes=["stuck"],Se.values={mode:String};var Le=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._lastIndex=null,t._reverse=!1,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._tableHeaders.forEach(function(t){return t.addEventListener("click",e.sort)}),e.hasStartSortValue&&e._sortByColumn(e.startSortValue)})},n.disconnect=function(){var e=this;this._tableHeaders.forEach(function(t){return t.removeEventListener("click",e.sort)})},n.sort=function(e){e.preventDefault();var t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)},n._indexOfHeaderCell=function(e){return this._tableHeaders.indexOf(e)},n._sortByColumn=function(e){var t=this;this._reverse=e===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[e])?void 0:r.innerText)||"",c=(null==(s=a[e])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:t._reverse?u>0?-1:1:u}).forEach(function(e){return n.appendChild(e)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=e},d(t,[{key:"_tableHead",get:function(){var e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}},{key:"_tableHeaders",get:function(){var e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),t}(b);Le.values={startSort:Number};var xe=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var e=this;M(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){e.truncate(),e.showMoreTarget.addEventListener("click",e.expand)})},n.truncate=function(e){var t=this;null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(e){var t=this;this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._hideElement(this.showMoreTarget)},n.mutate=function(e){this._truncated&&this._reTruncate()},n._showElement=function(e){e.style.display=""},n._hideElement=function(e){e.style.display="none"},n._reTruncate=function(){var e=this;this._tableRows.slice(0,this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)},d(t,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(e){this.truncatedValue=e}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),t}(b);xe.targets=["showMore"],xe.values={limit:Number,truncated:Boolean};var Ae=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){e.hasImmediateValue&&e.immediateValue&&e.execute()})},n.execute=function(e){null==e||e.preventDefault();var t=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}else this.dispatch(t,"teleport:error")},t}(Ee);Ae.values={target:String,insert:String,immediate:Boolean};var De=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}p(t,e);var n=t.prototype;return n.initialize=function(){this._timeout=this._timeout.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeoutHandle=window.setTimeout(e._timeout,1e3*e.secondsValue)})},n.disconnect=function(){this._timeoutHandle&&window.clearTimeout(this._timeoutHandle)},n._timeout=function(){this.dispatch(this.el,"timeout")},t}(b);De.values={seconds:Number};var Ie=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new D(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},L,t),o=r=>{const o=(null==t?void 0:t.element)||e.element;if(!(o.contains(r.target)||!function(e){const t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=n&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(o)&&n)&&(e.clickOutside&&e.clickOutside(r),i)){const t=C("click:outside",e,s),n=T(t,r,{controller:e});o.dispatchEvent(n)}},a=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==r||r.forEach(e=>{window.removeEventListener(e,o,!1)}),a()}}),null==r||r.forEach(e=>{window.addEventListener(e,o,!1)})})(this),requestAnimationFrame(function(){e.hasInitialValue&&e.toggleTargets.forEach("on"===e.initialValue?function(t){return e._elementOn(t)}:function(t){return e._elementOff(t)})})},n.clickOutside=function(){var e=this;this.toggleTargets.forEach(function(t){e._elementWasToggled(t)&&(e._elementToggleStatus(t),e._elementToggle(t))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOn(e)})},n.off=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOff(e)})},n.toggle=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementToggle(e)})},n._elementWasToggled=function(e){return"true"==e.dataset.toggled},n._elementToggleStatus=function(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"},n._elementToggle=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t)})},n._elementOn=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!0)})},n._elementOff=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!1)})},t}(b);function Me(e){return"TURBO-FRAME"==e.nodeName}Ie.targets=["toggle"],Ie.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var Ne=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.toggle=function(e){null==e||e.preventDefault();var t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(e){null==e||e.preventDefault(),this._setSrc()},n.clear=function(e){null==e||e.preventDefault(),this._clear()},n._setSrc=function(){var e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()},n._clear=function(){var e=this._getFrame();e.src="",e.innerHTML=""},n._getFrame=function(){var e=document.getElementById(""+this.frameIdValue);if(null==e)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(Me(e))return e;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var e=this.el;if(this.hasSrcValue)return this.srcValue;if(B(e))return e.href;throw new Error("No link given to drive frame to")},t}(b);Ne.values={frameId:String,src:String,loadingMessage:String};var Oe=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}p(t,e);var n=t.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var e=this,t=this.el;if(!Me(t))throw new Error("Expected controller to be mounted on a element.");if(t.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return e._timeoutHandle=setTimeout(function(){return e.refresh()},e.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(e){null==e||e.preventDefault();var t=this.el;t.src=t.src},d(t,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),t}(b);Oe.values={interval:Number,poll:Boolean};var He=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var e=0,t=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(e=t&&t.length||0).toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);He.targets=["input","output"],He.values={min:Number,max:Number},He.classes=["error"],exports.AnchorSpyController=y,exports.AppearanceController=_,exports.AsyncBlockController=E,exports.AutoSubmitFormController=w,exports.AutosizeController=H,exports.CharCountController=z,exports.CheckboxSelectAllController=F,exports.ClipboardController=R,exports.ConfirmController=U,exports.ConfirmNavigationController=J,exports.DebugController=Y,exports.DetectDirtyController=G,exports.DetectDirtyFormController=K,exports.DisableInputsController=Q,exports.DisableWithController=X,exports.DismissableController=Z,exports.ElementSaveController=ee,exports.EmptyDomController=te,exports.EnableInputsController=ne,exports.FallbackImageController=ie,exports.FormRcController=re,exports.FormSaveController=se,exports.IntersectionController=oe,exports.LazyBlockController=le,exports.LightboxImageController=de,exports.LimitedSelectionCheckboxesController=fe,exports.MediaPlayerController=pe,exports.NestedFormController=me,exports.PasswordConfirmController=ve,exports.PasswordPeekController=ge,exports.RemoteFormController=be,exports.ResponsiveIframeBodyController=_e,exports.ResponsiveIframeWrapperController=ye,exports.ScrollIntoFocusController=we,exports.ScrollToBottomController=ke,exports.ScrollToController=Ce,exports.ScrollToTopController=Te,exports.SelfDestructController=Ve,exports.StickyController=Se,exports.TableSortController=Le,exports.TableTruncateController=xe,exports.TeleportController=Ae,exports.TimeoutController=De,exports.ToggleClassController=Ie,exports.TurboFrameRCController=Ne,exports.TurboFrameRefreshController=Oe,exports.WordCountController=He; //# sourceMappingURL=stimulus-library.js.map diff --git a/dist/stimulus-library.js.map b/dist/stimulus-library.js.map index 6e6fd277..b34e6dd8 100644 --- a/dist/stimulus-library.js.map +++ b/dist/stimulus-library.js.map @@ -1 +1 @@ -{"version":3,"file":"stimulus-library.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","LazyBlockController","smoothPolyfilled","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","Promise","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"stimulus-library.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TimeoutController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeoutHandle: null | number = null;\r\n\r\n initialize() {\r\n this._timeout = this._timeout.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._timeoutHandle = window.setTimeout(this._timeout, this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeoutHandle) {\r\n window.clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n\r\n _timeout() {\r\n this.dispatch(this.el, \"timeout\");\r\n }\r\n\r\n}","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","LazyBlockController","smoothPolyfilled","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","Promise","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","TimeoutController","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file diff --git a/dist/stimulus-library.modern.js b/dist/stimulus-library.modern.js index cf329c31..854f4b3c 100644 --- a/dist/stimulus-library.modern.js +++ b/dist/stimulus-library.modern.js @@ -1,2 +1,2 @@ -import{Controller as e}from"stimulus";import t from"lodash-es/get";import s from"lodash-es/set";import i from"dialog-polyfill";import a from"camelcase";function r(){return(r=Object.assign||function(e){for(var t=1;t{let s=Reflect.get(e,t),i=this;if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof s)return new Proxy(s,{apply:(e,s,a)=>(i.log(t.toString(),{args:a}),Reflect.apply(e,s,a))});this.log(t.toString())}return s}})}get el(){return this.element}dispatch(e,t,s={}){let i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},s);i.detail.target&&(i.detail.target=e);let a=new CustomEvent(t,i);this.logEvent(t,a,e),e.dispatchEvent(a)}log(e,t={}){if(!this.application.debug)return;let s=console;s.groupCollapsed(`%c${this.identifier} %c#${e}`,"color: #3B82F6","color: unset"),s.log(r({element:this.element},t)),s.groupEnd()}logEvent(e,t,s){if(!this.application.debug)return;let i=console;i.groupCollapsed(`%c${this.identifier} %c${e}%c`,"color: #3B82F6","color: #0be000","color: unset"),i.log({element:s}),i.groupEnd()}}class l extends n{get _key(){return this.keyValue.replaceAll("#","")}get _anchor(){return window.location.hash.substr(1)}set _anchor(e){window.location.hash=e}initialize(){this._checkAnchor=this._checkAnchor.bind(this)}connect(){requestAnimationFrame(()=>{this._checkAnchor(),window.addEventListener("hashchange",this._checkAnchor)})}disconnect(){window.removeEventListener("hashchange",this._checkAnchor)}write(e){null==e||e.preventDefault(),this._anchor=this._key}_checkAnchor(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")}}l.values={key:String};class o extends n{initialize(){this._handleVisibility=this._handleVisibility.bind(this)}connect(){window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(()=>{this._handleVisibility()})}disconnect(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)}appear(){this.dispatch(this.el,"appearance:appear")}away(){this.dispatch(this.el,"appearance:away")}_handleVisibility(){this._documentIsActive()?this.appear():this.away()}_documentIsActive(){return"visible"==document.visibilityState&&document.hasFocus()}}class h extends n{get _errorMessage(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}connect(){this.loadContent()}loadContent(){let e=this,t=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(e=>e.text()).then(s=>{let i=document.createElement("div");if(i.innerHTML=s,this.hasSelectorValue){let e=i.querySelectorAll(this.selectorValue);t.replaceWith(...e)}else t.replaceWith(...i.children);e.dispatch(t,"ajax:success")}).catch(s=>{t.replaceWith(this._errorMessage),e.dispatch(t,"ajax:error")}).finally(()=>{e.dispatch(t,"ajax:complete")})}}h.targets=["replace"],h.values={endpoint:String,errorMessage:String,selector:String};class c extends n{initialize(){this.submit=this.submit.bind(this)}connect(){this.el.querySelectorAll("input, select, textarea").forEach(e=>e.addEventListener("change",this.submit))}disconnect(){this.el.querySelectorAll("input, select, textarea").forEach(e=>e.removeEventListener("change",this.submit))}submit(){this.dispatch(this.el,"submit")}}const d=(e,t)=>{const s=e[t];return"function"==typeof s?s:(...e)=>{}},u=(e,t,s)=>{let i=e;return!0===s?i=`${t.identifier}:${e}`:"string"==typeof s&&(i=`${s}:${e}`),i},m=(e,t,s)=>{const{bubbles:i,cancelable:a,composed:r}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(s,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:a,composed:r,detail:s})},g={dispatchEvent:!0,eventPrefix:!0},p=(e,t={})=>{const{dispatchEvent:s,eventPrefix:i}=Object.assign({},g,t),a=(null==t?void 0:t.element)||e.element,r=e.disconnect.bind(e),n=new IntersectionObserver(t=>{const[r]=t;r.isIntersecting?(t=>{if(e.isVisible=!0,d(e,"appear").call(e,t),s){const s=u("appear",e,i),r=m(s,null,{controller:e,entry:t});a.dispatchEvent(r)}})(r):e.isVisible&&(t=>{if(e.isVisible=!1,d(e,"disappear").call(e,t),s){const s=u("disappear",e,i),r=m(s,null,{controller:e,entry:t});a.dispatchEvent(r)}})(r)},t),l=()=>{n.observe(a)},o=()=>{n.unobserve(a)};return Object.assign(e,{isVisible:!1,disconnect(){o(),r()}}),l(),[l,o]},v={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},f={debug:!1,logger:console};class _{constructor(e,t={}){var s,i,a;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(s=null==t?void 0:t.debug)&&void 0!==s?s:e.application.stimulusUseDebug)&&void 0!==i?i:f.debug,this.logger=null!==(a=null==t?void 0:t.logger)&&void 0!==a?a:f.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class b extends _{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{d(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{d(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class E extends _{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{d(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const w=(e,t={})=>{const s=new E(e,t);return[s.observe,s.unobserve]},y=e=>{const t=t=>{const{innerWidth:s,innerHeight:i}=window,a={height:i||Infinity,width:s||Infinity,event:t};d(e,"windowResize").call(e,a)},s=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},a=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){a(),s()}}),i(),[i,a]},V=(e,t=200)=>{let s=null;return function(){const i=arguments,a=this,r=()=>e.apply(a,i);s&&clearTimeout(s),s=setTimeout(r,t)}};class T extends n{initialize(){this._handler=this._handler.bind(this)}connect(){y(this),requestAnimationFrame(()=>{this._handler();let e=this.el;e.style.resize="none",e.style.boxSizing="border-box",e.addEventListener("input",this._handler),e.addEventListener("focus",this._handler)})}disconnect(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)}windowResize(){this._handler()}_handler(){this.autosize(this.el)}autosize(e){let t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"}}class L extends n{initialize(){this._updateCharCount=this._updateCharCount.bind(this)}connect(){requestAnimationFrame(()=>{this.inputTarget.addEventListener("input",this._updateCharCount),this._updateCharCount()})}disconnect(){this.inputTarget.removeEventListener("input",this._updateCharCount)}_updateCharCount(){let e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))}_isValidCount(e){let t=0,s=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(s=this.maxValue),e>=t&&e<=s}}L.targets=["input","output"],L.values={min:Number,max:Number},L.classes=["error"];class k extends n{get _checked(){return this.checkboxTargets.filter(e=>e.checked)}get _unchecked(){return this.checkboxTargets.filter(e=>!e.checked)}initialize(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)}connect(){requestAnimationFrame(()=>{this.hasSelectAllTarget&&(this.selectAllTarget.addEventListener("change",this._toggle),this.checkboxTargets.forEach(e=>e.addEventListener("change",this._refresh)),this._refresh())})}disconnect(){this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(e=>e.removeEventListener("change",this._refresh)))}_toggle(e){e.preventDefault();let t=e.target;this.checkboxTargets.forEach(e=>e.checked=t.checked)}_refresh(){const e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t{let e=this.el;if(x(e))e.addEventListener("submit",this.confirm);else{if(!C(e))throw new Error("Can't handle confirmation on attached element");e.addEventListener("click",this.confirm)}})}disconnect(){let e=this.el;x(e)?e.removeEventListener("submit",this.confirm):C(e)&&e.removeEventListener("click",this.confirm)}confirm(e){window.confirm(this._message)||(e.preventDefault(),this.dispatch(this.el,"confirm:cancelled"))}}N.values={message:String};class O extends n{get _message(){return this.hasMessageValue?this._messageValue:"Do you want to leave this page? Changes you made may not be saved"}initialize(){this.allowSubmit=this.allowSubmit.bind(this),this.confirmNavigation=this.confirmNavigation.bind(this),this.confirmTurboNavigation=this.confirmTurboNavigation.bind(this)}connect(){window.onbeforeunload=()=>this._message,window.addEventListener("popstate",this.confirmNavigation),window.addEventListener("submit",this.allowSubmit),window.addEventListener("turbolinks:before-visit",this.confirmTurboNavigation),window.addEventListener("turbo:before-visit",this.confirmTurboNavigation)}disconnect(){window.removeEventListener("popstate",this.confirmNavigation),window.onbeforeunload=null,window.removeEventListener("submit",this.allowSubmit),window.removeEventListener("turbolinks:before-visit",this.confirmTurboNavigation),window.removeEventListener("turbo:before-visit",this.confirmTurboNavigation)}allowSubmit(e){window.removeEventListener("popstate",this.confirmNavigation),window.onbeforeunload=null}confirmNavigation(e){return!1}confirmTurboNavigation(e){confirm(this._message)||e.preventDefault()}}O.values={_message:String};class H extends n{connect(){console.log("Debug Controller",this,this.testTargets)}}H.targets=["test"];class z extends n{get _cacheAttrName(){return"detect-dirty-load-value"}initialize(){this._checkDirty=this._checkDirty.bind(this)}connect(){let e=this.el;this._cacheLoadValues(),this._checkDirty(),e.addEventListener("input",this._checkDirty),e.addEventListener("change",this._checkDirty)}disconnect(){let e=this.el;e.removeEventListener("input",this._checkDirty),e.removeEventListener("change",this._checkDirty)}restore(e){null==e||e.preventDefault(),this._restoreElementFromLoadValue()}_getElementValue(){let e=this.el;return M(e)?e.checked:e.value}_getElementLoadValue(){let e=this.el,t=e.getAttribute(this._cacheAttrName);return M(e)?null==t?e.defaultChecked:"true"==t:(null!==t||I(e)&&Array.from(e.options).forEach(t=>{if(t.defaultSelected)return e.value=t.value,t.value}),t)}_elementHasCachedLoadValue(){return this.el.hasAttribute(this._cacheAttrName)}_checkDirty(){let e=this.el;this._isElementDirty()?e.setAttribute("data-dirty","true"):e.removeAttribute("data-dirty")}_isElementDirty(){return this._getElementValue()!==this._getElementLoadValue()}_restoreElementFromLoadValue(){let e=this.el,t=e.getAttribute(this._cacheAttrName);M(e)?(e.setAttribute(this._cacheAttrName,e.checked.toString()),e.checked=null==t?e.defaultChecked:"true"==t):I(e)?null==t?Array.from(e.options).forEach(t=>{t.defaultSelected&&(e.value=t.value)}):e.value=t:e.value=null==t?e.defaultValue:t}_cacheLoadValues(){let e=this.el;!this._elementHasCachedLoadValue()&&M(e)?e.setAttribute(this._cacheAttrName,e.checked.toString()):e.setAttribute(this._cacheAttrName,e.value.toString())}}class $ extends n{get _formElements(){return Array.from(this.el.querySelectorAll("input, select, textarea"))}get _cacheAttrName(){return"detect-dirty-load-value"}initialize(){this._checkDirty=this._checkDirty.bind(this)}connect(){let e=this.el;this._cacheLoadValues(),this._checkDirty(),e.addEventListener("input",this._checkDirty),e.addEventListener("change",this._checkDirty)}disconnect(){let e=this.el;e.removeEventListener("input",this._checkDirty),e.removeEventListener("change",this._checkDirty)}restore(e){null==e||e.preventDefault(),this._formElements.forEach(e=>this._restoreElementFromLoadValue(e))}_getElementValue(e){return M(e)?e.checked:e.value}_getElementLoadValue(e){let t=e.getAttribute(this._cacheAttrName);return M(e)?null==t?e.defaultChecked:"true"==t:(null!==t||I(e)&&Array.from(e.options).forEach(t=>{if(t.defaultSelected)return e.value=t.value,t.value}),t)}_elementHasCachedLoadValue(e){return e.hasAttribute(this._cacheAttrName)}_checkElementDirty(e){this._isElementDirty(e)?e.setAttribute("data-dirty","true"):e.removeAttribute("data-dirty")}_isElementDirty(e){return this._getElementValue(e)!==this._getElementLoadValue(e)}_cacheElementLoadValue(e){!this._elementHasCachedLoadValue(e)&&M(e)?e.setAttribute(this._cacheAttrName,e.checked.toString()):e.setAttribute(this._cacheAttrName,e.value.toString())}_restoreElementFromLoadValue(e){let t=e.getAttribute(this._cacheAttrName);M(e)?(e.setAttribute(this._cacheAttrName,e.checked.toString()),e.checked=null==t?e.defaultChecked:"true"==t):I(e)?null==t?Array.from(e.options).forEach(t=>{t.defaultSelected&&(e.value=t.value)}):e.value=t:e.value=null==t?e.defaultValue:t}_cacheLoadValues(){this._formElements.forEach(e=>this._cacheElementLoadValue(e))}_checkDirty(){this._formElements.forEach(e=>this._checkElementDirty(e)),this._formElements.some(e=>e.hasAttribute("data-dirty"))?this.el.setAttribute("data-dirty","true"):this.el.removeAttribute("data-dirty")}}class R extends n{connect(){this.toggle()}toggle(){this.hasDisablerTarget&&this.disablerTarget.checked?this.disableInputs():this.enableInputs()}disableInputs(){let e=this.hasClearValue&&this.clearValue;this.disableTargets.forEach((t,s)=>{e&&(t.value=""),t.disabled=!0})}enableInputs(){this.disableTargets.forEach((e,t)=>{e.disabled=!1})}}R.targets=["disabler","disable"],R.values={clear:Boolean};class B extends n{get _message(){return this.hasMessageValue?this.messageValue:"Submitting..."}get _timeout(){return this.hasTimeoutValue?this.timeoutValue:1e3}initialize(){this.enable=this.enable.bind(this),this.disable=this.disable.bind(this)}connect(){requestAnimationFrame(()=>{this.el.addEventListener("click",this.disable)})}disconnect(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}disable(e){let t=this.el;this._isDisabled(t)?(null==e||e.preventDefault(),null==e||e.stopImmediatePropagation()):(this._cacheText=this._getElText(t),this._setElText(t,this._message),this._disable(t),setTimeout(this.enable,this._timeout))}enable(e){null==e||e.preventDefault();let t=this.el;this._isDisabled(t)&&(this._setElText(t,this._cacheText),this._enable(t))}_isDisabled(e){return A(e)&&"submit"==e.type||D(e)?e.disabled:"true"==e.dataset.disabled}_getElText(e){return A(e)&&"submit"==e.type?e.value:e.innerText}_setElText(e,t){A(e)&&"submit"==e.type?e.value=t:(D(e)||C(e))&&(e.innerText=t)}_disable(e){A(e)&&"submit"==e.type||D(e)?e.disabled=!0:e.dataset.disabled="true"}_enable(e){A(e)&&"submit"==e.type||D(e)?e.disabled=!1:e.dataset.disabled=void 0}}B.values={message:String,timeout:Number};class F extends n{dismiss(){this.el.remove()}}class q extends n{get _id(){if(this.hasIdValue)return this.idValue;let e=this.el.id;if(""!==e)return e;throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `)}get _uniqueIdentifier(){return`${location.href} ${this._id}`}get _restoreOnLoad(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}get _element(){return this.hasElementTarget?this.elementTarget:this.el}connect(){requestAnimationFrame(()=>{this._restoreOnLoad&&this.restore()})}clear(e){e&&e.preventDefault(),localStorage.removeItem(this._uniqueIdentifier),this.dispatch(this._element,"element-save:cleared")}save(e){e&&e.preventDefault();let s=this._element,i=this.attributesValue.split(" "),a={};i.forEach(e=>a[e]=t(s,e)),localStorage.setItem(this._uniqueIdentifier,JSON.stringify(a)),this.dispatch(s,"element-save:save:success")}restore(e){e&&e.preventDefault();let t=this._element;if(localStorage.getItem(this._uniqueIdentifier)){const e=JSON.parse(localStorage.getItem(this._uniqueIdentifier));Object.keys(e).forEach(i=>{s(t,i,e[i])}),this.dispatch(t,"element-save:restore:success")}else this.dispatch(t,"element-save:restore:empty")}}q.targets=["element"],q.values={id:String,attributes:String,restoreOnLoad:Boolean};class j extends n{get emptyClasses(){return this.emptyClass.split(" ")}get notEmptyClasses(){return this.notEmptyClass.split(" ")}get _children(){let e=this.el;return Array.from(this.hasScopeSelectorValue?e.querySelectorAll(this.scopeSelectorValue):e.children)}connect(){w(this,{element:this.el,childList:!0}),this.checkEmpty()}mutate(e){this.checkEmpty()}checkEmpty(){let e=this.el,t=this._children;0===t.length?(this._removeNotEmptyClasses(),this._addEmptyClasses(),this.dispatch(e,"dom:empty")):(this._addNotEmptyClasses(),this._removeEmptyClasses(),this.dispatch(e,"dom:not-empty",{detail:{count:t.length}}))}_removeEmptyClasses(){this.hasEmptyClass&&this.el.classList.remove(...this.emptyClasses)}_addNotEmptyClasses(){this.hasNotEmptyClass&&this.el.classList.add(...this.notEmptyClasses)}_addEmptyClasses(){this.hasEmptyClass&&this.el.classList.add(...this.emptyClasses)}_removeNotEmptyClasses(){this.hasNotEmptyClass&&this.el.classList.remove(...this.notEmptyClasses)}}j.classes=["empty","notEmpty"],j.values={scopeSelector:String};class P extends n{connect(){this.toggle()}toggle(){this.hasEnablerTarget&&this.enablerTarget.checked?this.enableInputs():this.disableInputs()}disableInputs(){let e=this.hasClearValue&&this.clearValue;this.enableTargets.forEach((t,s)=>{e&&(t.value=""),t.disabled=!0})}enableInputs(){this.enableTargets.forEach((e,t)=>{e.disabled=!1})}}P.targets=["enabler","enable"],P.values={clear:Boolean};class W extends n{connect(){let e=this.el;e.onerror=()=>{this.hasPlaceholderValue?e.src=this.placeholderValue:e.style.display="none"}}}W.values={placeholder:String};class U extends n{submit(e){null==e||e.preventDefault(),this.dispatch(this.formTarget,"submit"),this.formTarget.submit()}reset(e){null==e||e.preventDefault(),this.dispatch(this.formTarget,"reset"),this.formTarget.reset()}}U.targets=["form"];class J extends n{get _formID(){if(this.hasIdValue)return this.idValue;let e=this.el.id;if(""!==e)return e;throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `)}get _formIdentifier(){return`${location.href} ${this._formID}`}get _formElements(){return this.el.elements}get _formData(){let e={[this._formIdentifier]:{}};for(const t of this._formElements){let s=t;s.name.length>0&&(A(s)&&"checkbox"==s.type?e[this._formIdentifier][s.name]=s.checked:A(s)&&"radio"==s.type?s.checked&&(e[this._formIdentifier][s.name]=s.value):e[this._formIdentifier][s.name]=s.value)}return e}get _restoreOnLoad(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}get _clearOnSubmit(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}initialize(){this._clear=this._clear.bind(this)}connect(){requestAnimationFrame(()=>{if(!x(this.el))throw new Error("Expected controller to be mounted on a form element.");this._restoreOnLoad&&this.restore(),this._clearOnSubmit&&this.el.addEventListener("submit",this._clear)})}disconnect(){this._clearOnSubmit&&this.el.removeEventListener("submit",this._clear)}_clear(){localStorage.removeItem(this._formIdentifier),this.dispatch(this.el,"form-save:cleared")}clear(e){null==e||e.preventDefault(),this._clear()}save(e){e.preventDefault(),localStorage.setItem(this._formIdentifier,JSON.stringify(this._formData[this._formIdentifier])),this.dispatch(this.el,"form-save:save:success")}restore(e){if(null==e||e.preventDefault(),localStorage.getItem(this._formIdentifier)){const e=JSON.parse(localStorage.getItem(this._formIdentifier));for(const t of this._formElements){let s=t;s.name in e&&(A(s)&&"checkbox"==s.type?s.checked=e[s.name]:A(s)&&"radio"==s.type?s.value==e[s.name]&&(s.checked=!0):s.value=e[s.name])}this.dispatch(this.el,"form-save:restore:success")}else this.dispatch(this.el,"form-save:restore:empty")}}J.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};class Y extends n{get _threshold(){return this.hasThresholdValue?this.thresholdValue.split(",").map(e=>Number.parseFloat(e.trim())).filter(e=>e>=0&&e<=1):[0,1]}connect(){p(this,{threshold:this._threshold,element:this.el})}appear(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})}disappear(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})}}Y.values={threshold:String};class G extends h{connect(){let e=this.el;"IntersectionObserver"in window?[this.observe,this.unobserve]=p(this,{element:e,threshold:.3}):this.loadContent()}appear(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())}}const K="scrollBehavior"in document.documentElement.style;let Q;async function X(e,{behavior:t="smooth",block:s="start",inline:i="nearest"}={}){"smooth"!=t||K||await async function(){const{polyfill:e}=await import("smoothscroll-polyfill");Q||(Q=!0,e())}(),e.scrollIntoView({behavior:t,block:s,inline:i})}function Z(e){if(!e)return null;const t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:Z(e.parentElement)||document.body}class ee extends n{constructor(){super(...arguments),this._dialog=null}get _src(){return this.hasSrcValue?this.srcValue:this.el.src}get _srcSet(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}get _sizes(){return this.hasSizesValue?this.sizesValue:this.el.sizes}get _modalClassName(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}get _imageClassName(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}initialize(){this.open=this.open.bind(this),this.close=this.close.bind(this)}connect(){}open(){let e=this.el;if(this._dialog)return;this._dialog=document.createElement("dialog");let t=document.createElement("img");t.className=this._imageClassName,t.src=this._src,t.srcset=this._srcSet,t.sizes=this._sizes,this._dialog.appendChild(t),e.insertAdjacentElement("afterend",this._dialog),i.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),X(this._dialog,{behavior:"smooth",block:"end"}).catch(()=>this._dialog.scrollIntoView(!1)),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}close(){this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,X(this.el,{behavior:"smooth",block:"end"}).catch(()=>this.el.scrollIntoView(!1)))}}ee.values={src:String,srcSet:String,sizes:String},ee.classes=["modal","image"];class te extends n{initialize(){this.handleInputs=this.handleInputs.bind(this)}connect(){this.inputTargets.forEach(e=>e.addEventListener("change",this.handleInputs))}disconnect(){this.inputTargets.forEach(e=>e.removeEventListener("change",this.handleInputs))}handleInputs(e){let t=this.inputTargets.reduce((e,t)=>t.checked?e+1:e,0),s=e.target;t>this.maxValue?(e.preventDefault(),s.checked=!1,this.dispatch(s,"change"),this.dispatch(s,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(s,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))}}te.targets=["input","error"],te.values={max:Number,message:String};class se extends n{initialize(){}connect(){}disconnect(){}async play(e){null==e||e.preventDefault(),await this.mediaTarget.play()}pause(e){null==e||e.preventDefault(),this.mediaTarget.pause()}restart(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0}seek(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5}}se.targets=["media"];class ie extends n{get _wrapperClass(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}get _insertMode(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}connect(){this._checkStructure()}add(e){null==e||e.preventDefault();const t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)}remove(e){e.preventDefault();const t=e.target.closest(`.${this._wrapperClass}`);if(null==t)throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";let e=t.querySelector("input[name*='_destroy']");if(null==e)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");e.value="1"}}_generateID(){return(new Date).getTime().toString()+Math.random().toString().slice(2)}_checkStructure(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")}}ie.targets=["target","template"],ie.values={insertMode:String,wrapperClass:String};class ae extends n{initialize(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)}connect(){this.passwordTargets.forEach(e=>e.addEventListener("change",this.checkPasswordsMatch))}disconnect(){this.passwordTargets.forEach(e=>e.removeEventListener("change",this.checkPasswordsMatch))}_allPasswordsMatch(){let e=new Set(this.passwordTargets.map(e=>e.value));return e.has("")||1==e.size}checkPasswordsMatch(){let e=this.el;this._allPasswordsMatch()?(this.dispatch(e,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(e=>e.classList.remove(this.errorClass))):(this.dispatch(e,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(e=>e.classList.add(this.errorClass)))}}ae.targets=["password"],ae.classes=["error"];class re extends n{peak(e){null==e||e.preventDefault(),this.passwordTarget.type="text"}hide(e){null==e||e.preventDefault(),this.passwordTarget.type="password"}toggle(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()}}re.targets=["password"];class ne extends n{get _selector(){return this.hasSelectorValue?this.selectorValue:`[data-controller~="${this.identifier}"]`}replace(e){const[t,s,i]=e.detail;if(t instanceof Node){let e=t.querySelector(this._selector);if(null==e)throw new Error(`expected new form DOM with [data-controller="${this.identifier}"] to be present in returned payload`);let s=this.el.parentNode;if(null==s)throw new Error("expected form to have a DOM parent, could not execute replaceChild");s.replaceChild(e,this.el)}else console.log("Unknown",t)}}ne.targets=[],ne.values={selector:String};class le extends n{initialize(){this.messageReceived=this.messageReceived.bind(this)}connect(){window.addEventListener("message",this.messageReceived)}disconnect(){window.removeEventListener("message",this.messageReceived)}messageReceived(e){let t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)}resize(e){this.el.style.height=`${e}px`}}class oe extends n{connect(){var e,t,s;window.self!==window.top&&(y(this),t={},null===(s=(e=this).constructor.debounces)||void 0===s||s.forEach(s=>{if("string"==typeof s&&(e[s]=V(e[s],null==t?void 0:t.wait)),"object"==typeof s){const{name:i,wait:a}=s;if(!i)return;e[i]=V(e[i],a||(null==t?void 0:t.wait))}}),this.postUpdate())}windowResize(e){this.postUpdate()}postUpdate(){let e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")}getHeight(){const e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)}}oe.debounces=["postUpdate"];class he extends n{_cleanupSelf(){this.cleanup(this.el)}cleanup(e){var t,s,i;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp(`(s|^)${this.identifier}(s|$)`,"g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;let r=new RegExp(`(s|^)${this.identifier}\\..+?(s|$)`,"g");e.dataset.target=(null==(s=e.dataset.target)?void 0:s.replaceAll(r,""))||"",delete e.dataset[a(`${this.identifier}-target`)],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(r,""))||"",delete e.dataset[a(`${this.identifier}-action`)],""==e.dataset.action&&delete e.dataset.action;let n=this.constructor.values;n&&Object.keys(n).forEach(t=>delete e.dataset[a(`${this.identifier}-${t}-value`)]);let l=this.constructor.classes;l&&Object.keys(l).forEach(t=>delete e.dataset[a(`${this.identifier}-${t}-class`)])}}class ce extends he{connect(){requestAnimationFrame(()=>{X(this.el,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(()=>this.el.scrollIntoView()),this._cleanupSelf()})}}ce.values={behavior:String,block:String,inline:String};class de extends n{scroll(e){let t;null==e||e.preventDefault(),t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:Z(this.el),null!=t&&X(t,{behavior:"smooth",block:"end"}).catch(()=>t.scrollIntoView(!1))}}de.values={mode:String};class ue extends n{scroll(){let e=document.querySelector(this.selectorValue);e?X(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(()=>e.scrollIntoView()):console.warn(`Could not find target for '${this.selectorValue}'`)}}ue.values={selector:String,behavior:String,block:String,inline:String};class me extends n{scroll(e){let t;null==e||e.preventDefault(),t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:Z(this.el),null!=t&&X(t,{behavior:"smooth",block:"start"}).catch(()=>t.scrollIntoView(!1))}}me.values={mode:String};class ge extends n{constructor(){super(...arguments),this._timeout=null}connect(){requestAnimationFrame(()=>{this._timeout=setTimeout(()=>this.el.remove(),1e3*this.secondsValue)})}disconnect(){this._timeout&&clearTimeout(this._timeout)}}ge.values={seconds:Number};class pe extends n{constructor(){super(...arguments),this._magicElement=null}get _mode(){return this.hasModeValue?this.modeValue:"top"}createMagicElement(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}}connect(){let e=this.el;this.createMagicElement(),new IntersectionObserver(t=>{t.forEach(t=>{t.target===this._magicElement&&(0===t.intersectionRatio?e.classList.add(this.hasStuckClass?this.stuckClass:"stuck"):1===t.intersectionRatio&&e.classList.remove(this.hasStuckClass?this.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)}}pe.classes=["stuck"],pe.values={mode:String};class ve extends n{constructor(){super(...arguments),this._lastIndex=null,this._reverse=!1}get _tableHead(){let e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}get _tableHeaders(){let e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}get _tableBody(){return this.el.tBodies[0]}get _tableRows(){return Array.from(this._tableBody.rows)}initialize(){this.sort=this.sort.bind(this)}connect(){requestAnimationFrame(()=>{this._tableHeaders.forEach(e=>e.addEventListener("click",this.sort)),this.hasStartSortValue&&this._sortByColumn(this.startSortValue)})}disconnect(){this._tableHeaders.forEach(e=>e.removeEventListener("click",this.sort))}sort(e){e.preventDefault();let t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)}_indexOfHeaderCell(e){return this._tableHeaders.indexOf(e)}_sortByColumn(e){this._reverse=e===this._lastIndex&&!this._reverse;let t=document.createDocumentFragment();this._tableRows.sort((t,s)=>{var i,a;let r=Array.from(t.cells),n=Array.from(s.cells),l=(null==(i=r[e])?void 0:i.innerText)||"",o=(null==(a=n[e])?void 0:a.innerText)||"",h=l.localeCompare(o,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return t.dataset.sortTop||s.dataset.sortBottom?t.dataset.sortTop&&s.dataset.sortTop?h:-1:t.dataset.sortBottom||s.dataset.sortTop?t.dataset.sortBottom&&s.dataset.sortBottom?h:1:this._reverse?h>0?-1:1:h}).forEach(e=>t.appendChild(e)),this._tableBody.innerHTML="",this._tableBody.appendChild(t),this._lastIndex=e}}ve.values={startSort:Number};class fe extends n{get _truncated(){return!!this.hasTruncatedValue&&this.truncatedValue}set _truncated(e){this.truncatedValue=e}get _tableBody(){return this.el.tBodies[0]}get _tableRows(){return Array.from(this._tableBody.rows)}get _limit(){return this.hasLimitValue?this.limitValue:20}initialize(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)}connect(){w(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(()=>{this.truncate(),this.showMoreTarget.addEventListener("click",this.expand)})}truncate(e){null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)}expand(e){this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._showElement(e)}),this._hideElement(this.showMoreTarget)}mutate(e){this._truncated&&this._reTruncate()}_showElement(e){e.style.display=""}_hideElement(e){e.style.display="none"}_reTruncate(){this._tableRows.slice(0,this._limit).forEach(e=>{e!==this.showMoreTarget&&this._showElement(e)}),this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._hideElement(e)}),this._showElement(this.showMoreTarget)}}fe.targets=["showMore"],fe.values={limit:Number,truncated:Boolean};class _e extends he{connect(){if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(()=>{this.hasImmediateValue&&this.immediateValue&&this.execute()})}execute(e){null==e||e.preventDefault();let t=this.el,s=document.querySelector(this.targetValue);if(null==s)return void this.dispatch(t,"teleport:error");let i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":s.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":s.outerHTML=i.outerHTML;break;case"replaceInner":s.innerHTML=i.outerHTML;break;case"prepend":s.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":s.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}}_e.values={target:String,insert:String,immediate:Boolean};class be extends n{connect(){if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new b(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:s,dispatchEvent:i,events:a,eventPrefix:r}=Object.assign({},v,t),n=a=>{const n=(null==t?void 0:t.element)||e.element;if(!(n.contains(a.target)||!function(e){const t=e.getBoundingClientRect(),s=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=s&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(n)&&s)&&(e.clickOutside&&e.clickOutside(a),i)){const t=u("click:outside",e,r),s=m(t,a,{controller:e});n.dispatchEvent(s)}},l=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==a||a.forEach(e=>{window.removeEventListener(e,n,!1)}),l()}}),null==a||a.forEach(e=>{window.addEventListener(e,n,!1)})})(this),requestAnimationFrame(()=>{this.hasInitialValue&&this.toggleTargets.forEach("on"===this.initialValue?e=>this._elementOn(e):e=>this._elementOff(e))})}clickOutside(){this.toggleTargets.forEach(e=>{this._elementWasToggled(e)&&(this._elementToggleStatus(e),this._elementToggle(e))})}mouseEnter(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}}mouseLeave(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}}on(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementOn(e)})}off(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementOff(e)})}toggle(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementToggle(e)})}_elementWasToggled(e){return"true"==e.dataset.toggled}_elementToggleStatus(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"}_elementToggle(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t))}_elementOn(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t,!0))}_elementOff(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t,!1))}}function Ee(e){return"TURBO-FRAME"==e.nodeName}be.targets=["toggle"],be.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};class we extends n{toggle(e){null==e||e.preventDefault();let t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()}setSrc(e){null==e||e.preventDefault(),this._setSrc()}clear(e){null==e||e.preventDefault(),this._clear()}_setSrc(){let e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()}_clear(){let e=this._getFrame();e.src="",e.innerHTML=""}_getFrame(){let e=document.getElementById(`${this.frameIdValue}`);if(null==e)throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);if(Ee(e))return e;throw new Error(`Element targeted by ID '${this.frameIdValue}'`)}_getSrc(){let e=this.el;if(this.hasSrcValue)return this.srcValue;if(C(e))return e.href;throw new Error("No link given to drive frame to")}}we.values={frameId:String,src:String,loadingMessage:String};class ye extends n{constructor(){super(...arguments),this._timeoutHandle=null}get _poll(){return!!this.hasPollValue&&this.pollValue}initialize(){this.refresh=this.refresh.bind(this)}connect(){let e=this.el;if(!Ee(e))throw new Error("Expected controller to be mounted on a element.");if(e.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(()=>this._timeoutHandle=setTimeout(()=>this.refresh(),this.intervalValue))}disconnect(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}refresh(e){null==e||e.preventDefault();let t=this.el;t.src=t.src}}ye.values={interval:Number,poll:Boolean};class Ve extends n{initialize(){this.updateWordCount=this.updateWordCount.bind(this)}connect(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)}disconnect(){this.inputTarget.removeEventListener("input",this.updateWordCount)}updateWordCount(){let e=0,t=this.inputTarget.value.match(/\S+/g);e=t&&t.length||0,this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))}_isValidCount(e){let t=0,s=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(s=this.maxValue),e>=t&&e<=s}}Ve.targets=["input","output"],Ve.values={min:Number,max:Number},Ve.classes=["error"];export{l as AnchorSpyController,o as AppearanceController,h as AsyncBlockController,c as AutoSubmitFormController,T as AutosizeController,L as CharCountController,k as CheckboxSelectAllController,S as ClipboardController,N as ConfirmController,O as ConfirmNavigationController,H as DebugController,z as DetectDirtyController,$ as DetectDirtyFormController,R as DisableInputsController,B as DisableWithController,F as DismissableController,q as ElementSaveController,j as EmptyDomController,P as EnableInputsController,W as FallbackImageController,U as FormRcController,J as FormSaveController,Y as IntersectionController,G as LazyBlockController,ee as LightboxImageController,te as LimitedSelectionCheckboxesController,se as MediaPlayerController,ie as NestedFormController,ae as PasswordConfirmController,re as PasswordPeekController,ne as RemoteFormController,oe as ResponsiveIframeBodyController,le as ResponsiveIframeWrapperController,ce as ScrollIntoFocusController,de as ScrollToBottomController,ue as ScrollToController,me as ScrollToTopController,ge as SelfDestructController,pe as StickyController,ve as TableSortController,fe as TableTruncateController,_e as TeleportController,be as ToggleClassController,we as TurboFrameRCController,ye as TurboFrameRefreshController,Ve as WordCountController}; +import{Controller as e}from"stimulus";import t from"lodash-es/get";import s from"lodash-es/set";import i from"dialog-polyfill";import a from"camelcase";function r(){return(r=Object.assign||function(e){for(var t=1;t{let s=Reflect.get(e,t),i=this;if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof s)return new Proxy(s,{apply:(e,s,a)=>(i.log(t.toString(),{args:a}),Reflect.apply(e,s,a))});this.log(t.toString())}return s}})}get el(){return this.element}dispatch(e,t,s={}){let i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},s);i.detail.target&&(i.detail.target=e);let a=new CustomEvent(t,i);this.logEvent(t,a,e),e.dispatchEvent(a)}log(e,t={}){if(!this.application.debug)return;let s=console;s.groupCollapsed(`%c${this.identifier} %c#${e}`,"color: #3B82F6","color: unset"),s.log(r({element:this.element},t)),s.groupEnd()}logEvent(e,t,s){if(!this.application.debug)return;let i=console;i.groupCollapsed(`%c${this.identifier} %c${e}%c`,"color: #3B82F6","color: #0be000","color: unset"),i.log({element:s}),i.groupEnd()}}class l extends n{get _key(){return this.keyValue.replaceAll("#","")}get _anchor(){return window.location.hash.substr(1)}set _anchor(e){window.location.hash=e}initialize(){this._checkAnchor=this._checkAnchor.bind(this)}connect(){requestAnimationFrame(()=>{this._checkAnchor(),window.addEventListener("hashchange",this._checkAnchor)})}disconnect(){window.removeEventListener("hashchange",this._checkAnchor)}write(e){null==e||e.preventDefault(),this._anchor=this._key}_checkAnchor(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")}}l.values={key:String};class o extends n{initialize(){this._handleVisibility=this._handleVisibility.bind(this)}connect(){window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(()=>{this._handleVisibility()})}disconnect(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)}appear(){this.dispatch(this.el,"appearance:appear")}away(){this.dispatch(this.el,"appearance:away")}_handleVisibility(){this._documentIsActive()?this.appear():this.away()}_documentIsActive(){return"visible"==document.visibilityState&&document.hasFocus()}}class h extends n{get _errorMessage(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}connect(){this.loadContent()}loadContent(){let e=this,t=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(e=>e.text()).then(s=>{let i=document.createElement("div");if(i.innerHTML=s,this.hasSelectorValue){let e=i.querySelectorAll(this.selectorValue);t.replaceWith(...e)}else t.replaceWith(...i.children);e.dispatch(t,"ajax:success")}).catch(s=>{t.replaceWith(this._errorMessage),e.dispatch(t,"ajax:error")}).finally(()=>{e.dispatch(t,"ajax:complete")})}}h.targets=["replace"],h.values={endpoint:String,errorMessage:String,selector:String};class c extends n{initialize(){this.submit=this.submit.bind(this)}connect(){this.el.querySelectorAll("input, select, textarea").forEach(e=>e.addEventListener("change",this.submit))}disconnect(){this.el.querySelectorAll("input, select, textarea").forEach(e=>e.removeEventListener("change",this.submit))}submit(){this.dispatch(this.el,"submit")}}const d=(e,t)=>{const s=e[t];return"function"==typeof s?s:(...e)=>{}},u=(e,t,s)=>{let i=e;return!0===s?i=`${t.identifier}:${e}`:"string"==typeof s&&(i=`${s}:${e}`),i},m=(e,t,s)=>{const{bubbles:i,cancelable:a,composed:r}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(s,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:a,composed:r,detail:s})},g={dispatchEvent:!0,eventPrefix:!0},p=(e,t={})=>{const{dispatchEvent:s,eventPrefix:i}=Object.assign({},g,t),a=(null==t?void 0:t.element)||e.element,r=e.disconnect.bind(e),n=new IntersectionObserver(t=>{const[r]=t;r.isIntersecting?(t=>{if(e.isVisible=!0,d(e,"appear").call(e,t),s){const s=u("appear",e,i),r=m(s,null,{controller:e,entry:t});a.dispatchEvent(r)}})(r):e.isVisible&&(t=>{if(e.isVisible=!1,d(e,"disappear").call(e,t),s){const s=u("disappear",e,i),r=m(s,null,{controller:e,entry:t});a.dispatchEvent(r)}})(r)},t),l=()=>{n.observe(a)},o=()=>{n.unobserve(a)};return Object.assign(e,{isVisible:!1,disconnect(){o(),r()}}),l(),[l,o]},v={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},f={debug:!1,logger:console};class _{constructor(e,t={}){var s,i,a;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(s=null==t?void 0:t.debug)&&void 0!==s?s:e.application.stimulusUseDebug)&&void 0!==i?i:f.debug,this.logger=null!==(a=null==t?void 0:t.logger)&&void 0!==a?a:f.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class b extends _{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{d(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{d(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class E extends _{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{d(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const w=(e,t={})=>{const s=new E(e,t);return[s.observe,s.unobserve]},y=e=>{const t=t=>{const{innerWidth:s,innerHeight:i}=window,a={height:i||Infinity,width:s||Infinity,event:t};d(e,"windowResize").call(e,a)},s=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},a=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){a(),s()}}),i(),[i,a]},V=(e,t=200)=>{let s=null;return function(){const i=arguments,a=this,r=()=>e.apply(a,i);s&&clearTimeout(s),s=setTimeout(r,t)}};class T extends n{initialize(){this._handler=this._handler.bind(this)}connect(){y(this),requestAnimationFrame(()=>{this._handler();let e=this.el;e.style.resize="none",e.style.boxSizing="border-box",e.addEventListener("input",this._handler),e.addEventListener("focus",this._handler)})}disconnect(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)}windowResize(){this._handler()}_handler(){this.autosize(this.el)}autosize(e){let t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"}}class L extends n{initialize(){this._updateCharCount=this._updateCharCount.bind(this)}connect(){requestAnimationFrame(()=>{this.inputTarget.addEventListener("input",this._updateCharCount),this._updateCharCount()})}disconnect(){this.inputTarget.removeEventListener("input",this._updateCharCount)}_updateCharCount(){let e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))}_isValidCount(e){let t=0,s=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(s=this.maxValue),e>=t&&e<=s}}L.targets=["input","output"],L.values={min:Number,max:Number},L.classes=["error"];class k extends n{get _checked(){return this.checkboxTargets.filter(e=>e.checked)}get _unchecked(){return this.checkboxTargets.filter(e=>!e.checked)}initialize(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)}connect(){requestAnimationFrame(()=>{this.hasSelectAllTarget&&(this.selectAllTarget.addEventListener("change",this._toggle),this.checkboxTargets.forEach(e=>e.addEventListener("change",this._refresh)),this._refresh())})}disconnect(){this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(e=>e.removeEventListener("change",this._refresh)))}_toggle(e){e.preventDefault();let t=e.target;this.checkboxTargets.forEach(e=>e.checked=t.checked)}_refresh(){const e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t{let e=this.el;if(C(e))e.addEventListener("submit",this.confirm);else{if(!x(e))throw new Error("Can't handle confirmation on attached element");e.addEventListener("click",this.confirm)}})}disconnect(){let e=this.el;C(e)?e.removeEventListener("submit",this.confirm):x(e)&&e.removeEventListener("click",this.confirm)}confirm(e){window.confirm(this._message)||(e.preventDefault(),this.dispatch(this.el,"confirm:cancelled"))}}N.values={message:String};class O extends n{get _message(){return this.hasMessageValue?this._messageValue:"Do you want to leave this page? Changes you made may not be saved"}initialize(){this.allowSubmit=this.allowSubmit.bind(this),this.confirmNavigation=this.confirmNavigation.bind(this),this.confirmTurboNavigation=this.confirmTurboNavigation.bind(this)}connect(){window.onbeforeunload=()=>this._message,window.addEventListener("popstate",this.confirmNavigation),window.addEventListener("submit",this.allowSubmit),window.addEventListener("turbolinks:before-visit",this.confirmTurboNavigation),window.addEventListener("turbo:before-visit",this.confirmTurboNavigation)}disconnect(){window.removeEventListener("popstate",this.confirmNavigation),window.onbeforeunload=null,window.removeEventListener("submit",this.allowSubmit),window.removeEventListener("turbolinks:before-visit",this.confirmTurboNavigation),window.removeEventListener("turbo:before-visit",this.confirmTurboNavigation)}allowSubmit(e){window.removeEventListener("popstate",this.confirmNavigation),window.onbeforeunload=null}confirmNavigation(e){return!1}confirmTurboNavigation(e){confirm(this._message)||e.preventDefault()}}O.values={_message:String};class H extends n{connect(){console.log("Debug Controller",this,this.testTargets)}}H.targets=["test"];class z extends n{get _cacheAttrName(){return"detect-dirty-load-value"}initialize(){this._checkDirty=this._checkDirty.bind(this)}connect(){let e=this.el;this._cacheLoadValues(),this._checkDirty(),e.addEventListener("input",this._checkDirty),e.addEventListener("change",this._checkDirty)}disconnect(){let e=this.el;e.removeEventListener("input",this._checkDirty),e.removeEventListener("change",this._checkDirty)}restore(e){null==e||e.preventDefault(),this._restoreElementFromLoadValue()}_getElementValue(){let e=this.el;return M(e)?e.checked:e.value}_getElementLoadValue(){let e=this.el,t=e.getAttribute(this._cacheAttrName);return M(e)?null==t?e.defaultChecked:"true"==t:(null!==t||I(e)&&Array.from(e.options).forEach(t=>{if(t.defaultSelected)return e.value=t.value,t.value}),t)}_elementHasCachedLoadValue(){return this.el.hasAttribute(this._cacheAttrName)}_checkDirty(){let e=this.el;this._isElementDirty()?e.setAttribute("data-dirty","true"):e.removeAttribute("data-dirty")}_isElementDirty(){return this._getElementValue()!==this._getElementLoadValue()}_restoreElementFromLoadValue(){let e=this.el,t=e.getAttribute(this._cacheAttrName);M(e)?(e.setAttribute(this._cacheAttrName,e.checked.toString()),e.checked=null==t?e.defaultChecked:"true"==t):I(e)?null==t?Array.from(e.options).forEach(t=>{t.defaultSelected&&(e.value=t.value)}):e.value=t:e.value=null==t?e.defaultValue:t}_cacheLoadValues(){let e=this.el;!this._elementHasCachedLoadValue()&&M(e)?e.setAttribute(this._cacheAttrName,e.checked.toString()):e.setAttribute(this._cacheAttrName,e.value.toString())}}class $ extends n{get _formElements(){return Array.from(this.el.querySelectorAll("input, select, textarea"))}get _cacheAttrName(){return"detect-dirty-load-value"}initialize(){this._checkDirty=this._checkDirty.bind(this)}connect(){let e=this.el;this._cacheLoadValues(),this._checkDirty(),e.addEventListener("input",this._checkDirty),e.addEventListener("change",this._checkDirty)}disconnect(){let e=this.el;e.removeEventListener("input",this._checkDirty),e.removeEventListener("change",this._checkDirty)}restore(e){null==e||e.preventDefault(),this._formElements.forEach(e=>this._restoreElementFromLoadValue(e))}_getElementValue(e){return M(e)?e.checked:e.value}_getElementLoadValue(e){let t=e.getAttribute(this._cacheAttrName);return M(e)?null==t?e.defaultChecked:"true"==t:(null!==t||I(e)&&Array.from(e.options).forEach(t=>{if(t.defaultSelected)return e.value=t.value,t.value}),t)}_elementHasCachedLoadValue(e){return e.hasAttribute(this._cacheAttrName)}_checkElementDirty(e){this._isElementDirty(e)?e.setAttribute("data-dirty","true"):e.removeAttribute("data-dirty")}_isElementDirty(e){return this._getElementValue(e)!==this._getElementLoadValue(e)}_cacheElementLoadValue(e){!this._elementHasCachedLoadValue(e)&&M(e)?e.setAttribute(this._cacheAttrName,e.checked.toString()):e.setAttribute(this._cacheAttrName,e.value.toString())}_restoreElementFromLoadValue(e){let t=e.getAttribute(this._cacheAttrName);M(e)?(e.setAttribute(this._cacheAttrName,e.checked.toString()),e.checked=null==t?e.defaultChecked:"true"==t):I(e)?null==t?Array.from(e.options).forEach(t=>{t.defaultSelected&&(e.value=t.value)}):e.value=t:e.value=null==t?e.defaultValue:t}_cacheLoadValues(){this._formElements.forEach(e=>this._cacheElementLoadValue(e))}_checkDirty(){this._formElements.forEach(e=>this._checkElementDirty(e)),this._formElements.some(e=>e.hasAttribute("data-dirty"))?this.el.setAttribute("data-dirty","true"):this.el.removeAttribute("data-dirty")}}class R extends n{connect(){this.toggle()}toggle(){this.hasDisablerTarget&&this.disablerTarget.checked?this.disableInputs():this.enableInputs()}disableInputs(){let e=this.hasClearValue&&this.clearValue;this.disableTargets.forEach((t,s)=>{e&&(t.value=""),t.disabled=!0})}enableInputs(){this.disableTargets.forEach((e,t)=>{e.disabled=!1})}}R.targets=["disabler","disable"],R.values={clear:Boolean};class B extends n{get _message(){return this.hasMessageValue?this.messageValue:"Submitting..."}get _timeout(){return this.hasTimeoutValue?this.timeoutValue:1e3}initialize(){this.enable=this.enable.bind(this),this.disable=this.disable.bind(this)}connect(){requestAnimationFrame(()=>{this.el.addEventListener("click",this.disable)})}disconnect(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}disable(e){let t=this.el;this._isDisabled(t)?(null==e||e.preventDefault(),null==e||e.stopImmediatePropagation()):(this._cacheText=this._getElText(t),this._setElText(t,this._message),this._disable(t),setTimeout(this.enable,this._timeout))}enable(e){null==e||e.preventDefault();let t=this.el;this._isDisabled(t)&&(this._setElText(t,this._cacheText),this._enable(t))}_isDisabled(e){return A(e)&&"submit"==e.type||D(e)?e.disabled:"true"==e.dataset.disabled}_getElText(e){return A(e)&&"submit"==e.type?e.value:e.innerText}_setElText(e,t){A(e)&&"submit"==e.type?e.value=t:(D(e)||x(e))&&(e.innerText=t)}_disable(e){A(e)&&"submit"==e.type||D(e)?e.disabled=!0:e.dataset.disabled="true"}_enable(e){A(e)&&"submit"==e.type||D(e)?e.disabled=!1:e.dataset.disabled=void 0}}B.values={message:String,timeout:Number};class F extends n{dismiss(){this.el.remove()}}class q extends n{get _id(){if(this.hasIdValue)return this.idValue;let e=this.el.id;if(""!==e)return e;throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `)}get _uniqueIdentifier(){return`${location.href} ${this._id}`}get _restoreOnLoad(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}get _element(){return this.hasElementTarget?this.elementTarget:this.el}connect(){requestAnimationFrame(()=>{this._restoreOnLoad&&this.restore()})}clear(e){e&&e.preventDefault(),localStorage.removeItem(this._uniqueIdentifier),this.dispatch(this._element,"element-save:cleared")}save(e){e&&e.preventDefault();let s=this._element,i=this.attributesValue.split(" "),a={};i.forEach(e=>a[e]=t(s,e)),localStorage.setItem(this._uniqueIdentifier,JSON.stringify(a)),this.dispatch(s,"element-save:save:success")}restore(e){e&&e.preventDefault();let t=this._element;if(localStorage.getItem(this._uniqueIdentifier)){const e=JSON.parse(localStorage.getItem(this._uniqueIdentifier));Object.keys(e).forEach(i=>{s(t,i,e[i])}),this.dispatch(t,"element-save:restore:success")}else this.dispatch(t,"element-save:restore:empty")}}q.targets=["element"],q.values={id:String,attributes:String,restoreOnLoad:Boolean};class j extends n{get emptyClasses(){return this.emptyClass.split(" ")}get notEmptyClasses(){return this.notEmptyClass.split(" ")}get _children(){let e=this.el;return Array.from(this.hasScopeSelectorValue?e.querySelectorAll(this.scopeSelectorValue):e.children)}connect(){w(this,{element:this.el,childList:!0}),this.checkEmpty()}mutate(e){this.checkEmpty()}checkEmpty(){let e=this.el,t=this._children;0===t.length?(this._removeNotEmptyClasses(),this._addEmptyClasses(),this.dispatch(e,"dom:empty")):(this._addNotEmptyClasses(),this._removeEmptyClasses(),this.dispatch(e,"dom:not-empty",{detail:{count:t.length}}))}_removeEmptyClasses(){this.hasEmptyClass&&this.el.classList.remove(...this.emptyClasses)}_addNotEmptyClasses(){this.hasNotEmptyClass&&this.el.classList.add(...this.notEmptyClasses)}_addEmptyClasses(){this.hasEmptyClass&&this.el.classList.add(...this.emptyClasses)}_removeNotEmptyClasses(){this.hasNotEmptyClass&&this.el.classList.remove(...this.notEmptyClasses)}}j.classes=["empty","notEmpty"],j.values={scopeSelector:String};class P extends n{connect(){this.toggle()}toggle(){this.hasEnablerTarget&&this.enablerTarget.checked?this.enableInputs():this.disableInputs()}disableInputs(){let e=this.hasClearValue&&this.clearValue;this.enableTargets.forEach((t,s)=>{e&&(t.value=""),t.disabled=!0})}enableInputs(){this.enableTargets.forEach((e,t)=>{e.disabled=!1})}}P.targets=["enabler","enable"],P.values={clear:Boolean};class W extends n{connect(){let e=this.el;e.onerror=()=>{this.hasPlaceholderValue?e.src=this.placeholderValue:e.style.display="none"}}}W.values={placeholder:String};class U extends n{submit(e){null==e||e.preventDefault(),this.dispatch(this.formTarget,"submit"),this.formTarget.submit()}reset(e){null==e||e.preventDefault(),this.dispatch(this.formTarget,"reset"),this.formTarget.reset()}}U.targets=["form"];class J extends n{get _formID(){if(this.hasIdValue)return this.idValue;let e=this.el.id;if(""!==e)return e;throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `)}get _formIdentifier(){return`${location.href} ${this._formID}`}get _formElements(){return this.el.elements}get _formData(){let e={[this._formIdentifier]:{}};for(const t of this._formElements){let s=t;s.name.length>0&&(A(s)&&"checkbox"==s.type?e[this._formIdentifier][s.name]=s.checked:A(s)&&"radio"==s.type?s.checked&&(e[this._formIdentifier][s.name]=s.value):e[this._formIdentifier][s.name]=s.value)}return e}get _restoreOnLoad(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}get _clearOnSubmit(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}initialize(){this._clear=this._clear.bind(this)}connect(){requestAnimationFrame(()=>{if(!C(this.el))throw new Error("Expected controller to be mounted on a form element.");this._restoreOnLoad&&this.restore(),this._clearOnSubmit&&this.el.addEventListener("submit",this._clear)})}disconnect(){this._clearOnSubmit&&this.el.removeEventListener("submit",this._clear)}_clear(){localStorage.removeItem(this._formIdentifier),this.dispatch(this.el,"form-save:cleared")}clear(e){null==e||e.preventDefault(),this._clear()}save(e){e.preventDefault(),localStorage.setItem(this._formIdentifier,JSON.stringify(this._formData[this._formIdentifier])),this.dispatch(this.el,"form-save:save:success")}restore(e){if(null==e||e.preventDefault(),localStorage.getItem(this._formIdentifier)){const e=JSON.parse(localStorage.getItem(this._formIdentifier));for(const t of this._formElements){let s=t;s.name in e&&(A(s)&&"checkbox"==s.type?s.checked=e[s.name]:A(s)&&"radio"==s.type?s.value==e[s.name]&&(s.checked=!0):s.value=e[s.name])}this.dispatch(this.el,"form-save:restore:success")}else this.dispatch(this.el,"form-save:restore:empty")}}J.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};class Y extends n{get _threshold(){return this.hasThresholdValue?this.thresholdValue.split(",").map(e=>Number.parseFloat(e.trim())).filter(e=>e>=0&&e<=1):[0,1]}connect(){p(this,{threshold:this._threshold,element:this.el})}appear(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})}disappear(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})}}Y.values={threshold:String};class G extends h{connect(){let e=this.el;"IntersectionObserver"in window?[this.observe,this.unobserve]=p(this,{element:e,threshold:.3}):this.loadContent()}appear(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())}}const K="scrollBehavior"in document.documentElement.style;let Q;async function X(e,{behavior:t="smooth",block:s="start",inline:i="nearest"}={}){"smooth"!=t||K||await async function(){const{polyfill:e}=await import("smoothscroll-polyfill");Q||(Q=!0,e())}(),e.scrollIntoView({behavior:t,block:s,inline:i})}function Z(e){if(!e)return null;const t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:Z(e.parentElement)||document.body}class ee extends n{constructor(){super(...arguments),this._dialog=null}get _src(){return this.hasSrcValue?this.srcValue:this.el.src}get _srcSet(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}get _sizes(){return this.hasSizesValue?this.sizesValue:this.el.sizes}get _modalClassName(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}get _imageClassName(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}initialize(){this.open=this.open.bind(this),this.close=this.close.bind(this)}connect(){}open(){let e=this.el;if(this._dialog)return;this._dialog=document.createElement("dialog");let t=document.createElement("img");t.className=this._imageClassName,t.src=this._src,t.srcset=this._srcSet,t.sizes=this._sizes,this._dialog.appendChild(t),e.insertAdjacentElement("afterend",this._dialog),i.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),X(this._dialog,{behavior:"smooth",block:"end"}).catch(()=>this._dialog.scrollIntoView(!1)),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}close(){this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,X(this.el,{behavior:"smooth",block:"end"}).catch(()=>this.el.scrollIntoView(!1)))}}ee.values={src:String,srcSet:String,sizes:String},ee.classes=["modal","image"];class te extends n{initialize(){this.handleInputs=this.handleInputs.bind(this)}connect(){this.inputTargets.forEach(e=>e.addEventListener("change",this.handleInputs))}disconnect(){this.inputTargets.forEach(e=>e.removeEventListener("change",this.handleInputs))}handleInputs(e){let t=this.inputTargets.reduce((e,t)=>t.checked?e+1:e,0),s=e.target;t>this.maxValue?(e.preventDefault(),s.checked=!1,this.dispatch(s,"change"),this.dispatch(s,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(s,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))}}te.targets=["input","error"],te.values={max:Number,message:String};class se extends n{initialize(){}connect(){}disconnect(){}async play(e){null==e||e.preventDefault(),await this.mediaTarget.play()}pause(e){null==e||e.preventDefault(),this.mediaTarget.pause()}restart(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0}seek(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5}}se.targets=["media"];class ie extends n{get _wrapperClass(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}get _insertMode(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}connect(){this._checkStructure()}add(e){null==e||e.preventDefault();const t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)}remove(e){e.preventDefault();const t=e.target.closest(`.${this._wrapperClass}`);if(null==t)throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";let e=t.querySelector("input[name*='_destroy']");if(null==e)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");e.value="1"}}_generateID(){return(new Date).getTime().toString()+Math.random().toString().slice(2)}_checkStructure(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")}}ie.targets=["target","template"],ie.values={insertMode:String,wrapperClass:String};class ae extends n{initialize(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)}connect(){this.passwordTargets.forEach(e=>e.addEventListener("change",this.checkPasswordsMatch))}disconnect(){this.passwordTargets.forEach(e=>e.removeEventListener("change",this.checkPasswordsMatch))}_allPasswordsMatch(){let e=new Set(this.passwordTargets.map(e=>e.value));return e.has("")||1==e.size}checkPasswordsMatch(){let e=this.el;this._allPasswordsMatch()?(this.dispatch(e,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(e=>e.classList.remove(this.errorClass))):(this.dispatch(e,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(e=>e.classList.add(this.errorClass)))}}ae.targets=["password"],ae.classes=["error"];class re extends n{peak(e){null==e||e.preventDefault(),this.passwordTarget.type="text"}hide(e){null==e||e.preventDefault(),this.passwordTarget.type="password"}toggle(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()}}re.targets=["password"];class ne extends n{get _selector(){return this.hasSelectorValue?this.selectorValue:`[data-controller~="${this.identifier}"]`}replace(e){const[t,s,i]=e.detail;if(t instanceof Node){let e=t.querySelector(this._selector);if(null==e)throw new Error(`expected new form DOM with [data-controller="${this.identifier}"] to be present in returned payload`);let s=this.el.parentNode;if(null==s)throw new Error("expected form to have a DOM parent, could not execute replaceChild");s.replaceChild(e,this.el)}else console.log("Unknown",t)}}ne.targets=[],ne.values={selector:String};class le extends n{initialize(){this.messageReceived=this.messageReceived.bind(this)}connect(){window.addEventListener("message",this.messageReceived)}disconnect(){window.removeEventListener("message",this.messageReceived)}messageReceived(e){let t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)}resize(e){this.el.style.height=`${e}px`}}class oe extends n{connect(){var e,t,s;window.self!==window.top&&(y(this),t={},null===(s=(e=this).constructor.debounces)||void 0===s||s.forEach(s=>{if("string"==typeof s&&(e[s]=V(e[s],null==t?void 0:t.wait)),"object"==typeof s){const{name:i,wait:a}=s;if(!i)return;e[i]=V(e[i],a||(null==t?void 0:t.wait))}}),this.postUpdate())}windowResize(e){this.postUpdate()}postUpdate(){let e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")}getHeight(){const e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)}}oe.debounces=["postUpdate"];class he extends n{_cleanupSelf(){this.cleanup(this.el)}cleanup(e){var t,s,i;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp(`(s|^)${this.identifier}(s|$)`,"g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;let r=new RegExp(`(s|^)${this.identifier}\\..+?(s|$)`,"g");e.dataset.target=(null==(s=e.dataset.target)?void 0:s.replaceAll(r,""))||"",delete e.dataset[a(`${this.identifier}-target`)],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(r,""))||"",delete e.dataset[a(`${this.identifier}-action`)],""==e.dataset.action&&delete e.dataset.action;let n=this.constructor.values;n&&Object.keys(n).forEach(t=>delete e.dataset[a(`${this.identifier}-${t}-value`)]);let l=this.constructor.classes;l&&Object.keys(l).forEach(t=>delete e.dataset[a(`${this.identifier}-${t}-class`)])}}class ce extends he{connect(){requestAnimationFrame(()=>{X(this.el,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(()=>this.el.scrollIntoView()),this._cleanupSelf()})}}ce.values={behavior:String,block:String,inline:String};class de extends n{scroll(e){let t;null==e||e.preventDefault(),t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:Z(this.el),null!=t&&X(t,{behavior:"smooth",block:"end"}).catch(()=>t.scrollIntoView(!1))}}de.values={mode:String};class ue extends n{scroll(){let e=document.querySelector(this.selectorValue);e?X(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(()=>e.scrollIntoView()):console.warn(`Could not find target for '${this.selectorValue}'`)}}ue.values={selector:String,behavior:String,block:String,inline:String};class me extends n{scroll(e){let t;null==e||e.preventDefault(),t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:Z(this.el),null!=t&&X(t,{behavior:"smooth",block:"start"}).catch(()=>t.scrollIntoView(!1))}}me.values={mode:String};class ge extends n{constructor(){super(...arguments),this._timeout=null}connect(){requestAnimationFrame(()=>{this._timeout=setTimeout(()=>this.el.remove(),1e3*this.secondsValue)})}disconnect(){this._timeout&&clearTimeout(this._timeout)}}ge.values={seconds:Number};class pe extends n{constructor(){super(...arguments),this._magicElement=null}get _mode(){return this.hasModeValue?this.modeValue:"top"}createMagicElement(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}}connect(){let e=this.el;this.createMagicElement(),new IntersectionObserver(t=>{t.forEach(t=>{t.target===this._magicElement&&(0===t.intersectionRatio?e.classList.add(this.hasStuckClass?this.stuckClass:"stuck"):1===t.intersectionRatio&&e.classList.remove(this.hasStuckClass?this.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)}}pe.classes=["stuck"],pe.values={mode:String};class ve extends n{constructor(){super(...arguments),this._lastIndex=null,this._reverse=!1}get _tableHead(){let e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}get _tableHeaders(){let e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}get _tableBody(){return this.el.tBodies[0]}get _tableRows(){return Array.from(this._tableBody.rows)}initialize(){this.sort=this.sort.bind(this)}connect(){requestAnimationFrame(()=>{this._tableHeaders.forEach(e=>e.addEventListener("click",this.sort)),this.hasStartSortValue&&this._sortByColumn(this.startSortValue)})}disconnect(){this._tableHeaders.forEach(e=>e.removeEventListener("click",this.sort))}sort(e){e.preventDefault();let t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)}_indexOfHeaderCell(e){return this._tableHeaders.indexOf(e)}_sortByColumn(e){this._reverse=e===this._lastIndex&&!this._reverse;let t=document.createDocumentFragment();this._tableRows.sort((t,s)=>{var i,a;let r=Array.from(t.cells),n=Array.from(s.cells),l=(null==(i=r[e])?void 0:i.innerText)||"",o=(null==(a=n[e])?void 0:a.innerText)||"",h=l.localeCompare(o,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return t.dataset.sortTop||s.dataset.sortBottom?t.dataset.sortTop&&s.dataset.sortTop?h:-1:t.dataset.sortBottom||s.dataset.sortTop?t.dataset.sortBottom&&s.dataset.sortBottom?h:1:this._reverse?h>0?-1:1:h}).forEach(e=>t.appendChild(e)),this._tableBody.innerHTML="",this._tableBody.appendChild(t),this._lastIndex=e}}ve.values={startSort:Number};class fe extends n{get _truncated(){return!!this.hasTruncatedValue&&this.truncatedValue}set _truncated(e){this.truncatedValue=e}get _tableBody(){return this.el.tBodies[0]}get _tableRows(){return Array.from(this._tableBody.rows)}get _limit(){return this.hasLimitValue?this.limitValue:20}initialize(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)}connect(){w(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(()=>{this.truncate(),this.showMoreTarget.addEventListener("click",this.expand)})}truncate(e){null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)}expand(e){this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._showElement(e)}),this._hideElement(this.showMoreTarget)}mutate(e){this._truncated&&this._reTruncate()}_showElement(e){e.style.display=""}_hideElement(e){e.style.display="none"}_reTruncate(){this._tableRows.slice(0,this._limit).forEach(e=>{e!==this.showMoreTarget&&this._showElement(e)}),this._tableRows.slice(this._limit).forEach(e=>{e!==this.showMoreTarget&&this._hideElement(e)}),this._showElement(this.showMoreTarget)}}fe.targets=["showMore"],fe.values={limit:Number,truncated:Boolean};class _e extends he{connect(){if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(()=>{this.hasImmediateValue&&this.immediateValue&&this.execute()})}execute(e){null==e||e.preventDefault();let t=this.el,s=document.querySelector(this.targetValue);if(null==s)return void this.dispatch(t,"teleport:error");let i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":s.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":s.outerHTML=i.outerHTML;break;case"replaceInner":s.innerHTML=i.outerHTML;break;case"prepend":s.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":s.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}}_e.values={target:String,insert:String,immediate:Boolean};class be extends n{constructor(){super(...arguments),this._timeoutHandle=null}initialize(){this._timeout=this._timeout.bind(this)}connect(){requestAnimationFrame(()=>{this._timeoutHandle=window.setTimeout(this._timeout,1e3*this.secondsValue)})}disconnect(){this._timeoutHandle&&window.clearTimeout(this._timeoutHandle)}_timeout(){this.dispatch(this.el,"timeout")}}be.values={seconds:Number};class Ee extends n{connect(){if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new b(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:s,dispatchEvent:i,events:a,eventPrefix:r}=Object.assign({},v,t),n=a=>{const n=(null==t?void 0:t.element)||e.element;if(!(n.contains(a.target)||!function(e){const t=e.getBoundingClientRect(),s=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=s&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(n)&&s)&&(e.clickOutside&&e.clickOutside(a),i)){const t=u("click:outside",e,r),s=m(t,a,{controller:e});n.dispatchEvent(s)}},l=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==a||a.forEach(e=>{window.removeEventListener(e,n,!1)}),l()}}),null==a||a.forEach(e=>{window.addEventListener(e,n,!1)})})(this),requestAnimationFrame(()=>{this.hasInitialValue&&this.toggleTargets.forEach("on"===this.initialValue?e=>this._elementOn(e):e=>this._elementOff(e))})}clickOutside(){this.toggleTargets.forEach(e=>{this._elementWasToggled(e)&&(this._elementToggleStatus(e),this._elementToggle(e))})}mouseEnter(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}}mouseLeave(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}}on(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementOn(e)})}off(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementOff(e)})}toggle(e){this.toggleTargets.forEach(e=>{this._elementToggleStatus(e),this._elementToggle(e)})}_elementWasToggled(e){return"true"==e.dataset.toggled}_elementToggleStatus(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"}_elementToggle(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t))}_elementOn(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t,!0))}_elementOff(e){this.classValue.split(" ").forEach(t=>e.classList.toggle(t,!1))}}function we(e){return"TURBO-FRAME"==e.nodeName}Ee.targets=["toggle"],Ee.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};class ye extends n{toggle(e){null==e||e.preventDefault();let t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()}setSrc(e){null==e||e.preventDefault(),this._setSrc()}clear(e){null==e||e.preventDefault(),this._clear()}_setSrc(){let e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()}_clear(){let e=this._getFrame();e.src="",e.innerHTML=""}_getFrame(){let e=document.getElementById(`${this.frameIdValue}`);if(null==e)throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);if(we(e))return e;throw new Error(`Element targeted by ID '${this.frameIdValue}'`)}_getSrc(){let e=this.el;if(this.hasSrcValue)return this.srcValue;if(x(e))return e.href;throw new Error("No link given to drive frame to")}}ye.values={frameId:String,src:String,loadingMessage:String};class Ve extends n{constructor(){super(...arguments),this._timeoutHandle=null}get _poll(){return!!this.hasPollValue&&this.pollValue}initialize(){this.refresh=this.refresh.bind(this)}connect(){let e=this.el;if(!we(e))throw new Error("Expected controller to be mounted on a element.");if(e.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(()=>this._timeoutHandle=setTimeout(()=>this.refresh(),this.intervalValue))}disconnect(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}refresh(e){null==e||e.preventDefault();let t=this.el;t.src=t.src}}Ve.values={interval:Number,poll:Boolean};class Te extends n{initialize(){this.updateWordCount=this.updateWordCount.bind(this)}connect(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)}disconnect(){this.inputTarget.removeEventListener("input",this.updateWordCount)}updateWordCount(){let e=0,t=this.inputTarget.value.match(/\S+/g);e=t&&t.length||0,this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))}_isValidCount(e){let t=0,s=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(s=this.maxValue),e>=t&&e<=s}}Te.targets=["input","output"],Te.values={min:Number,max:Number},Te.classes=["error"];export{l as AnchorSpyController,o as AppearanceController,h as AsyncBlockController,c as AutoSubmitFormController,T as AutosizeController,L as CharCountController,k as CheckboxSelectAllController,S as ClipboardController,N as ConfirmController,O as ConfirmNavigationController,H as DebugController,z as DetectDirtyController,$ as DetectDirtyFormController,R as DisableInputsController,B as DisableWithController,F as DismissableController,q as ElementSaveController,j as EmptyDomController,P as EnableInputsController,W as FallbackImageController,U as FormRcController,J as FormSaveController,Y as IntersectionController,G as LazyBlockController,ee as LightboxImageController,te as LimitedSelectionCheckboxesController,se as MediaPlayerController,ie as NestedFormController,ae as PasswordConfirmController,re as PasswordPeekController,ne as RemoteFormController,oe as ResponsiveIframeBodyController,le as ResponsiveIframeWrapperController,ce as ScrollIntoFocusController,de as ScrollToBottomController,ue as ScrollToController,me as ScrollToTopController,ge as SelfDestructController,pe as StickyController,ve as TableSortController,fe as TableTruncateController,_e as TeleportController,be as TimeoutController,Ee as ToggleClassController,ye as TurboFrameRCController,Ve as TurboFrameRefreshController,Te as WordCountController}; //# sourceMappingURL=stimulus-library.modern.js.map diff --git a/dist/stimulus-library.modern.js.map b/dist/stimulus-library.modern.js.map index cc6f6da1..742480e0 100644 --- a/dist/stimulus-library.modern.js.map +++ b/dist/stimulus-library.modern.js.map @@ -1 +1 @@ -{"version":3,"file":"stimulus-library.modern.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","Controller","constructor","context","super","Proxy","this","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","el","element","dispatch","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","AnchorSpyController","_key","keyValue","replaceAll","_anchor","window","location","hash","substr","value","initialize","_checkAnchor","bind","connect","requestAnimationFrame","addEventListener","disconnect","removeEventListener","write","preventDefault","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","_errorMessage","hasErrorMessageValue","errorMessageValue","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","catch","err","finally","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_checked","checkboxTargets","filter","checkbox","checked","_unchecked","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxesCount","checkboxesCheckedCount","indeterminate","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","_message","hasMessageValue","messageValue","confirm","Error","message","ConfirmNavigationController","_messageValue","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","DebugController","testTargets","DetectDirtyController","_cacheAttrName","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","_timeout","hasTimeoutValue","timeoutValue","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_enable","str","undefined","timeout","DismissableController","dismiss","ElementSaveController","_id","hasIdValue","idValue","elementID","_uniqueIdentifier","href","_restoreOnLoad","hasRestoreOnLoadValue","restoreOnLoadValue","_element","hasElementTarget","elementTarget","localStorage","removeItem","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","restoreOnLoad","EmptyDomController","emptyClasses","emptyClass","notEmptyClasses","notEmptyClass","_children","hasScopeSelectorValue","scopeSelectorValue","childList","checkEmpty","mutate","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","hasNotEmptyClass","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_formID","_formIdentifier","elements","_formData","_clearOnSubmit","hasClearOnSubmitValue","clearOnSubmitValue","_clear","clearOnSubmit","IntersectionController","_threshold","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","threshold","disappear","LazyBlockController","smoothSupported","documentElement","smoothPolyfilled","scrollToElement","behavior","block","inline","async","polyfill","polyfillSmooth","scrollIntoView","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","_src","hasSrcValue","srcValue","_srcSet","hasSrcSetValue","srcSetValue","srcset","_sizes","hasSizesValue","sizesValue","sizes","_modalClassName","hasModalClass","modalClass","_imageClassName","hasImageClass","imageClass","open","close","_dialog","image","className","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","showModal","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","mediaTarget","play","pause","restart","currentTime","seek","NestedFormController","_wrapperClass","hasWrapperSelectorValue","wrapperClassValue","_insertMode","hasInsertModeValue","insertModeValue","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","wrapper","closest","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","_selector","status","xhr","Node","new_element","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","_mode","createMagicElement","_magicElement","intersectionRatio","hasStuckClass","stuckClass","TableSortController","_tableHead","head","tHead","_tableHeaders","rows","cells","_tableBody","tBodies","_tableRows","sort","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","row","otherRow","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","startSort","TableTruncateController","_truncated","hasTruncatedValue","truncatedValue","_limit","hasLimitValue","limitValue","truncate","expand","showMoreTarget","_hideElement","_showElement","_reTruncate","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","_poll","hasPollValue","pollValue","refresh","intervalValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"stimulus-library.modern.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TimeoutController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeoutHandle: null | number = null;\r\n\r\n initialize() {\r\n this._timeout = this._timeout.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._timeoutHandle = window.setTimeout(this._timeout, this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeoutHandle) {\r\n window.clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n\r\n _timeout() {\r\n this.dispatch(this.el, \"timeout\");\r\n }\r\n\r\n}","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","Controller","constructor","context","super","Proxy","this","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","el","element","dispatch","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","AnchorSpyController","_key","keyValue","replaceAll","_anchor","window","location","hash","substr","value","initialize","_checkAnchor","bind","connect","requestAnimationFrame","addEventListener","disconnect","removeEventListener","write","preventDefault","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","_errorMessage","hasErrorMessageValue","errorMessageValue","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","catch","err","finally","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_checked","checkboxTargets","filter","checkbox","checked","_unchecked","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxesCount","checkboxesCheckedCount","indeterminate","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","_message","hasMessageValue","messageValue","confirm","Error","message","ConfirmNavigationController","_messageValue","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","DebugController","testTargets","DetectDirtyController","_cacheAttrName","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","_timeout","hasTimeoutValue","timeoutValue","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_enable","str","undefined","timeout","DismissableController","dismiss","ElementSaveController","_id","hasIdValue","idValue","elementID","_uniqueIdentifier","href","_restoreOnLoad","hasRestoreOnLoadValue","restoreOnLoadValue","_element","hasElementTarget","elementTarget","localStorage","removeItem","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","restoreOnLoad","EmptyDomController","emptyClasses","emptyClass","notEmptyClasses","notEmptyClass","_children","hasScopeSelectorValue","scopeSelectorValue","childList","checkEmpty","mutate","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","hasNotEmptyClass","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_formID","_formIdentifier","elements","_formData","_clearOnSubmit","hasClearOnSubmitValue","clearOnSubmitValue","_clear","clearOnSubmit","IntersectionController","_threshold","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","threshold","disappear","LazyBlockController","smoothSupported","documentElement","smoothPolyfilled","scrollToElement","behavior","block","inline","async","polyfill","polyfillSmooth","scrollIntoView","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","_src","hasSrcValue","srcValue","_srcSet","hasSrcSetValue","srcSetValue","srcset","_sizes","hasSizesValue","sizesValue","sizes","_modalClassName","hasModalClass","modalClass","_imageClassName","hasImageClass","imageClass","open","close","_dialog","image","className","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","showModal","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","mediaTarget","play","pause","restart","currentTime","seek","NestedFormController","_wrapperClass","hasWrapperSelectorValue","wrapperClassValue","_insertMode","hasInsertModeValue","insertModeValue","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","wrapper","closest","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","_selector","status","xhr","Node","new_element","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","_mode","createMagicElement","_magicElement","intersectionRatio","hasStuckClass","stuckClass","TableSortController","_tableHead","head","tHead","_tableHeaders","rows","cells","_tableBody","tBodies","_tableRows","sort","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","row","otherRow","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","startSort","TableTruncateController","_truncated","hasTruncatedValue","truncatedValue","_limit","hasLimitValue","limitValue","truncate","expand","showMoreTarget","_hideElement","_showElement","_reTruncate","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","TimeoutController","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","_poll","hasPollValue","pollValue","refresh","intervalValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"6WAEaA,UAAuBC,EAElCC,YAAYC,GAEV,OADAC,MAAMD,OACKE,MAAMC,KAAM,CACrBC,IAAK,CAACC,EAAKC,KACT,IAAIC,EAAYC,QAAQJ,IAAIC,EAAKC,GAC7BG,EAAON,KACX,GA4DR,SAAqBG,GACnB,OAAQA,GACN,IAAK,cACL,IAAK,KACL,IAAK,UACL,IAAK,cACL,IAAK,aACL,IAAK,MACL,IAAK,WACL,IAAK,WACL,IAAK,OACL,IAAK,qBACL,IAAK,SACL,IAAK,aACH,SAGJ,QAAI,SAASI,KAAKJ,IAGd,kBAAkBI,KAAKJ,IAGvB,aAAaI,KAAKJ,IAGlB,oBAAoBI,KAAKJ,IAGzB,aAAaI,KAAKJ,IAGlB,eAAeI,KAAKJ,IA5FdK,CAAYL,EAAKM,YAAa,CAChC,GAAwB,mBAAbL,EACT,WAAWL,MAAMK,EAAW,CAC1BM,MAAK,CAACC,EAAaC,EAAcC,KAC/BP,EAAKQ,IAAIX,EAAKM,WAAY,CACxBM,KAAMF,IAEDR,QAAQK,MAAMC,EAAQC,EAASC,MAI1Cb,KAAKc,IAAIX,EAAKM,YAGlB,OAAOL,KAKbY,SACE,YAAYC,QAGdC,SAASD,EAAsBE,EAAmBC,EAA2B,IAC3E,IAAIC,EAAgBC,OAAOC,OAAO,GAAI,CAACC,SAAS,EAAMC,YAAY,EAAMC,OAAQ,CAACf,OAAQM,IAAWG,GAC9FC,EAAcK,OAAOf,SACzBU,EAAcK,OAAOf,OAASM,GAEhC,IAAIU,EAAQ,IAAIC,YAAYT,EAAWE,GACvCrB,KAAK6B,SAASV,EAAWQ,EAAOV,GAChCA,EAAQa,cAAcH,GAGxBb,IAAIiB,EAAsBhB,EAAW,IAEnC,IAAKf,KAAKgC,YAAYC,MACpB,OAEF,IAAIC,EAASC,QACbD,EAAOE,oBAAoBpC,KAAKqC,iBAAiBN,IAAgB,iBAAkB,gBACnFG,EAAOpB,OACLG,QAASjB,KAAKiB,SACXF,IAELmB,EAAOI,WAGTT,SAASV,EAAmBQ,EAAoBV,GAE9C,IAAKjB,KAAKgC,YAAYC,MACpB,OAEF,IAAIC,EAASC,QACbD,EAAOE,oBAAoBpC,KAAKqC,gBAAgBlB,MAAe,iBAAkB,iBAAkB,gBACnGe,EAAOpB,IAAI,CAACG,QAAAA,IACZiB,EAAOI,kBC/DEC,UAA4B7C,EAKvC8C,WACE,YAAYC,SAASC,WAAW,IAAK,IAGvCC,cACE,OAAOC,OAAOC,SAASC,KAAKC,OAAO,GAGrCJ,YAAYK,GACVJ,OAAOC,SAASC,KAAOE,EAGzBC,aACEjD,KAAKkD,aAAelD,KAAKkD,aAAaC,KAAKnD,MAG7CoD,UACEC,sBAAsB,KACpBrD,KAAKkD,eACLN,OAAOU,iBAAiB,aAActD,KAAKkD,gBAI/CK,aACEX,OAAOY,oBAAoB,aAAcxD,KAAKkD,cAGhDO,MAAM9B,SACJA,GAAAA,EAAO+B,iBACP1D,KAAK2C,QAAU3C,KAAKwC,KAGdU,eAEJlD,KAAKkB,SAASlB,KAAKgB,GADjBhB,KAAKwC,OAASxC,KAAK2C,QACE,oBAEA,wBAxCpBJ,SAAS,CAACoB,IAAKC,cCDXC,UAA6BnE,EAExCuD,aACEjD,KAAK8D,kBAAoB9D,KAAK8D,kBAAkBX,KAAKnD,MAGvDoD,UACER,OAAOU,iBAAiB,QAAStD,KAAK8D,mBACtClB,OAAOU,iBAAiB,OAAQtD,KAAK8D,mBACrCC,SAAST,iBAAiB,mBAAoBtD,KAAK8D,mBACnDT,sBAAsB,KACpBrD,KAAK8D,sBAITP,aACEX,OAAOY,oBAAoB,QAASxD,KAAK8D,mBACzClB,OAAOY,oBAAoB,OAAQxD,KAAK8D,mBACxCC,SAASP,oBAAoB,mBAAoBxD,KAAK8D,mBAGxDE,SACEhE,KAAKkB,SAASlB,KAAKgB,GAAI,qBAGzBiD,OACEjE,KAAKkB,SAASlB,KAAKgB,GAAI,mBAGjB8C,oBACN9D,KAAKkE,oBAAsBlE,KAAKgE,SAAWhE,KAAKiE,OAG1CC,oBACN,MAAmC,WAA5BH,SAASI,iBAAgCJ,SAASK,kBClChDC,UAA6B3E,EAcxC4E,oBACE,YAAYC,qBAAuBvE,KAAKwE,kBAAoB,8BAM9DpB,UACEpD,KAAKyE,cAGPA,cACE,IAAInE,EAAON,KACPgB,EAAKhB,KAAK0E,iBAAmB1E,KAAK2E,cAAgB3E,KAAKgB,GAC3D4D,MAAM5E,KAAK6E,eACVC,KAAMC,GAAaA,EAASC,QAC5BF,KAAMG,IACL,IAAIC,EAAQnB,SAASoB,cAAc,OAEnC,GADAD,EAAME,UAAYH,EACdjF,KAAKqF,iBAAkB,CACzB,IAAIC,EAAkBJ,EAAMK,iBAAiBvF,KAAKwF,eAClDxE,EAAGyE,eAAeH,QAElBtE,EAAGyE,eAAeP,EAAMQ,UAG1BpF,EAAKY,SAASF,EAAI,kBAEnB2E,MAAMC,IACL5E,EAAGyE,YAAYzF,KAAKsE,eACpBhE,EAAKY,SAASF,EAAI,gBAEnB6E,QAAQ,KACPvF,EAAKY,SAASF,EAAI,oBA9CfqD,UAAU,CAAC,WACXA,SAAS,CAACyB,SAAUlC,OAAQmC,aAAcnC,OAAQoC,SAAUpC,cCFxDqC,UAAiCvG,EAE5CuD,aACEjD,KAAKkG,OAASlG,KAAKkG,OAAO/C,KAAKnD,MAGjCoD,UACEpD,KAAKgB,GAAGuE,iBAAiB,2BAA2BY,QAAQnF,GAAMA,EAAGsC,iBAAiB,SAAUtD,KAAKkG,SAGvG3C,aACEvD,KAAKgB,GAAGuE,iBAAiB,2BAA2BY,QAAQnF,GAAMA,EAAGwC,oBAAoB,SAAUxD,KAAKkG,SAGlGA,SAENlG,KAAKkB,SAAUlB,KAAKgB,GAAK,WClBtB,MAAMoF,EAAS,CAACC,EAAYC,KAC/B,MAAMF,EAASC,EAAWC,GAC1B,MAAqB,mBAAVF,EACAA,EAGA,IAAIrF,QAGNwF,EAAmB,CAACC,EAAMH,EAAYI,KAC/C,IAAIC,EAAeF,EAOnB,OANoB,IAAhBC,EACAC,EAAe,GAAGL,EAAWhE,cAAcmE,IAEf,iBAAhBC,IACZC,EAAe,GAAGD,KAAeD,KAE9BE,GAEEC,EAAgB,CAACC,EAAMjF,EAAOD,KACvC,MAAMF,QAAEA,EAAOC,WAAEA,EAAUoF,SAAEA,GAAalF,GAAS,CAAEH,SAAS,EAAMC,YAAY,EAAMoF,UAAU,GAUhG,OATIlF,GACAL,OAAOC,OAAOG,EAAQ,CAAEoF,cAAenF,IAEvB,IAAIC,YAAYgF,EAAM,CACtCpF,QAAAA,EACAC,WAAAA,EACAoF,SAAAA,EACAnF,OAAAA,KC3BFqF,EAAiB,CACnBjF,eAAe,EACf2E,aAAa,GAEJO,EAAkB,CAACX,EAAYjF,EAAU,MAClD,MAAMU,cAAEA,EAAa2E,YAAEA,GAAgBnF,OAAOC,OAAO,GAAIwF,EAAgB3F,GACnE6F,GAAiB7F,MAAAA,OAAyC,EAASA,EAAQH,UAAYoF,EAAWpF,QAgClGiG,EAAuBb,EAAW9C,WAAWJ,KAAKkD,GAClDc,EAAW,IAAIC,qBAhCHC,IACd,MAAOC,GAASD,EACZC,EAAMC,eAOS,CAACD,IAIpB,GAHAjB,EAAWmB,WAAY,EACvBpB,EAAOC,EAAY,UAAUoB,KAAKpB,EAAYiB,GAE1CxF,EAAe,CACf,MAAMX,EAAYoF,EAAiB,SAAUF,EAAYI,GACnDiB,EAAcf,EAAcxF,EAAW,KAAM,CAAEkF,WAAAA,EAAYiB,MAAAA,IACjEL,EAAcnF,cAAc4F,KAb5BC,CAAeL,GAEVjB,EAAWmB,WAcE,CAACF,IAIvB,GAHAjB,EAAWmB,WAAY,EACvBpB,EAAOC,EAAY,aAAaoB,KAAKpB,EAAYiB,GAE7CxF,EAAe,CACf,MAAMX,EAAYoF,EAAiB,YAAaF,EAAYI,GACtDmB,EAAiBjB,EAAcxF,EAAW,KAAM,CAAEkF,WAAAA,EAAYiB,MAAAA,IACpEL,EAAcnF,cAAc8F,KApB5BC,CAAkBP,IA0B0BlG,GAC9C0G,EAAU,KACZX,EAASW,QAAQb,IAEfc,EAAY,KACdZ,EAASY,UAAUd,IAUvB,OARA3F,OAAOC,OAAO8E,EAAY,CACtBmB,WAAW,EACXQ,aACID,IACAb,OAGRY,IACO,CAACA,EAASC,ICtDfhB,EAAiB,CACnBkB,OAAQ,CAAC,QAAS,YAClBC,aAAa,EACbpG,eAAe,EACf2E,aAAa,GCLXM,EAAiB,CACnB9E,OAAO,EACPC,OAAQC,SAEL,MAAMgG,EACTH,YAAY3B,EAAYjF,EAAU,IAC9B,IAAIgH,EAAIC,EAAIC,EACZtI,KAAKc,IAAM,CAACiB,EAAchB,KACjBf,KAAKiC,QAEVjC,KAAKkC,OAAOE,eAAe,KAAKpC,KAAKqG,WAAWhE,iBAAiBN,IAAgB,iBAAkB,gBACnG/B,KAAKkC,OAAOpB,IAAIQ,OAAOC,OAAO,CAAEgH,aAAcvI,KAAKuI,cAAgBxH,IACnEf,KAAKkC,OAAOI,aAEhBtC,KAAKiC,MAAmK,QAA1JoG,EAAgF,QAA1ED,EAAKhH,MAAAA,OAAyC,EAASA,EAAQa,aAA0B,IAAPmG,EAAgBA,EAAK/B,EAAWrE,YAAYwG,wBAAqC,IAAPH,EAAgBA,EAAKtB,EAAe9E,MACpNjC,KAAKkC,OAAqF,QAA3EoG,EAAKlH,MAAAA,OAAyC,EAASA,EAAQc,cAA2B,IAAPoG,EAAgBA,EAAKvB,EAAe7E,OACtIlC,KAAKqG,WAAaA,EAClBrG,KAAKuI,aAAelC,EAAWpF,QAAQwH,IAAMpC,EAAWpF,QAAQyH,QAAQD,GAExEzI,KAAK2I,qBAAuBtC,EAAWpD,WAAWE,KAAKkD,GACvDrG,KAAK4I,kBAAoBvC,EAAWjD,QAAQD,KAAKkD,GACjDrG,KAAKkH,qBAAuBb,EAAW9C,WAAWJ,KAAKkD,ICnBxD,MAAMwC,UAAiBV,EAC1BH,YAAY3B,EAAYjF,EAAU,IAC9BtB,MAAMuG,EAAYjF,GAClBpB,KAAK8H,QAAU,KACX9H,KAAKiH,cAAc3D,iBAAiB,aAActD,KAAK8I,SACvD9I,KAAKiH,cAAc3D,iBAAiB,aAActD,KAAK+I,UAE3D/I,KAAK+H,UAAY,KACb/H,KAAKiH,cAAczD,oBAAoB,aAAcxD,KAAK8I,SAC1D9I,KAAKiH,cAAczD,oBAAoB,aAAcxD,KAAK+I,UAE9D/I,KAAK8I,QAAU,KACX1C,EAAOpG,KAAKqG,WAAY,cAAcoB,KAAKzH,KAAKqG,YAChDrG,KAAKc,IAAI,aAAc,CAAEkI,OAAO,KAEpChJ,KAAK+I,QAAU,KACX3C,EAAOpG,KAAKqG,WAAY,cAAcoB,KAAKzH,KAAKqG,YAChDrG,KAAKc,IAAI,aAAc,CAAEkI,OAAO,KAEpChJ,KAAKiH,eAAiB7F,MAAAA,OAAyC,EAASA,EAAQH,UAAYoF,EAAWpF,QACvGjB,KAAKqG,WAAaA,EAClBrG,KAAKiJ,oBACLjJ,KAAK8H,UAETE,oBACI,MAAMd,EAAuBlH,KAAKqG,WAAW9C,WAAWJ,KAAKnD,KAAKqG,YAKlE/E,OAAOC,OAAOvB,KAAKqG,WAAY,CAAE9C,WAJd,KACfvD,KAAK+H,YACLb,QC5BL,MAAMgC,UAAoBf,EAC7BH,YAAY3B,EAAYjF,EAAU,IAC9BtB,MAAMuG,EAAYjF,GAClBpB,KAAK8H,QAAU,KACX,IACI9H,KAAKmH,SAASW,QAAQ9H,KAAKiH,cAAejH,KAAKoB,SAEnD,MAAO+H,GACHnJ,KAAKqG,WAAWrE,YAAYoH,YAAYD,EAAO,gFAAiF,MAGxInJ,KAAK+H,UAAY,KACb/H,KAAKmH,SAAS5D,cAElBvD,KAAKqJ,SAAYhC,IACbjB,EAAOpG,KAAKqG,WAAY,UAAUoB,KAAKzH,KAAKqG,WAAYgB,GACxDrH,KAAKc,IAAI,SAAU,CAAEuG,QAAAA,KAEzBrH,KAAKiH,eAAiB7F,MAAAA,OAAyC,EAASA,EAAQH,UAAYoF,EAAWpF,QACvGjB,KAAKqG,WAAaA,EAClBrG,KAAKoB,QAAUA,EACfpB,KAAKmH,SAAW,IAAImC,iBAAiBtJ,KAAKqJ,UAC1CrJ,KAAKiJ,oBACLjJ,KAAK8H,UAETE,oBACI,MAAMd,EAAuBlH,KAAKqG,WAAW9C,WAAWJ,KAAKnD,KAAKqG,YAKlE/E,OAAOC,OAAOvB,KAAKqG,WAAY,CAAE9C,WAJd,KACfvD,KAAK+H,YACLb,QAKL,MAAMqC,EAAc,CAAClD,EAAYjF,EAAU,MAC9C,MAAM+F,EAAW,IAAI+B,EAAY7C,EAAYjF,GAC7C,MAAO,CAAC+F,EAASW,QAASX,EAASY,YCrC1ByB,EAAmBnD,IAC5B,MAAMoD,EAAY9H,IACd,MAAM+H,WAAEA,EAAUC,YAAEA,GAAgB/G,OAC9BgH,EAAU,CACZC,OAAQF,GAAeG,SACvBC,MAAOL,GAAcI,SACrBnI,MAAAA,GAEJyE,EAAOC,EAAY,gBAAgBoB,KAAKpB,EAAYuD,IAElD1C,EAAuBb,EAAW9C,WAAWJ,KAAKkD,GAClDyB,EAAU,KACZlF,OAAOU,iBAAiB,SAAUmG,GAClCA,KAEE1B,EAAY,KACdnF,OAAOY,oBAAoB,SAAUiG,IASzC,OAPAnI,OAAOC,OAAO8E,EAAY,CACtB2B,aACID,IACAb,OAGRY,IACO,CAACA,EAASC,ICrBfiC,EAAW,CAACC,EAAIC,EADF,OAEhB,IAAIC,EAAY,KAChB,OAAO,WACH,MAAMpJ,EAAOqJ,UACPvK,EAAUG,KACVyJ,EAAW,IAAMQ,EAAGvJ,MAAMb,EAASkB,GACrCoJ,GACAE,aAAaF,GAEjBA,EAAYG,WAAWb,EAAUS,WCX5BK,UAA2B7K,EAEtCuD,aACEjD,KAAKwK,SAAWxK,KAAKwK,SAASrH,KAAKnD,MAGrCoD,UACEoG,EAAgBxJ,MAChBqD,sBAAsB,KACpBrD,KAAKwK,WACL,IAAI7J,EAASX,KAAKgB,GAClBL,EAAO8J,MAAMC,OAAS,OACtB/J,EAAO8J,MAAME,UAAY,aACzBhK,EAAO2C,iBAAiB,QAAStD,KAAKwK,UACtC7J,EAAO2C,iBAAiB,QAAStD,KAAKwK,YAI1CjH,aACEvD,KAAKgB,GAAGwC,oBAAoB,QAASxD,KAAKwK,UAC1CxK,KAAKgB,GAAGwC,oBAAoB,QAASxD,KAAKwK,UAG5CI,eACE5K,KAAKwK,WAGCA,WACNxK,KAAK6K,SAAS7K,KAAKgB,IAGb6J,SAAS5J,GACf,IAAI6J,EAAS7J,EAAQ8J,aAAe9J,EAAQ+J,aAC5C/J,EAAQwJ,MAAMZ,OAAS,OACvB5I,EAAQwJ,MAAMZ,OAAS5I,EAAQgK,aAAeH,EAAS,YCnC9CI,UAA4BxL,EAevCuD,aACEjD,KAAKmL,iBAAmBnL,KAAKmL,iBAAiBhI,KAAKnD,MAGrDoD,UACEC,sBAAsB,KACpBrD,KAAKoL,YAAY9H,iBAAiB,QAAStD,KAAKmL,kBAChDnL,KAAKmL,qBAIT5H,aACEvD,KAAKoL,YAAY5H,oBAAoB,QAASxD,KAAKmL,kBAG7CA,mBACN,IAAIE,EAAYrL,KAAKoL,YAAYpI,MAAMsI,OACvCtL,KAAKuL,aAAaC,UAAYH,EAAU5K,WACpCT,KAAKyL,gBACHzL,KAAK0L,cAAcL,GACrBrL,KAAKuL,aAAaI,UAAUC,OAAO5L,KAAK6L,YAExC7L,KAAKuL,aAAaI,UAAUG,IAAI9L,KAAK6L,aAKnCH,cAAcK,GACpB,IAAIC,EAAM,EACNC,EAAM,MAUV,OARIjM,KAAKkM,cACPF,EAAMhM,KAAKmM,UAGTnM,KAAKoM,cACPH,EAAMjM,KAAKqM,UAGNN,GAASC,GAAOD,GAASE,GApD3Bf,UAAU,CAAC,QAAS,UACpBA,SAAS,CAACc,IAAKM,OAAQL,IAAKK,QAC5BpB,UAAU,CAAC,eCJPqB,UAAoC7M,EAO/C8M,eACE,YAAYC,gBAAgBC,OAAOC,GAAYA,EAASC,SAG1DC,iBACE,YAAYJ,gBAAgBC,OAAOC,IAAaA,EAASC,SAG3D3J,aACEjD,KAAK8M,QAAU9M,KAAK8M,QAAQ3J,KAAKnD,MACjCA,KAAK+M,SAAW/M,KAAK+M,SAAS5J,KAAKnD,MAGrCoD,UACEC,sBAAsB,KACfrD,KAAKgN,qBAIVhN,KAAKiN,gBAAgB3J,iBAAiB,SAAUtD,KAAK8M,SACrD9M,KAAKyM,gBAAgBtG,QAAQwG,GAAYA,EAASrJ,iBAAiB,SAAUtD,KAAK+M,WAClF/M,KAAK+M,cAITxJ,aACOvD,KAAKgN,qBAIVhN,KAAKiN,gBAAgBzJ,oBAAoB,SAAUxD,KAAK8M,SACxD9M,KAAKyM,gBAAgBtG,QAASwG,GAAaA,EAASnJ,oBAAoB,SAAUxD,KAAK+M,YAGjFD,QAAQnL,GACdA,EAAM+B,iBACN,IAAI/C,EAASgB,EAAMhB,OACnBX,KAAKyM,gBAAgBtG,QAASwG,GAAaA,EAASC,QAAUjM,EAAOiM,SAG/DG,WACN,MAAMG,EAAkBlN,KAAKyM,gBAAgBnB,OACvC6B,EAAyBnN,KAAKwM,SAASlB,OAE7CtL,KAAKiN,gBAAgBL,QAAUO,EAAyB,EACxDnN,KAAKiN,gBAAgBG,cAAgBD,EAAyB,GAAKA,EAAyBD,GAnDvFX,UAAU,CAAC,YAAa,kBCDpBc,UAA4B3N,EAAzCE,kCAcEI,iBAAa,EAEboD,UACEpD,KAAKsN,WAAavJ,SAASwJ,sBAAsB,QAE7CvN,KAAKwN,sBAAwBxN,KAAKyN,oBAChCzN,KAAKsN,YAActN,KAAK0N,kBAC1B1N,KAAK2N,eAAe/B,SACX5L,KAAK4N,eACd5N,KAAK6N,WAAWjC,UAKtBkC,OAAOnM,GACDA,GACFA,EAAM+B,iBAEP1D,KAAK+N,aAAwDD,SAGhEE,KAAKrM,GACCA,GACFA,EAAM+B,iBAEP1D,KAAK+N,aAAwDD,SAC1D9N,KAAKsN,YACPvJ,SAASkK,YAAY,kBCvCXC,EAAoBjN,GAClC,MAA2B,KAApBA,EAAQkN,kBAGDC,EAAkBnN,GAChC,MAA2B,QAApBA,EAAQkN,kBAGDE,EAAmBpN,GACjC,MAA2B,SAApBA,EAAQkN,kBAGDG,EAAoBrN,GAClC,MAA2B,UAApBA,EAAQkN,kBAGDI,EAAoBtN,GAClC,MAA2B,UAApBA,EAAQkN,kBAODK,EAAmBvN,GACjC,OAAOoN,EAAmBpN,KAA8B,UAAjBA,EAAQ2F,MAAqC,aAAjB3F,EAAQ2F,MDzBpEyG,UAAU,CAAC,SAAU,SAAU,OAAQ,YACvCA,SAAS,CAACoB,aAAcC,eEFpBC,UAA0BjP,EASrCkP,eACE,YAAYC,gBAAkB7O,KAAK8O,aAAe,gBAGpD7L,aACEjD,KAAK+O,QAAU/O,KAAK+O,QAAQ5L,KAAKnD,MAGnCoD,UACEC,sBAAsB,KACpB,IAAIpC,EAAUjB,KAAKgB,GACnB,GAAIoN,EAAkBnN,GACpBA,EAAQqC,iBAAiB,SAAUtD,KAAK+O,kBAC/Bb,EAAoBjN,GAG7B,UAAU+N,MAAM,iDAFhB/N,EAAQqC,iBAAiB,QAAStD,KAAK+O,YAO7CxL,aACE,IAAItC,EAAUjB,KAAKgB,GACfoN,EAAkBnN,GACpBA,EAAQuC,oBAAoB,SAAUxD,KAAK+O,SAClCb,EAAoBjN,IAC7BA,EAAQuC,oBAAoB,QAASxD,KAAK+O,SAI9CA,QAAQpN,GACAiB,OAAOmM,QAAQ/O,KAAK4O,YACxBjN,EAAM+B,iBACN1D,KAAKkB,SAASlB,KAAKgB,GAAI,uBAxCpB2N,SAAS,CACdM,QAASrL,cCJAsL,UAAoCxP,EAO/CkP,eACE,YAAYC,gBAAkB7O,KAAKmP,cAAgB,oEAGrDlM,aACEjD,KAAKoP,YAAcpP,KAAKoP,YAAYjM,KAAKnD,MACzCA,KAAKqP,kBAAoBrP,KAAKqP,kBAAkBlM,KAAKnD,MACrDA,KAAKsP,uBAAyBtP,KAAKsP,uBAAuBnM,KAAKnD,MAGjEoD,UACER,OAAO2M,eAAiB,IAAMvP,KAAK4O,SACnChM,OAAOU,iBAAiB,WAAYtD,KAAKqP,mBACzCzM,OAAOU,iBAAiB,SAAUtD,KAAKoP,aACvCxM,OAAOU,iBAAiB,0BAA2BtD,KAAKsP,wBACxD1M,OAAOU,iBAAiB,qBAAsBtD,KAAKsP,wBAGrD/L,aACEX,OAAOY,oBAAoB,WAAYxD,KAAKqP,mBAC5CzM,OAAO2M,eAAiB,KACxB3M,OAAOY,oBAAoB,SAAUxD,KAAKoP,aAC1CxM,OAAOY,oBAAoB,0BAA2BxD,KAAKsP,wBAC3D1M,OAAOY,oBAAoB,qBAAsBxD,KAAKsP,wBAGxDF,YAAYI,GACV5M,OAAOY,oBAAoB,WAAYxD,KAAKqP,mBAC5CzM,OAAO2M,eAAiB,KAG1BF,kBAAkBG,GAChB,SAGFF,uBAAuB3N,GAChBoN,QAAQ/O,KAAK4O,WAChBjN,EAAM+B,kBA1CHwL,SAAS,CAACN,SAAUhL,cCFhB6L,UAAwB/P,EAKnC0D,UACEjB,QAAQrB,IAAI,mBAAoBd,KAAMA,KAAK0P,cAJtCD,UAAU,CAAC,cCDPE,UAA8BjQ,EAEzCkQ,qBACE,MAAO,0BAGT3M,aACEjD,KAAK6P,YAAc7P,KAAK6P,YAAY1M,KAAKnD,MAG3CoD,UACE,IAAInC,EAAUjB,KAAKgB,GAEnBhB,KAAK8P,mBACL9P,KAAK6P,cACL5O,EAAQqC,iBAAiB,QAAStD,KAAK6P,aACvC5O,EAAQqC,iBAAiB,SAAUtD,KAAK6P,aAG1CtM,aACE,IAAItC,EAAUjB,KAAKgB,GACnBC,EAAQuC,oBAAoB,QAASxD,KAAK6P,aAC1C5O,EAAQuC,oBAAoB,SAAUxD,KAAK6P,aAG7CE,QAAQpO,SACNA,GAAAA,EAAO+B,iBACP1D,KAAKgQ,+BAGCC,mBACN,IAAIhP,EAAUjB,KAAKgB,GACnB,OAAOwN,EAAmBvN,GAAWA,EAAQ2L,QAAU3L,EAAQ+B,MAGzDkN,uBACN,IAAIjP,EAAUjB,KAAKgB,GACfgC,EAAQ/B,EAAQkP,aAAanQ,KAAK4P,gBACtC,OAAIpB,EAAmBvN,GACL,MAAT+B,EAAgB/B,EAAQmP,eAA0B,QAATpN,GAC7B,OAAVA,GAIPuL,EAAoBtN,IACRoP,MAAMC,KAAKrP,EAAQG,SACzB+E,QAASoK,IACf,GAAIA,EAAOC,gBAET,OADAvP,EAAQ+B,MAAQuN,EAAOvN,MAChBuN,EAAOvN,QARXA,GAgBHyN,6BAEN,OADczQ,KAAKgB,GACJ0P,aAAa1Q,KAAK4P,gBAG3BC,cACN,IAAI5O,EAAUjB,KAAKgB,GACfhB,KAAK2Q,kBACP1P,EAAQ2P,aAAa,aAAc,QAEnC3P,EAAQ4P,gBAAgB,cAIpBF,kBACN,YAAYV,qBAAuBjQ,KAAKkQ,uBAGlCF,+BACN,IAAI/O,EAAUjB,KAAKgB,GACf8P,EAAa7P,EAAQkP,aAAanQ,KAAK4P,gBAEvCpB,EAAmBvN,IACrBA,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ2L,QAAQnM,YAC1DQ,EAAQ2L,QAAwB,MAAdkE,EAAqB7P,EAAQmP,eAA+B,QAAdU,GACvDvC,EAAoBtN,GACX,MAAd6P,EACYT,MAAMC,KAAKrP,EAAQG,SACzB+E,QAASoK,IACXA,EAAOC,kBACTvP,EAAQ+B,MAAQuN,EAAOvN,SAK3B/B,EAAQ+B,MAAQ8N,EAIlB7P,EAAQ+B,MAAsB,MAAd8N,EAAqB7P,EAAQ8P,aAAeD,EAIxDhB,mBACN,IAAI7O,EAAUjB,KAAKgB,IACdhB,KAAKyQ,8BAAgCjC,EAAmBvN,GAC3DA,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ2L,QAAQnM,YAE1DQ,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ+B,MAAMvC,mBCzGjDuQ,UAAkCtR,EAE7CuR,oBACE,OAAOZ,MAAMC,KAAKtQ,KAAKgB,GAAGuE,iBAAiB,4BAG7CqK,qBACE,MAAO,0BAGT3M,aACEjD,KAAK6P,YAAc7P,KAAK6P,YAAY1M,KAAKnD,MAG3CoD,UACE,IAAInC,EAAUjB,KAAKgB,GAEnBhB,KAAK8P,mBACL9P,KAAK6P,cACL5O,EAAQqC,iBAAiB,QAAStD,KAAK6P,aACvC5O,EAAQqC,iBAAiB,SAAUtD,KAAK6P,aAG1CtM,aACE,IAAItC,EAAUjB,KAAKgB,GACnBC,EAAQuC,oBAAoB,QAASxD,KAAK6P,aAC1C5O,EAAQuC,oBAAoB,SAAUxD,KAAK6P,aAG7CE,QAAQpO,SACNA,GAAAA,EAAO+B,iBACP1D,KAAKiR,cAAc9K,QAAQlF,GAAWjB,KAAKgQ,6BAA6B/O,IAGlEgP,iBAAiBhP,GACvB,OAAOuN,EAAmBvN,GAAWA,EAAQ2L,QAAU3L,EAAQ+B,MAGzDkN,qBAAqBjP,GAC3B,IAAI+B,EAAQ/B,EAAQkP,aAAanQ,KAAK4P,gBACtC,OAAIpB,EAAmBvN,GACL,MAAT+B,EAAgB/B,EAAQmP,eAA0B,QAATpN,GAC7B,OAAVA,GAIPuL,EAAoBtN,IACRoP,MAAMC,KAAKrP,EAAQG,SACzB+E,QAASoK,IACf,GAAIA,EAAOC,gBAET,OADAvP,EAAQ+B,MAAQuN,EAAOvN,MAChBuN,EAAOvN,QARXA,GAgBHyN,2BAA2BxP,GACjC,OAAOA,EAAQyP,aAAa1Q,KAAK4P,gBAG3BsB,mBAAmBjQ,GACrBjB,KAAK2Q,gBAAgB1P,GACvBA,EAAQ2P,aAAa,aAAc,QAEnC3P,EAAQ4P,gBAAgB,cAIpBF,gBAAgB1P,GACtB,YAAYgP,iBAAiBhP,KAAajB,KAAKkQ,qBAAqBjP,GAG9DkQ,uBAAuBlQ,IACxBjB,KAAKyQ,2BAA2BxP,IAAYuN,EAAmBvN,GAClEA,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ2L,QAAQnM,YAE1DQ,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ+B,MAAMvC,YAIpDuP,6BAA6B/O,GACnC,IAAI6P,EAAa7P,EAAQkP,aAAanQ,KAAK4P,gBAEvCpB,EAAmBvN,IACrBA,EAAQ2P,aAAa5Q,KAAK4P,eAAgB3O,EAAQ2L,QAAQnM,YAC1DQ,EAAQ2L,QAAwB,MAAdkE,EAAqB7P,EAAQmP,eAA+B,QAAdU,GACvDvC,EAAoBtN,GACX,MAAd6P,EACYT,MAAMC,KAAKrP,EAAQG,SACzB+E,QAASoK,IACXA,EAAOC,kBACTvP,EAAQ+B,MAAQuN,EAAOvN,SAK3B/B,EAAQ+B,MAAQ8N,EAIlB7P,EAAQ+B,MAAsB,MAAd8N,EAAqB7P,EAAQ8P,aAAeD,EAIxDhB,mBACN9P,KAAKiR,cAAc9K,QAAQnF,GAAMhB,KAAKmR,uBAAuBnQ,IAGvD6O,cACN7P,KAAKiR,cAAc9K,QAAQnF,GAAMhB,KAAKkR,mBAAmBlQ,IACrDhB,KAAKiR,cAAcG,KAAKpQ,GAAcA,EAS7B0P,aAAa,eARxB1Q,KAAKgB,GAAG4P,aAAa,aAAc,QAEnC5Q,KAAKgB,GAAG6P,gBAAgB,qBCrHjBQ,UAAgC3R,EAc3C0D,UACEpD,KAAKsR,SAGPA,SACMtR,KAAKuR,mBAAqBvR,KAAKwR,eAAe5E,QAChD5M,KAAKyR,gBAELzR,KAAK0R,eAITD,gBACE,IAAIE,EAAc3R,KAAK4R,eAAiB5R,KAAK6R,WAC7C7R,KAAK8R,eAAe3L,QAAQ,CAACnF,EAAI+Q,KAC3BJ,IACF3Q,EAAGgC,MAAQ,IAEbhC,EAAGgR,UAAW,IAIlBN,eACE1R,KAAK8R,eAAe3L,QAAQ,CAACnF,EAAI+Q,KAC/B/Q,EAAGgR,UAAW,KApCXX,UAAU,CAAC,WAAY,WAEvBA,SAAS,CACdY,MAAOvD,eCJEwD,UAA8BxS,EAezCkP,eACE,YAAYC,gBAAkB7O,KAAK8O,aAAe,gBAGpDqD,eACE,YAAYC,gBAAkBpS,KAAKqS,aAAe,IAGpDpP,aACEjD,KAAKsS,OAAStS,KAAKsS,OAAOnP,KAAKnD,MAC/BA,KAAKuS,QAAUvS,KAAKuS,QAAQpP,KAAKnD,MAGnCoD,UACEC,sBAAsB,KACpBrD,KAAKgB,GAAGsC,iBAAiB,QAAStD,KAAKuS,WAI3ChP,aACMvD,KAAKwS,gBACPnI,aAAarK,KAAKwS,gBAItBD,QAAQ5Q,GACN,IAAIV,EAAUjB,KAAKgB,GAEfhB,KAAKyS,YAAYxR,UACnBU,GAAAA,EAAO+B,uBACP/B,GAAAA,EAAO+Q,6BAEP1S,KAAK2S,WAAa3S,KAAK4S,WAAW3R,GAClCjB,KAAK6S,WAAW5R,EAASjB,KAAK4O,UAC9B5O,KAAK8S,SAAS7R,GACdqJ,WAAWtK,KAAKsS,OAAQtS,KAAKmS,WAIjCG,OAAO3Q,SACLA,GAAAA,EAAO+B,iBACP,IAAIzC,EAAUjB,KAAKgB,GACfhB,KAAKyS,YAAYxR,KACnBjB,KAAK6S,WAAW5R,EAASjB,KAAK2S,YAC9B3S,KAAK+S,QAAQ9R,IAIjBwR,YAAYzR,GACV,OAAKqN,EAAmBrN,IAAkB,UAAXA,EAAG4F,MAAqB0H,EAAoBtN,GAClEA,EAAGgR,SAEoB,QAAvBhR,EAAG0H,QAAQsJ,SAItBY,WAAW5R,GACT,OAAIqN,EAAmBrN,IAAkB,UAAXA,EAAG4F,KACxB5F,EAAGgC,MAEHhC,EAAGwK,UAIdqH,WAAW7R,EAAiBgS,GACtB3E,EAAmBrN,IAAkB,UAAXA,EAAG4F,KAC/B5F,EAAGgC,MAAQgQ,GACF1E,EAAoBtN,IAAOkN,EAAoBlN,MACxDA,EAAGwK,UAAYwH,GAInBF,SAAS9R,GACFqN,EAAmBrN,IAAkB,UAAXA,EAAG4F,MAAqB0H,EAAoBtN,GACzEA,EAAGgR,UAAW,EAEdhR,EAAG0H,QAAQsJ,SAAW,OAI1Be,QAAQ/R,GACFqN,EAAmBrN,IAAkB,UAAXA,EAAG4F,MAAoB0H,EAAoBtN,GACvEA,EAAGgR,UAAW,EAEdhR,EAAG0H,QAAQsJ,cAAWiB,GAjGnBf,SAAS,CACdjD,QAASrL,OACTsP,QAAS5G,cCLA6G,UAA8BzT,EAEzC0T,UACEpT,KAAKgB,GAAG4K,gBCDCyH,UAA8B3T,EAmBzC4T,UACE,GAAItT,KAAKuT,WACP,YAAYC,QAEd,IAAIC,EAAYzT,KAAKgB,GAAGyH,GAExB,GAAkB,KAAdgL,EACF,OAAOA,EAEP,UAAUzE,mFAAmFhP,KAAKqC,gEAItGqR,wBAEE,SADY7Q,SAAS8Q,QACJ3T,KAAKsT,MAGxBM,qBACE,YAAYC,uBAAwB7T,KAAK8T,mBAG3CC,eACE,YAAYC,iBAAmBhU,KAAKiU,cAAgBjU,KAAKgB,GAG3DoC,UACEC,sBAAsB,KAChBrD,KAAK4T,gBACP5T,KAAK+P,YAKXkC,MAAMtQ,GACAA,GACFA,EAAM+B,iBAERwQ,aAAaC,WAAWnU,KAAK0T,mBAC7B1T,KAAKkB,SAASlB,KAAK+T,iCAGrBK,KAAKzS,GACCA,GACFA,EAAM+B,iBAER,IAAIzC,EAAUjB,KAAK+T,SACfM,EAAarU,KAAKsU,gBAAgBC,MAAM,KACxCC,EAA+B,GACnCH,EAAWlO,QAASsO,GAAiBD,EAAKC,GAAQC,EAAKzT,EAASwT,IAChEP,aAAaS,QAAQ3U,KAAK0T,kBAAmBkB,KAAKC,UAAUL,IAC5DxU,KAAKkB,SAASD,+BAGhB8O,QAAQpO,GACFA,GACFA,EAAM+B,iBAER,IAAIzC,EAAUjB,KAAK+T,SACnB,GAAIG,aAAaY,QAAQ9U,KAAK0T,mBAAoB,CAChD,MAAMqB,EAAYH,KAAKI,MAAMd,aAAaY,QAAQ9U,KAAK0T,oBACvDpS,OAAO2T,KAAKF,GAAW5O,QAASsO,IAC9BS,EAAKjU,EAAwBwT,EAAMM,EAAUN,MAE/CzU,KAAKkB,SAASD,uCAEdjB,KAAKkB,SAASD,iCAnFXoS,UAAU,CACf,WAEKA,SAAS,CACd5K,GAAI7E,OACJyQ,WAAYzQ,OACZuR,cAAezG,eCTN0G,UAA2B1V,EAatC2V,mBACE,YAAYC,WAAWf,MAAM,KAG/BgB,sBACE,YAAYC,cAAcjB,MAAM,KAGlCkB,gBACE,IAAIxU,EAAUjB,KAAKgB,GACnB,OACSqP,MAAMC,KADXtQ,KAAK0V,sBACWzU,EAAQsE,iBAAiBvF,KAAK2V,oBAE9B1U,EAAQyE,UAI9BtC,UACEmG,EAAYvJ,KAAM,CAACiB,QAASjB,KAAKgB,GAAI4U,WAAW,IAChD5V,KAAK6V,aAGPC,OAAOzO,GACLrH,KAAK6V,aAGPA,aACE,IAAI5U,EAAUjB,KAAKgB,GACf0E,EAAW1F,KAAKyV,UACI,IAApB/P,EAAS4F,QACXtL,KAAK+V,yBACL/V,KAAKgW,mBACLhW,KAAKkB,SAASD,EAAwB,eAEtCjB,KAAKiW,sBACLjW,KAAKkW,sBACLlW,KAAKkB,SAASD,EAAwB,gBAAiB,CAACS,OAAQ,CAACqK,MAAOrG,EAAS4F,WAI7E4K,sBACFlW,KAAKmW,eACPnW,KAAKgB,GAAG2K,UAAUC,UAAU5L,KAAKqV,cAI7BY,sBACFjW,KAAKoW,kBACPpW,KAAKgB,GAAG2K,UAAUG,OAAO9L,KAAKuV,iBAI1BS,mBACFhW,KAAKmW,eACPnW,KAAKgB,GAAG2K,UAAUG,OAAO9L,KAAKqV,cAI1BU,yBACF/V,KAAKoW,kBACPpW,KAAKgB,GAAG2K,UAAUC,UAAU5L,KAAKuV,kBAvE9BH,UAAU,CAAC,QAAS,YACpBA,SAAS,CAACiB,cAAezS,cCJrB0S,UAA+B5W,EAc1C0D,UACEpD,KAAKsR,SAGPA,SACMtR,KAAKuW,kBAAoBvW,KAAKwW,cAAc5J,QAC9C5M,KAAK0R,eAEL1R,KAAKyR,gBAITA,gBACE,IAAIE,EAAc3R,KAAK4R,eAAiB5R,KAAK6R,WAC7C7R,KAAKyW,cAActQ,QAAQ,CAACnF,EAAI+Q,KAC1BJ,IACF3Q,EAAGgC,MAAQ,IAEbhC,EAAGgR,UAAW,IAIlBN,eACE1R,KAAKyW,cAActQ,QAAQ,CAACnF,EAAI+Q,KAC9B/Q,EAAGgR,UAAW,KApCXsE,UAAU,CAAC,UAAW,UAEtBA,SAAS,CACdrE,MAAOvD,eCLEgI,UAAgChX,EAO3C0D,UACE,IAAInC,EAAUjB,KAAKgB,GAEnBC,EAAQ0V,QAAU,KACZ3W,KAAK4W,oBACP3V,EAAQ4V,IAAM7W,KAAK8W,iBAEnB7V,EAAQwJ,MAAMsM,QAAU,SAZvBL,SAAS,CAACM,YAAapT,cCFnBqT,UAAyBvX,EAMpCwG,OAAOvE,SACLA,GAAAA,EAAO+B,iBACP1D,KAAKkB,SAASlB,KAAKkX,WAAY,UAC/BlX,KAAKkX,WAAWhR,SAGlBiR,MAAMxV,SACJA,GAAAA,EAAO+B,iBACP1D,KAAKkB,SAASlB,KAAKkX,WAAY,SAC/BlX,KAAKkX,WAAWC,SAbXF,UAAU,CAAC,cCKPG,UAA2B1X,EAetC2X,cACE,GAAIrX,KAAKuT,WACP,YAAYC,QAEd,IAAIC,EAAazT,KAAKgB,GAAuByH,GAE7C,GAAkB,KAAdgL,EACF,OAAOA,EAEP,UAAUzE,gFAAgFhP,KAAKqC,6DAInGiV,sBAEE,SADYzU,SAAS8Q,QACJ3T,KAAKqX,UAGxBpG,oBACE,YAAajQ,GAAuBuW,SAGtCC,gBACE,IAAIhD,EAAwB,CAACxM,CAAChI,KAAKsX,iBAAkB,IACrD,IAAK,MAAMrW,UAAgBgQ,cAAe,CACxC,IAAIjQ,EAAKC,EACLD,EAAGwF,KAAK8E,OAAS,IACf+C,EAAmBrN,IAAkB,YAAXA,EAAG4F,KAC/B4N,EAAKxU,KAAKsX,iBAAiBtW,EAAGwF,MAAQxF,EAAG4L,QAChCyB,EAAmBrN,IAAkB,SAAXA,EAAG4F,KAClC5F,EAAG4L,UACL4H,EAAKxU,KAAKsX,iBAAiBtW,EAAGwF,MAAQxF,EAAGgC,OAG3CwR,EAAKxU,KAAKsX,iBAAiBtW,EAAGwF,MAAQxF,EAAGgC,OAI/C,OAAOwR,EAGTZ,qBACE,YAAYC,uBAAwB7T,KAAK8T,mBAG3C2D,qBACE,YAAYC,uBAAwB1X,KAAK2X,mBAG3C1U,aACEjD,KAAK4X,OAAS5X,KAAK4X,OAAOzU,KAAKnD,MAGjCoD,UACEC,sBAAsB,KAEpB,IAAK+K,EADSpO,KAAKgB,IAEjB,UAAUgO,MAAM,wDAGdhP,KAAK4T,gBACP5T,KAAK+P,UAEH/P,KAAKyX,gBACPzX,KAAKgB,GAAGsC,iBAAiB,SAAUtD,KAAK4X,UAK9CrU,aACMvD,KAAKyX,gBACPzX,KAAKgB,GAAGwC,oBAAoB,SAAUxD,KAAK4X,QAI/CA,SACE1D,aAAaC,WAAWnU,KAAKsX,iBAC7BtX,KAAKkB,SAASlB,KAAKgB,wBAGrBiR,MAAMtQ,SACJA,GAAAA,EAAO+B,iBACP1D,KAAK4X,SAGPxD,KAAKzS,GACHA,EAAM+B,iBAENwQ,aAAaS,QAAQ3U,KAAKsX,gBAAiB1C,KAAKC,UADrC7U,KAAKwX,UAC+CxX,KAAKsX,mBACpEtX,KAAKkB,SAASlB,KAAKgB,6BAGrB+O,QAAQpO,GAEN,SADAA,GAAAA,EAAO+B,iBACHwQ,aAAaY,QAAQ9U,KAAKsX,iBAAkB,CAC9C,MAAMvC,EAAYH,KAAKI,MAAMd,aAAaY,QAAQ9U,KAAKsX,kBACvD,IAAK,MAAMrW,UAAgBgQ,cAAe,CACxC,IAAIjQ,EAAKC,EACLD,EAAGwF,QAAQuO,IACT1G,EAAmBrN,IAAkB,YAAXA,EAAG4F,KAC/B5F,EAAG4L,QAAUmI,EAAU/T,EAAGwF,MACjB6H,EAAmBrN,IAAkB,SAAXA,EAAG4F,KAClC5F,EAAGgC,OAAS+R,EAAU/T,EAAGwF,QAC3BxF,EAAG4L,SAAU,GAGf5L,EAAGgC,MAAQ+R,EAAU/T,EAAGwF,OAI9BxG,KAAKkB,SAASlB,KAAKgB,qCAEnBhB,KAAKkB,SAASlB,KAAKgB,+BA7HhBoW,SAAS,CACd3O,GAAI7E,OACJuR,cAAezG,QACfmJ,cAAenJ,eCXNoJ,UAA+BpY,EAQ1CqY,iBACE,OAAI/X,KAAKgY,uBACKC,eAAe1D,MAAM,KAAK2D,IAAIC,GAAO7L,OAAO8L,WAAWD,EAAIE,SAAS3L,OAAOyL,GAAOA,GAAO,GAAKA,GAAO,GAE1G,CAAC,EAAG,GAIf/U,UACE4D,EAAgBhH,KAAM,CACpBsY,UAAWtY,KAAK+X,WAChB9W,QAASjB,KAAKgB,KAIlBgD,OAAOsD,GACLtH,KAAKkB,SACHlB,KAAKgB,GACL,sBACA,CACEU,OAAQ,CACNT,QAASjB,KAAKgB,MAMtBuX,UAAUjR,GACRtH,KAAKkB,SACHlB,KAAKgB,GACL,yBACA,CACEU,OAAQ,CACNT,QAASjB,KAAKgB,OAvCf8W,SAAS,CAACQ,UAAW1U,cCFjB4U,UAA4BnU,EAOvCjB,UACE,IAAInC,EAAUjB,KAAKgB,GAEf,yBAA0B4B,QAC3B5C,KAAK8H,QAAS9H,KAAK+H,WAAaf,EAAgBhH,KAAM,CAACiB,QAAAA,EAASqX,UAAW,KAG5EtY,KAAKyE,cAITT,OAAOsD,GACDA,EAAM3G,SAAWX,KAAKgB,IAAMsG,EAAMC,iBACpCvH,KAAKyE,cACDzE,KAAK+H,WACP/H,KAAK+H,cCzBb,MAAM0Q,EAAkB,mBAAoB1U,SAAS2U,gBAAgBjO,MACrE,IAAIkO,iBAEkBC,EAAgB3X,GAAkB4X,SAACA,EAAW,SAAZC,MAAsBA,EAAQ,QAA9BC,OAAuCA,EAAS,WAAoC,IAC1H,UAAZF,GAAyBJ,SAM/BO,iBACE,MAAMC,SAACA,gBAAyE,yBAC5EN,IAGJA,GAAmB,EACnBM,KAXQC,GAERjY,EAAQkY,eAAe,CAACN,SAAAA,EAAUC,MAAAA,EAAOC,OAAAA,aAY3BK,EAAgBC,GAC9B,IAAKA,EACH,YAEF,MAAMC,EAAYC,iBAAiBF,GAAMC,UAGzC,MAFmC,YAAdA,GAAyC,WAAdA,GAE5BD,EAAKpO,cAAgBoO,EAAKrO,aACrCqO,EAGFD,EAAgBC,EAAKG,gBAAkBzV,SAAS0V,WC1B5CC,WAAgCha,EAA7CE,kCAmBEI,aAAoC,KAEpC2Z,WACE,YAAYC,YAAc5Z,KAAK6Z,SAAY7Z,KAAKgB,GAAwB6V,IAG1EiD,cACE,YAAYC,eAAiB/Z,KAAKga,YAAeha,KAAKgB,GAAwBiZ,OAGhFC,aACE,YAAYC,cAAgBna,KAAKoa,WAAcpa,KAAKgB,GAAwBqZ,MAG9EC,sBACE,YAAYC,cAAgBva,KAAKwa,WAAa,wBAGhDC,sBACE,YAAYC,cAAgB1a,KAAK2a,WAAa,uBAGhD1X,aACEjD,KAAK4a,KAAO5a,KAAK4a,KAAKzX,KAAKnD,MAC3BA,KAAK6a,MAAQ7a,KAAK6a,MAAM1X,KAAKnD,MAG/BoD,WAGAwX,OACE,IAAI3Z,EAAUjB,KAAKgB,GACnB,GAAIhB,KAAK8a,QACP,OAEF9a,KAAK8a,QAAU/W,SAASoB,cAAc,UAEtC,IAAI4V,EAAQhX,SAASoB,cAAc,OACnC4V,EAAMC,UAAYhb,KAAKya,gBACvBM,EAAMlE,IAAM7W,KAAK2Z,KACjBoB,EAAMd,OAASja,KAAK8Z,QACpBiB,EAAMV,MAAQra,KAAKka,OACnBla,KAAK8a,QAAQG,YAAYF,GAEzB9Z,EAAQia,sBAAsB,WAAYlb,KAAK8a,SAC/CK,EAAeC,eAAepb,KAAK8a,SACnC9a,KAAK8a,QAAQE,UAAYhb,KAAKsa,gBAC9Bta,KAAK8a,QAAQO,YACbzC,EAAgB5Y,KAAK8a,QAAS,CAACjC,SAAU,SAAUC,MAAO,QAAQnT,MAAM,IAAM3F,KAAK8a,QAAS3B,gBAAe,IAC3GnZ,KAAK8a,QAAQxX,iBAAiB,QAAStD,KAAK6a,OAC5C7a,KAAK8a,QAAQxX,iBAAiB,SAAUtD,KAAK6a,OAC7C7a,KAAK8a,QAAQxX,iBAAiB,QAAStD,KAAK6a,OAG9CA,QACM7a,KAAK8a,UACP9a,KAAK8a,QAAQD,QACb7a,KAAK8a,QAAQlP,SACb5L,KAAK8a,QAAU,KACflC,EAAgB5Y,KAAKgB,GAAI,CAAC6X,SAAU,SAAUC,MAAO,QAAQnT,MAAM,IAAM3F,KAAKgB,GAAGmY,gBAAe,MA5E7FO,UAAS,CACd7C,IAAKjT,OACL0X,OAAQ1X,OACRyW,MAAOzW,QAEF8V,WAAU,CAAC,QAAS,eCThB6B,WAA6C7b,EAWxDuD,aACEjD,KAAKwb,aAAexb,KAAKwb,aAAarY,KAAKnD,MAG7CoD,UACEpD,KAAKyb,aAAatV,QAASnF,GAAOA,EAAGsC,iBAAiB,SAAUtD,KAAKwb,eAGvEjY,aACEvD,KAAKyb,aAAatV,QAASnF,GAAOA,EAAGwC,oBAAoB,SAAUxD,KAAKwb,eAG1EA,aAAa7Z,GACX,IAAI+Z,EAAe1b,KAAKyb,aAAaE,OAAO,CAACC,EAAe5a,IAAOA,EAAG4L,QAAUgP,EAAgB,EAAIA,EAAe,GAC/Gjb,EAASgB,EAAMhB,OACf+a,EAAe1b,KAAKqM,UACtB1K,EAAM+B,iBACN/C,EAAOiM,SAAU,EACjB5M,KAAKkB,SAASP,EAAQ,UACtBX,KAAKkB,SAASP,EAAQ,8BAClBX,KAAK6b,iBACP7b,KAAK8b,YAAY1W,UAAYpF,KAAK8O,gBAGpC9O,KAAKkB,SAASP,EAAQ,+BAClBX,KAAK6b,iBACP7b,KAAK8b,YAAY1W,UAAY,MAnC5BmW,WAAU,CAAC,QAAS,SACpBA,UAAS,CAACtP,IAAKK,OAAQ2C,QAASrL,cCH5BmY,WAA8Brc,EAMzCuD,cAGAG,WAGAG,cAGAyE,WAAWrG,SACTA,GAAAA,EAAO+B,4BACIsY,YAAYC,OAGzBC,MAAMva,SACJA,GAAAA,EAAO+B,iBACP1D,KAAKgc,YAAYE,QAGnBC,QAAQxa,SACNA,GAAAA,EAAO+B,iBACP1D,KAAKgc,YAAYI,YAAc,EAGjCC,KAAK1a,SACHA,GAAAA,EAAO+B,iBACP1D,KAAKgc,YAAYI,aAAe,GA9B3BL,WAAU,CAAC,eCFPO,WAA6B5c,EAexC6c,oBACE,YAAYC,wBAA0Bxc,KAAKyc,kBAAoB,gBAGjEC,kBACE,YAAYC,mBAAqB3c,KAAK4c,gBAAkB,YAG1DxZ,UACEpD,KAAK6c,kBAGP/Q,IAAInK,SACFA,GAAAA,EAAO+B,iBAEP,MAAMoZ,EAAU9c,KAAK+c,eAAe3X,UAAU4X,QAAQ,cAAehd,KAAKid,eAC1Ejd,KAAKkd,aAAaC,mBAAmBnd,KAAK0c,YAAaI,GAGzDlR,OAAOjK,GACLA,EAAM+B,iBACN,MAAM0Z,EAA+Bzb,EAAMhB,OAAuB0c,YAAYrd,KAAKuc,iBACnF,GAAe,MAAXa,EACF,UAAUpO,oGAAoGhP,KAAKuc,iBAGrH,GAAkC,SAA9Ba,EAAQ1U,QAAQ4U,UAClBF,EAAQxR,aACH,CACLwR,EAAQ3S,MAAMsM,QAAU,OACxB,IAAIwG,EAAeH,EAAQI,cAAc,2BACzC,GAAoB,MAAhBD,EACF,UAAUvO,8HAGZuO,EAAava,MAAQ,KAIjBia,cACN,WAAWQ,MAAOC,UAAUjd,WAAakd,KAAKC,SAASnd,WAAWod,MAAM,GAGlEhB,kBAGN,GAFe7c,KAAK+c,eAAe3X,UAEtB0Y,QAAQ,cACnB,UAAU9O,MAAM,qIA7DbsN,WAAU,CAAC,SAAU,YACrBA,UAAS,CACdyB,WAAYna,OACZoa,aAAcpa,cCJLqa,WAAkCve,EAU7CuD,aACEjD,KAAKke,oBAAsBle,KAAKke,oBAAoB/a,KAAKnD,MAG3DoD,UACEpD,KAAKme,gBAAgBhY,QAASnF,GAAOA,EAAGsC,iBAAiB,SAAUtD,KAAKke,sBAG1E3a,aACEvD,KAAKme,gBAAgBhY,QAASnF,GAAOA,EAAGwC,oBAAoB,SAAUxD,KAAKke,sBAGrEE,qBACN,IAAIC,EAAS,IAAIC,IAAIte,KAAKme,gBAAgBjG,IAAIlX,GAAMA,EAAGgC,QACvD,OAAOqb,EAAOE,IAAI,KAAsB,GAAfF,EAAOG,KAG1BN,sBACN,IAAIjd,EAAUjB,KAAKgB,GACfhB,KAAKoe,sBACPpe,KAAKkB,SAASD,EAAS,0BACnBjB,KAAKyL,eACPzL,KAAKme,gBAAgBhY,QAAQnF,GAAMA,EAAG2K,UAAUC,OAAO5L,KAAK6L,eAG9D7L,KAAKkB,SAASD,EAAS,6BACnBjB,KAAKyL,eACPzL,KAAKme,gBAAgBhY,QAAQnF,GAAMA,EAAG2K,UAAUG,IAAI9L,KAAK6L,eAnCxDoS,WAAU,CAAC,YACXA,WAAU,CAAC,eCHPQ,WAA+B/e,EAM1Cgf,KAAK/c,SACHA,GAAAA,EAAO+B,iBACP1D,KAAK2e,eAAe/X,KAAO,OAG7BgY,KAAKjd,SACHA,GAAAA,EAAO+B,iBACP1D,KAAK2e,eAAe/X,KAAO,WAG7B0K,OAAO3P,SACLA,GAAAA,EAAO+B,iBAC0B,aAA7B1D,KAAK2e,eAAe/X,KACtB5G,KAAK0e,OAEL1e,KAAK4e,QAnBFH,WAAU,CAAC,kBCFPI,WAA6Bnf,EAQxCof,gBACE,YAAYzZ,iBAAmBrF,KAAKwF,oCAAsCxF,KAAKqC,eAGjF2a,QAAQrb,GACN,MAAO6S,EAAMuK,EAAQC,GAAOrd,EAAMD,OAClC,GAAI8S,aAAgByK,KAAM,CACxB,IAAIC,EAAc1K,EAAKgJ,cAAcxd,KAAK8e,WAE1C,GAAmB,MAAfI,EACF,UAAUlQ,sDAAsDhP,KAAKqC,kDAGvE,IAAI8c,EAAanf,KAAKgB,GAAGme,WACzB,GAAkB,MAAdA,EACF,UAAUnQ,MAAM,sEAElBmQ,EAAWC,aAAaF,EAAalf,KAAKgB,SAE1CmB,QAAQrB,IAAI,UAAW0T,IA1BpBqK,WAAU,GAEVA,UAAS,CAAC7Y,SAAUpC,cCIhByb,WAA0C3f,EAErDuD,aACEjD,KAAKsf,gBAAkBtf,KAAKsf,gBAAgBnc,KAAKnD,MAGnDoD,UACER,OAAOU,iBAAiB,UAAWtD,KAAKsf,iBAG1C/b,aACEX,OAAOY,oBAAoB,UAAWxD,KAAKsf,iBAG7CA,gBAAgBrQ,GACd,IAAIuF,EAAOvF,EAAQuF,KACfA,EAAK+K,eAAe,SAAyB,gBAAd/K,EAAKhO,MAA0BgO,EAAK+K,eAAe,WACpFvf,KAAK0K,OAAO8J,EAAK3K,QAIrBa,OAAOb,GACJ7J,KAAKgB,GAAyByJ,MAAMZ,UAAYA,aAKxC2V,WAAuC9f,EAOlD0D,U9B1ByB,IAACiD,EAAYjF,EAChCgH,E8B2BAxF,OAAOtC,OAASsC,OAAO6c,MACzBjW,EAAgBxJ,M9B7BkBoB,E8B8BhB,G9B3Ba,QAAhCgH,GAHuB/B,E8B8BVrG,M9B5BiBJ,YACb8f,iBAA8B,IAAPtX,GAAyBA,EAAGjC,QAASwZ,IAI1E,GAHoB,iBAATA,IACPtZ,EAAWsZ,GAAQ3V,EAAS3D,EAAWsZ,GAAOve,MAAAA,OAAyC,EAASA,EAAQ8I,OAExF,iBAATyV,EAAmB,CAC1B,MAAMnZ,KAAEA,EAAI0D,KAAEA,GAASyV,EACvB,IAAKnZ,EACD,OACJH,EAAWG,GAAQwD,EAAS3D,EAAWG,GAAO0D,IAAS9I,MAAAA,OAAyC,EAASA,EAAQ8I,U8BoBvHlK,KAAK4f,cAMThV,aAAahB,GACX5J,KAAK4f,aAGPA,aACE,IAAIhW,EAAmC,CAACpD,KAAM,cAAeqD,OAAQ7J,KAAK6f,aAC1Ejd,OAAOkd,OAAOC,YACZnW,EACA,KAIJiW,YACE,MAAMpG,EAAO1V,SAAS0V,KAChBxU,EAAOlB,SAAS2U,gBAGtB,OAAOiF,KAAK1R,IAAIwN,EAAKxO,aAAcwO,EAAK1O,aAAc9F,EAAK+F,aAAc/F,EAAKgG,aAAchG,EAAK8F,eAjC5FyU,aAAY,CAAC,oBCnCTQ,WAA4BtgB,EAEvCugB,eACEjgB,KAAKkgB,QAAQlgB,KAAKgB,IAGpBkf,QAAQjf,aACNA,EAAQyH,QAAQrC,qBAAapF,EAAQyH,QAAQrC,qBAAY3D,WAAW,IAAIyd,eAAgBngB,KAAKqC,kBAAoB,KAAM,MAAO,GAC5F,IAA9BpB,EAAQyH,QAAQrC,mBAEXpF,EAAQyH,QAAQrC,WAGzB,IAAI+Z,EAAgC,IAAID,eAAgBngB,KAAKqC,wBAA0B,KACvFpB,EAAQyH,QAAQ/H,iBAASM,EAAQyH,QAAQ/H,iBAAQ+B,WAAW0d,EAA+B,MAAO,UAC3Fnf,EAAQyH,QAAQ2X,KAAargB,KAAKqC,sBACX,IAA1BpB,EAAQyH,QAAQ/H,eAEXM,EAAQyH,QAAQ/H,OAGzBM,EAAQyH,QAAQ4X,iBAASrf,EAAQyH,QAAQ/H,iBAAQ+B,WAAW0d,EAA+B,MAAO,UAC3Fnf,EAAQyH,QAAQ2X,KAAargB,KAAKqC,sBACX,IAA1BpB,EAAQyH,QAAQ4X,eAEXrf,EAAQyH,QAAQ4X,OAIzB,IAAIjC,EAASre,KAAKJ,YAAYye,OAC1BA,GACF/c,OAAO2T,KAAKoJ,GAAQlY,QAAQgS,UAAclX,EAAQyH,QAAQ2X,KAAargB,KAAKqC,cAAc8V,aAI5F,IAAIoI,EAAUvgB,KAAKJ,YAAY2gB,QAC3BA,GACFjf,OAAO2T,KAAKsL,GAASpa,QAAQgS,UAAclX,EAAQyH,QAAQ2X,KAAargB,KAAKqC,cAAc8V,oBCrCpFqI,WAAkCR,GAe7C5c,UACEC,sBAAsB,KAEpBuV,EACE5Y,KAAKgB,GACL,CACE6X,SAAU7Y,KAAKygB,iBAAmBzgB,KAAK0gB,cAAgB,SACvD5H,MAAO9Y,KAAK2gB,cAAgB3gB,KAAK4gB,WAAa,SAC9C7H,OAAQ/Y,KAAK6gB,eAAiB7gB,KAAK8gB,YAAc,WAEnDnb,MAAM,IAAM3F,KAAKgB,GAAGmY,kBACtBnZ,KAAKigB,kBAxBFO,UAAS,CACd3H,SAAUjV,OACVkV,MAAOlV,OACPmV,OAAQnV,cCLCmd,WAAiCrhB,EAS5CshB,OAAOrf,GAEL,IACIhB,QAFJgB,GAAAA,EAAO+B,iBAIL/C,EADU,aAFDX,KAAKihB,aAAejhB,KAAKkhB,UAAY,YAGrCnd,SAAS0V,KAETL,EAAgBpZ,KAAKgB,IAElB,MAAVL,GAGJiY,EAAgBjY,EAAS,CAACkY,SAAU,SAAUC,MAAO,QAAQnT,MAAM,IAAMhF,EAAQwY,gBAAe,KAnB3F4H,UAAS,CACdI,KAAMvd,cCHGwd,WAA2B1hB,EAiBtCshB,SACE,IAAIrgB,EAASoD,SAASyZ,cAAcxd,KAAKwF,eACpC7E,EAKLiY,EACEjY,EACA,CACEkY,SAAU7Y,KAAKygB,iBAAmBzgB,KAAK0gB,cAAgB,SACvD5H,MAAO9Y,KAAK2gB,cAAgB3gB,KAAK4gB,WAAa,SAC9C7H,OAAQ/Y,KAAK6gB,eAAiB7gB,KAAK8gB,YAAc,WAEnDnb,MAAM,IAAMhF,EAAQwY,kBAXpBhX,QAAQkf,mCAAmCrhB,KAAKwF,mBAlB7C4b,UAAS,CACdpb,SAAUpC,OACViV,SAAUjV,OACVkV,MAAOlV,OACPmV,OAAQnV,cCNC0d,WAA8B5hB,EASzCshB,OAAOrf,GAEL,IACIhB,QAFJgB,GAAAA,EAAO+B,iBAIL/C,EADU,aAFDX,KAAKihB,aAAejhB,KAAKkhB,UAAY,YAGrCnd,SAAS0V,KAETL,EAAgBpZ,KAAKgB,IAElB,MAAVL,GAGJiY,EAAgBjY,EAAS,CAACkY,SAAU,SAAUC,MAAO,UAAUnT,MAAM,IAAMhF,EAAQwY,gBAAe,KAnB7FmI,UAAS,CACdH,KAAMvd,cCJG2d,WAA+B7hB,EAA5CE,kCAKEI,cAAwD,KAExDoD,UACEC,sBAAsB,KAEpBrD,KAAKmS,SAAW7H,WAAW,IAAMtK,KAAKgB,GAAG4K,SAA8B,IAApB5L,KAAKwhB,gBAI5Dje,aACMvD,KAAKmS,UACP9H,aAAarK,KAAKmS,WAdfoP,UAAS,CAACE,QAASnV,cCFfoV,WAAyBhiB,EAAtCE,kCAYEI,mBAAuC,KAEvC2hB,YACE,YAAYV,aAAejhB,KAAKkhB,UAAY,MAG9CU,qBAGE,GAA2B,OAAvB5hB,KAAK6hB,cAKT,OADA7hB,KAAK6hB,cAAgB9d,SAASoB,cAAc,OACpCnF,KAAK2hB,OACX,IAAK,MACH3hB,KAAKgB,GAAGka,sBAAsB,cAAelb,KAAK6hB,eAClD,MACF,IAAK,SACH7hB,KAAKgB,GAAGka,sBAAsB,WAAYlb,KAAK6hB,gBAKrDze,UACE,IAAInC,EAAUjB,KAAKgB,GACnBhB,KAAK4hB,qBAEY,IAAIxa,qBAAqBC,IACxCA,EAAQlB,QAAQmB,IACVA,EAAM3G,SAAWX,KAAK6hB,gBAGM,IAA5Bva,EAAMwa,kBACR7gB,EAAQ0K,UAAUG,IAAI9L,KAAK+hB,cAAgB/hB,KAAKgiB,WAAa,SACxB,IAA5B1a,EAAMwa,mBACf7gB,EAAQ0K,UAAUC,OAAO5L,KAAK+hB,cAAgB/hB,KAAKgiB,WAAa,aAInE,CACD1J,UAAW,CAAC,EAAG,KAERxQ,QAAQ9H,KAAK6hB,gBArDjBH,WAAU,CAAC,SACXA,UAAS,CACdP,KAAMvd,cCJGqe,WAA4BviB,EAAzCE,kCAMEI,gBAA4B,KAC5BA,eAAoB,EAEpBkiB,iBACE,IAAIC,EAAQniB,KAAKgB,GAAwBohB,MACzC,GAAY,MAARD,EACF,UAAUnT,MAAM,6CAElB,OAAOmT,EAGTE,oBACE,IAAIC,EAAOtiB,KAAKkiB,WAAWI,KAC3B,GAAmB,GAAfA,EAAKhX,OACP,UAAU0D,MAAM,mEAElB,OAAOqB,MAAMC,KAAKgS,EAAK,GAAGC,OAG5BC,iBACE,YAAaxhB,GAAwByhB,QAAQ,GAG/CC,iBACE,OAAOrS,MAAMC,KAAKtQ,KAAKwiB,WAAWF,MAGpCrf,aACEjD,KAAK2iB,KAAO3iB,KAAK2iB,KAAKxf,KAAKnD,MAG7BoD,UACEC,sBAAsB,KACpBrD,KAAKqiB,cAAclc,QAAQyc,GAAQA,EAAKtf,iBAAiB,QAAStD,KAAK2iB,OACnE3iB,KAAK6iB,mBACP7iB,KAAK8iB,cAAc9iB,KAAK+iB,kBAK9Bxf,aACEvD,KAAKqiB,cAAclc,QAAQyc,GAAQA,EAAKpf,oBAAoB,QAASxD,KAAK2iB,OAG5EA,KAAKhhB,GACHA,EAAM+B,iBACN,IACIsf,EAAkBhjB,KAAKijB,mBADVthB,EAAMhB,QAEvBX,KAAK8iB,cAAcE,GAGbC,mBAAmBL,GACzB,YAAYP,cAAcvE,QAAQ8E,GAG5BE,cAAcI,GACpBljB,KAAKmjB,SAAWD,IAAUljB,KAAKojB,aAAepjB,KAAKmjB,SACnD,IAAIE,EAAOtf,SAASuf,yBACTtjB,KAAK0iB,WAEGC,KAAK,CAACY,EAAKC,aAC5B,IAAIjB,EAAQlS,MAAMC,KAAKiT,EAAIhB,OACvBkB,EAAapT,MAAMC,KAAKkT,EAASjB,OAGjCmB,YAAInB,EAAMW,aAAQ1X,YAAa,GAC/BmY,YAAIF,EAAWP,aAAQ1X,YAAa,GAEpCoY,EAAUF,EAAEG,cAAcF,EAAG,KAAM,CAACG,YAAa,OAAQC,SAAS,EAAMC,UAAW,UAEvF,OAAIT,EAAI7a,QAAQub,SAAWT,EAAS9a,QAAQwb,WACtCX,EAAI7a,QAAQub,SAAWT,EAAS9a,QAAQub,QACnCL,GAED,EAENL,EAAI7a,QAAQwb,YAAcV,EAAS9a,QAAQub,QACzCV,EAAI7a,QAAQwb,YAAcV,EAAS9a,QAAQwb,WACtCN,IAKP5jB,KAAKmjB,SACAS,EAAU,GAAK,EAAI,EAErBA,IAGDzd,QAAQod,GAAOF,EAAKpI,YAAYsI,IAExCvjB,KAAKwiB,WAAWpd,UAAY,GAC5BpF,KAAKwiB,WAAWvH,YAAYoI,GAC5BrjB,KAAKojB,WAAaF,GAjGbjB,UAAS,CAACkC,UAAW7X,cCDjB8X,WAAgC1kB,EAc3C2kB,iBACE,aAAYC,mBAAoBtkB,KAAKukB,eAGvCF,eAAerhB,GACbhD,KAAKukB,eAAiBvhB,EAGxBwf,iBACE,YAAaxhB,GAAwByhB,QAAQ,GAG/CC,iBACE,OAAOrS,MAAMC,KAAKtQ,KAAKwiB,WAAWF,MAGpCkC,aACE,YAAYC,cAAgBzkB,KAAK0kB,WAAa,GAGhDzhB,aACEjD,KAAK2kB,SAAW3kB,KAAK2kB,SAASxhB,KAAKnD,MACnCA,KAAK4kB,OAAS5kB,KAAK4kB,OAAOzhB,KAAKnD,MAGjCoD,UACEmG,EAAYvJ,KAAM,CAAC4V,WAAW,EAAM3U,QAASjB,KAAKwiB,aAElDnf,sBAAsB,KACpBrD,KAAK2kB,WACL3kB,KAAK6kB,eAAevhB,iBAAiB,QAAStD,KAAK4kB,UAIvDD,SAAShjB,SACPA,GAAAA,EAAO+B,iBACP1D,KAAKqkB,YAAa,EACdrkB,KAAK0iB,WAAWpX,QAAUtL,KAAKwkB,QACjCxkB,KAAK0iB,WAAW7E,MAAM7d,KAAKwkB,QAAQre,QAASnF,IACtCA,IAAOhB,KAAK6kB,gBACd7kB,KAAK8kB,aAAa9jB,KAGtBhB,KAAK+kB,aAAa/kB,KAAK6kB,iBAEvB7kB,KAAK8kB,aAAa9kB,KAAK6kB,gBAI3BD,OAAOjjB,GACL3B,KAAKqkB,YAAa,QAClB1iB,GAAAA,EAAO+B,iBACP1D,KAAK0iB,WAAW7E,MAAM7d,KAAKwkB,QAAQre,QAASnF,IACtCA,IAAOhB,KAAK6kB,gBACd7kB,KAAK+kB,aAAa/jB,KAGtBhB,KAAK8kB,aAAa9kB,KAAK6kB,gBAGzB/O,OAAOzO,GACDrH,KAAKqkB,YACPrkB,KAAKglB,cAIDD,aAAa/jB,GACnBA,EAAGyJ,MAAMsM,QAAU,GAGb+N,aAAa9jB,GACnBA,EAAGyJ,MAAMsM,QAAU,OAGbiO,cACNhlB,KAAK0iB,WAAW7E,MAAM,EAAG7d,KAAKwkB,QAAQre,QAASnF,IACzCA,IAAOhB,KAAK6kB,gBACd7kB,KAAK+kB,aAAa/jB,KAGtBhB,KAAK0iB,WAAW7E,MAAM7d,KAAKwkB,QAAQre,QAASnF,IACtCA,IAAOhB,KAAK6kB,gBACd7kB,KAAK8kB,aAAa9jB,KAGtBhB,KAAK+kB,aAAa/kB,KAAK6kB,iBAjGlBT,WAAU,CAAC,YACXA,UAAS,CACda,MAAO3Y,OACP4Y,UAAWxW,eCNFyW,WAA2BnF,GAUtC5c,UACE,IAAKpD,KAAKolB,eACR,UAAUpW,MAAM,oCAGlB3L,sBAAsB,KAChBrD,KAAKqlB,mBAAqBrlB,KAAKslB,gBACjCtlB,KAAKulB,YAKXA,QAAQ5jB,SACNA,GAAAA,EAAO+B,iBACP,IAAIzC,EAAUjB,KAAKgB,GACfwkB,EAAczhB,SAASyZ,cAAcxd,KAAKylB,aAE9C,GAAmB,MAAfD,EAEF,YADAxlB,KAAKkB,SAASD,EAAS,kBAIzB,IAAI+M,EAAO/M,EAAQykB,WAAU,GAG7B,OAFA1lB,KAAKkgB,QAAQlS,GAELhO,KAAK2lB,aACX,IAAK,cACL,IAAK,YACL,IAAK,WACL,IAAK,aACHH,EAAYrI,mBAAmBnd,KAAK2lB,YAAa3X,EAAK4X,WACtD,MACF,IAAK,eACHJ,EAAYI,UAAY5X,EAAK4X,UAC7B,MACF,IAAK,eACHJ,EAAYpgB,UAAY4I,EAAK4X,UAC7B,MACF,IAAK,UACHJ,EAAYrI,mBAAmB,aAAcnP,EAAK4X,WAClD,MACF,IAAK,SACHJ,EAAYrI,mBAAmB,YAAanP,EAAK4X,WACjD,MACF,QACE,UAAU5W,MAAM,oCAGpB/N,EAAQ2K,UAxDHuZ,UAAS,CAACxkB,OAAQiD,OAAQiiB,OAAQjiB,OAAQkiB,UAAWpX,eCFjDqX,WAA0BrmB,EAAvCE,kCAKEI,oBAAgC,KAEhCiD,aACEjD,KAAKmS,SAAWnS,KAAKmS,SAAShP,KAAKnD,MAGrCoD,UACEC,sBAAsB,KACpBrD,KAAKwS,eAAiB5P,OAAO0H,WAAWtK,KAAKmS,SAA8B,IAApBnS,KAAKwhB,gBAIhEje,aACMvD,KAAKwS,gBACP5P,OAAOyH,aAAarK,KAAKwS,gBAI7BL,WACEnS,KAAKkB,SAASlB,KAAKgB,GAAI,YAtBlB+kB,UAAS,CAACtE,QAASnV,cCCf0Z,WAA8BtmB,EA4BzC0D,UACE,IAAKpD,KAAKimB,cACR,UAAUjX,MAAM,oDAGdhP,KAAKkmB,oBAAsBlmB,KAAKmmB,qB7CHhB,EAAC9f,EAAYjF,EAAU,MAC1B,IAAIyH,E6CGV7I,K7CH+BoB,I6CGxCglB,GAGEpmB,KAAKqmB,mBAAqBrmB,KAAKsmB,gB/CnCR,EAACjgB,EAAYjF,EAAU,MAClD,MAAM8G,YAAEA,EAAWpG,cAAEA,EAAamG,OAAEA,EAAMxB,YAAEA,GAAgBnF,OAAOC,OAAO,GAAIwF,EAAgB3F,GACxFmlB,EAAW5kB,IACb,MAAMsF,GAAiB7F,MAAAA,OAAyC,EAASA,EAAQH,UAAYoF,EAAWpF,QACxG,KAAIgG,EAAcuf,SAAS7kB,EAAMhB,UFqBlC,SAA6BK,GAChC,MAAMylB,EAAOzlB,EAAG0lB,wBACVC,EAAgB/jB,OAAO+G,aAAe5F,SAAS2U,gBAAgB1N,aAC/D4b,EAAehkB,OAAO8G,YAAc3F,SAAS2U,gBAAgBmO,YAGnE,OAFoBJ,EAAKhH,KAAOkH,GAAmBF,EAAKhH,IAAMgH,EAAK5c,QAAW,GAC3D4c,EAAKK,MAAQF,GAAkBH,EAAKK,KAAOL,EAAK1c,OAAU,EE1B3Bgd,CAAoB9f,IAAkBiB,KAIhF7B,EAAW2gB,cACX3gB,EAAW2gB,aAAarlB,GAGxBG,GAAe,CACf,MAAMX,EAAYoF,EAAiB,gBAAiBF,EAAYI,GAC1DwgB,EAAoBtgB,EAAcxF,EAAWQ,EAAO,CAAE0E,WAAAA,IAC5DY,EAAcnF,cAAcmlB,KAe9B/f,EAAuBb,EAAW9C,WAAWJ,KAAKkD,GACxD/E,OAAOC,OAAO8E,EAAY,CACtB2B,aARAC,MAAAA,GAAgDA,EAAO9B,QAAQxE,IAC3DiB,OAAOY,oBAAoB7B,EAAO4kB,GAAS,KAS3Crf,OAfJe,MAAAA,GAAgDA,EAAO9B,QAAQxE,IAC3DiB,OAAOU,iBAAiB3B,EAAO4kB,GAAS,M+CgB9CW,CAAgBlnB,MAGlBqD,sBAAsB,KAChBrD,KAAKmnB,iBAELnnB,KAAKonB,cAAcjhB,QADK,OAAtBnG,KAAKqnB,aACqB1mB,GAAWX,KAAKsnB,WAAW3mB,GAE3BA,GAAWX,KAAKunB,YAAY5mB,MAMhEqmB,eACEhnB,KAAKonB,cAAcjhB,QAASxF,IACtBX,KAAKwnB,mBAAmB7mB,KAC1BX,KAAKynB,qBAAqB9mB,GAC1BX,KAAK0nB,eAAe/mB,MAK1BgnB,aACE,GAAI3nB,KAAKkmB,mBACP,OAAQlmB,KAAK4nB,iBACX,IAAK,KACH5nB,KAAK6nB,KACL,MACF,IAAK,MACH7nB,KAAK8nB,MACL,MACF,IAAK,SACH9nB,KAAKsR,SAIX,MAAO,GAGTyW,aACE,GAAI/nB,KAAKmmB,mBACP,OAAQnmB,KAAKgoB,iBACX,IAAK,KACHhoB,KAAK6nB,KACL,MACF,IAAK,MACH7nB,KAAK8nB,MACL,MACF,IAAK,SACH9nB,KAAKsR,SAIX,MAAO,GAGTuW,GAAGlmB,GACD3B,KAAKonB,cAAcjhB,QAASxF,IAC1BX,KAAKynB,qBAAqB9mB,GAC1BX,KAAKsnB,WAAW3mB,KAIpBmnB,IAAInmB,GACF3B,KAAKonB,cAAcjhB,QAASxF,IAC1BX,KAAKynB,qBAAqB9mB,GAC1BX,KAAKunB,YAAY5mB,KAIrB2Q,OAAO3P,GACL3B,KAAKonB,cAAcjhB,QAASxF,IAC1BX,KAAKynB,qBAAqB9mB,GAC1BX,KAAK0nB,eAAe/mB,KAIhB6mB,mBAAmBxmB,GACzB,MAA6B,QAAtBA,EAAG0H,QAAQuf,QAGZR,qBAAqBzmB,GACvBhB,KAAKwnB,mBAAmBxmB,UACnBA,EAAG0H,QAAQuf,QAElBjnB,EAAG0H,QAAQuf,QAAU,OAIjBP,eAAe1mB,GACPhB,KAAKkoB,WAAW3T,MAAM,KAC5BpO,QAASgiB,GAAUnnB,EAAG2K,UAAU2F,OAAO6W,IAGzCb,WAAWtmB,GACHhB,KAAKkoB,WAAW3T,MAAM,KAC5BpO,QAASgiB,GAAUnnB,EAAG2K,UAAU2F,OAAO6W,GAAO,IAGhDZ,YAAYvmB,GACJhB,KAAKkoB,WAAW3T,MAAM,KAC5BpO,QAASgiB,GAAUnnB,EAAG2K,UAAU2F,OAAO6W,GAAO,cCjJ1CC,GAAannB,GAC3B,MAA2B,eAApBA,EAAQkN,SDMR6X,WAAU,CAAC,UACXA,UAAS,CACdqC,MAAOzkB,OACP+jB,WAAY/jB,OACZmkB,WAAYnkB,OACZ0kB,UAAW5Z,QACX6Z,QAAS3kB,cETA4kB,WAA+B9oB,EAc1C4R,OAAO3P,SACLA,GAAAA,EAAO+B,iBACP,IACI+kB,EADQzoB,KAAK0oB,YACI7R,IACL,MAAZ4R,GAAoBA,IAAazoB,KAAK2oB,UACxC3oB,KAAK4oB,UAEL5oB,KAAK4X,SAITiR,OAAOlnB,SACLA,GAAAA,EAAO+B,iBACP1D,KAAK4oB,UAGP3W,MAAMtQ,SACJA,GAAAA,EAAO+B,iBACP1D,KAAK4X,SAGCgR,UACN,IAAIE,EAAQ9oB,KAAK0oB,YACb1oB,KAAK+oB,yBACPD,EAAM1jB,UAAYpF,KAAKgpB,qBAEzBF,EAAMjS,IAAM7W,KAAK2oB,UAGX/Q,SACN,IAAIkR,EAAQ9oB,KAAK0oB,YACjBI,EAAMjS,IAAM,GACZiS,EAAM1jB,UAAY,GAGZsjB,YACN,IAAII,EAAQ/kB,SAASklB,kBAAkBjpB,KAAKkpB,gBAC5C,GAAa,MAATJ,EACF,UAAU9Z,uCAAuChP,KAAKkpB,iBAExD,GAAKd,GAAaU,GAGhB,OAAOA,EAFP,UAAU9Z,iCAAiChP,KAAKkpB,iBAM5CP,UACN,IAAI1nB,EAAUjB,KAAKgB,GACnB,GAAIhB,KAAK4Z,YACP,YAAYC,YACH3L,EAAoBjN,GAC7B,OAAOA,EAAQ0S,KAEf,UAAU3E,MAAM,oCAlEbwZ,UAAS,CACdW,QAASvlB,OACTiT,IAAKjT,OACLwlB,eAAgBxlB,cCLPylB,WAAoC3pB,EAAjDE,kCAUEI,oBAA8D,KAE9DspB,YACE,aAAYC,cAAevpB,KAAKwpB,UAGlCvmB,aACEjD,KAAKypB,QAAUzpB,KAAKypB,QAAQtmB,KAAKnD,MAGnCoD,UACE,IAAInC,EAAUjB,KAAKgB,GACnB,IAAIonB,GAAannB,GAKf,UAAU+N,MAAM,iEAJhB,GAAM/N,EAAQ4V,IACZ,UAAU7H,MAAM,8DAKhBhP,KAAKspB,OACPjmB,sBAAsB,IAAMrD,KAAKwS,eAAiBlI,WAAW,IAAMtK,KAAKypB,UAAWzpB,KAAK0pB,gBAI5FnmB,aACMvD,KAAKwS,gBACPnI,aAAarK,KAAKwS,gBAItBiX,QAAQ9nB,SACNA,GAAAA,EAAO+B,iBACP,IAAIzC,EAAUjB,KAAKgB,GACnBC,EAAQ4V,IAAM5V,EAAQ4V,KAzCjBwS,UAAS,CACdM,SAAUrd,OACVsd,KAAMlb,eCNGmb,WAA4BnqB,EAevCuD,aACEjD,KAAK8pB,gBAAkB9pB,KAAK8pB,gBAAgB3mB,KAAKnD,MAGnDoD,UACEpD,KAAK8pB,kBACL9pB,KAAKoL,YAAY9H,iBAAiB,QAAStD,KAAK8pB,iBAGlDvmB,aACEvD,KAAKoL,YAAY5H,oBAAoB,QAASxD,KAAK8pB,iBAGrDA,kBACE,IAAIC,EAAY,EAEZC,EADgBhqB,KAAKoL,YAAYpI,MACTinB,MAAM,QAClCF,EAAaC,GAAWA,EAAQ1e,QAAW,EAC3CtL,KAAKuL,aAAaC,UAAYue,EAAUtpB,WACpCT,KAAKyL,gBACHzL,KAAK0L,cAAcqe,GACrB/pB,KAAKuL,aAAaI,UAAUC,OAAO5L,KAAK6L,YAExC7L,KAAKuL,aAAaI,UAAUG,IAAI9L,KAAK6L,aAKnCH,cAAcK,GACpB,IAAIC,EAAM,EACNC,EAAM,MAUV,OARIjM,KAAKkM,cACPF,EAAMhM,KAAKmM,UAGTnM,KAAKoM,cACPH,EAAMjM,KAAKqM,UAGNN,GAASC,GAAOD,GAASE,GArD3B4d,WAAU,CAAC,QAAS,UACpBA,UAAS,CAAC7d,IAAKM,OAAQL,IAAKK,QAC5Bud,WAAU,CAAC"} \ No newline at end of file diff --git a/dist/stimulus-library.module.js b/dist/stimulus-library.module.js index edbd2b10..8359d899 100644 --- a/dist/stimulus-library.module.js +++ b/dist/stimulus-library.module.js @@ -1,2 +1,2 @@ -import{Controller as t}from"stimulus";import e from"lodash-es/get";import n from"lodash-es/set";import i from"dialog-polyfill";import r from"camelcase";function s(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=t[Symbol.iterator]()).next.bind(n)}var d=function(t){function e(e){var n;return n=t.call(this,e)||this,new Proxy(c(n),{get:function(t,e){var i=Reflect.get(t,e),r=c(n);if(function(t){switch(t){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(t)||/^.*?Target(s)?$/.test(t)||/^.*?Value$/.test(t)||/^.*?ValueChanged$/.test(t)||/^.*?Class$/.test(t)||/^.*?Classes$/.test(t))}(e.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(t,n,i){return r.log(e.toString(),{args:i}),Reflect.apply(t,n,i)}});n.log(e.toString())}return i}})||c(n)}l(e,t);var n=e.prototype;return n.dispatch=function(t,e,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:t}},n);i.detail.target&&(i.detail.target=t);var r=new CustomEvent(e,i);this.logEvent(e,r,t),t.dispatchEvent(r)},n.log=function(t,e){if(void 0===e&&(e={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+t,"color: #3B82F6","color: unset"),n.log(a({element:this.element},e)),n.groupEnd()}},n.logEvent=function(t,e,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+t+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},o(e,[{key:"el",get:function(){return this.element}}]),e}(t),f=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t._checkAnchor(),window.addEventListener("hashchange",t._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(t){null==t||t.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},o(e,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(t){window.location.hash=t}}]),e}(d);f.values={key:String};var m=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var t=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){t._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},e}(d),p=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var t=this,e=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(t){return t.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,t.hasSelectorValue){var s=r.querySelectorAll(t.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);e.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(t._errorMessage),e.dispatch(n,"ajax:error")}).finally(function(){e.dispatch(n,"ajax:complete")})},o(e,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),e}(d);p.targets=["replace"],p.values={endpoint:String,errorMessage:String,selector:String};var v=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var t=this;this.el.querySelectorAll("input, select, textarea").forEach(function(e){return e.addEventListener("change",t.submit)})},n.disconnect=function(){var t=this;this.el.querySelectorAll("input, select, textarea").forEach(function(e){return e.removeEventListener("change",t.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},e}(d);const g=(t,e)=>{const n=t[e];return"function"==typeof n?n:(...t)=>{}},y=(t,e,n)=>{let i=t;return!0===n?i=`${e.identifier}:${t}`:"string"==typeof n&&(i=`${n}:${t}`),i},b=(t,e,n)=>{const{bubbles:i,cancelable:r,composed:s}=e||{bubbles:!0,cancelable:!0,composed:!0};return e&&Object.assign(n,{originalEvent:e}),new CustomEvent(t,{bubbles:i,cancelable:r,composed:s,detail:n})},_={dispatchEvent:!0,eventPrefix:!0},E=(t,e={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},_,e),r=(null==e?void 0:e.element)||t.element,s=t.disconnect.bind(t),o=new IntersectionObserver(e=>{const[s]=e;s.isIntersecting?(e=>{if(t.isVisible=!0,g(t,"appear").call(t,e),n){const n=y("appear",t,i),s=b(n,null,{controller:t,entry:e});r.dispatchEvent(s)}})(s):t.isVisible&&(e=>{if(t.isVisible=!1,g(t,"disappear").call(t,e),n){const n=y("disappear",t,i),s=b(n,null,{controller:t,entry:e});r.dispatchEvent(s)}})(s)},e),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(t,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},w={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},k={debug:!1,logger:console};class V{constructor(t,e={}){var n,i,r;this.log=(t,e)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${t}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},e)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==e?void 0:e.debug)&&void 0!==n?n:t.application.stimulusUseDebug)&&void 0!==i?i:k.debug,this.logger=null!==(r=null==e?void 0:e.logger)&&void 0!==r?r:k.logger,this.controller=t,this.controllerId=t.element.id||t.element.dataset.id,this.controllerInitialize=t.initialize.bind(t),this.controllerConnect=t.connect.bind(t),this.controllerDisconnect=t.disconnect.bind(t)}}class T extends V{constructor(t,e={}){super(t,e),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{g(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{g(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==e?void 0:e.element)||t.element,this.controller=t,this.enhanceController(),this.observe()}enhanceController(){const t=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),t()}})}}class L extends V{constructor(t,e={}){super(t,e),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(t){this.controller.application.handleError(t,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=t=>{g(this.controller,"mutate").call(this.controller,t),this.log("mutate",{entries:t})},this.targetElement=(null==e?void 0:e.element)||t.element,this.controller=t,this.options=e,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const t=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),t()}})}}const S=(t,e={})=>{const n=new L(t,e);return[n.observe,n.unobserve]},C=t=>{const e=e=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:e};g(t,"windowResize").call(t,r)},n=t.disconnect.bind(t),i=()=>{window.addEventListener("resize",e),e()},r=()=>{window.removeEventListener("resize",e)};return Object.assign(t,{disconnect(){r(),n()}}),i(),[i,r]},A=(t,e=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>t.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,e)}};var D=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var t=this;C(this),requestAnimationFrame(function(){t._handler();var e=t.el;e.style.resize="none",e.style.boxSizing="border-box",e.addEventListener("input",t._handler),e.addEventListener("focus",t._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(t){var e=t.offsetHeight-t.clientHeight;t.style.height="auto",t.style.height=t.scrollHeight+e+"px"},e}(d),I=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t.inputTarget.addEventListener("input",t._updateCharCount),t._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var t=this.inputTarget.value.length;this.outputTarget.innerText=t.toString(),this.hasErrorClass&&(this._isValidCount(t)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(t){var e=0,n=99999;return this.hasMinValue&&(e=this.minValue),this.hasMaxValue&&(n=this.maxValue),t>=e&&t<=n},e}(d);I.targets=["input","output"],I.values={min:Number,max:Number},I.classes=["error"];var x=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t.hasSelectAllTarget&&(t.selectAllTarget.addEventListener("change",t._toggle),t.checkboxTargets.forEach(function(e){return e.addEventListener("change",t._refresh)}),t._refresh())})},n.disconnect=function(){var t=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(e){return e.removeEventListener("change",t._refresh)}))},n._toggle=function(t){t.preventDefault();var e=t.target;this.checkboxTargets.forEach(function(t){return t.checked=e.checked})},n._refresh=function(){var t=this.checkboxTargets.length,e=this._checked.length;this.selectAllTarget.checked=e>0,this.selectAllTarget.indeterminate=e>0&&e0&&(H(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:H(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),e}(d);Z.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var tt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){E(this,{threshold:this._threshold,element:this.el})},n.appear=function(t){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(t){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},o(e,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(t){return Number.parseFloat(t.trim())}).filter(function(t){return t>=0&&t<=1}):[0,1]}}]),e}(d);tt.values={threshold:String};var et,nt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){if("IntersectionObserver"in window){var t=E(this,{element:this.el,threshold:.3});this.observe=t[0],this.unobserve=t[1]}else this.loadContent()},n.appear=function(t){t.target===this.el&&t.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},e}(p),it=function(t,e){var n=void 0===e?{}:e,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,o=void 0===s?"start":s,a=n.inline,l=void 0===a?"nearest":a;try{var c=function(){t.scrollIntoView({behavior:r,block:o,inline:l})},u=function(){if("smooth"==r&&!rt)return Promise.resolve(function(){try{return Promise.resolve(import("smoothscroll-polyfill")).then(function(t){et||(et=!0,(0,t.polyfill)())})}catch(t){return Promise.reject(t)}}()).then(function(){})}();return Promise.resolve(u&&u.then?u.then(c):c())}catch(t){return Promise.reject(t)}},rt="scrollBehavior"in document.documentElement.style;function st(t){if(!t)return null;var e=getComputedStyle(t).overflowY;return"visible"!==e&&"hidden"!==e&&t.scrollHeight>=t.clientHeight?t:st(t.parentElement)||document.body}var ot=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._dialog=null,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var t=this,e=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),e.insertAdjacentElement("afterend",this._dialog),i.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),it(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return t._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var t=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,it(this.el,{behavior:"smooth",block:"end"}).catch(function(){return t.el.scrollIntoView(!1)}))},o(e,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),e}(d);ot.values={src:String,srcSet:String,sizes:String},ot.classes=["modal","image"];var at=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var t=this;this.inputTargets.forEach(function(e){return e.addEventListener("change",t.handleInputs)})},n.disconnect=function(){var t=this;this.inputTargets.forEach(function(e){return e.removeEventListener("change",t.handleInputs)})},n.handleInputs=function(t){var e=this.inputTargets.reduce(function(t,e){return e.checked?t+1:t},0),n=t.target;e>this.maxValue?(t.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},e}(d);at.targets=["input","error"],at.values={max:Number,message:String};var lt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(t){try{return null==t||t.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(t){return Promise.reject(t)}},n.pause=function(t){null==t||t.preventDefault(),this.mediaTarget.pause()},n.restart=function(t){null==t||t.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(t){null==t||t.preventDefault(),this.mediaTarget.currentTime+=5},e}(d);lt.targets=["media"];var ct=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){this._checkStructure()},n.add=function(t){null==t||t.preventDefault();var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,e)},n.remove=function(t){t.preventDefault();var e=t.target.closest("."+this._wrapperClass);if(null==e)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===e.dataset.newRecord)e.remove();else{e.style.display="none";var n=e.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},o(e,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),e}(d);ct.targets=["target","template"],ct.values={insertMode:String,wrapperClass:String};var ut=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var t=this;this.passwordTargets.forEach(function(e){return e.addEventListener("change",t.checkPasswordsMatch)})},n.disconnect=function(){var t=this;this.passwordTargets.forEach(function(e){return e.removeEventListener("change",t.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var t=new Set(this.passwordTargets.map(function(t){return t.value}));return t.has("")||1==t.size},n.checkPasswordsMatch=function(){var t=this,e=this.el;this._allPasswordsMatch()?(this.dispatch(e,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(e){return e.classList.remove(t.errorClass)})):(this.dispatch(e,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(e){return e.classList.add(t.errorClass)}))},e}(d);ut.targets=["password"],ut.classes=["error"];var ht=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.peak=function(t){null==t||t.preventDefault(),this.passwordTarget.type="text"},n.hide=function(t){null==t||t.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(t){null==t||t.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},e}(d);ht.targets=["password"];var dt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.replace=function(t){var e=t.detail[0];if(e instanceof Node){var n=e.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",e)},o(e,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),e}(d);dt.targets=[],dt.values={selector:String};var ft=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(t){var e=t.data;e.hasOwnProperty("name")&&"iframe-body"===e.name&&e.hasOwnProperty("height")&&this.resize(e.height)},n.resize=function(t){this.el.style.height=t+"px"},e}(d),mt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t,e,n;window.self!==window.top&&(C(this),e={},null===(n=(t=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(t[n]=A(t[n],null==e?void 0:e.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;t[i]=A(t[i],r||(null==e?void 0:e.wait))}}),this.postUpdate())},n.windowResize=function(t){this.postUpdate()},n.postUpdate=function(){var t={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(t,"*")},n.getHeight=function(){var t=document.body,e=document.documentElement;return Math.max(t.scrollHeight,t.offsetHeight,e.clientHeight,e.scrollHeight,e.offsetHeight)},e}(d);mt.debounces=["postUpdate"];var pt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(t){var e,n,i,s=this;t.dataset.controller=(null==(e=t.dataset.controller)?void 0:e.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==t.dataset.controller&&delete t.dataset.controller;var o=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");t.dataset.target=(null==(n=t.dataset.target)?void 0:n.replaceAll(o,""))||"",delete t.dataset[r(this.identifier+"-target")],""==t.dataset.target&&delete t.dataset.target,t.dataset.action=(null==(i=t.dataset.target)?void 0:i.replaceAll(o,""))||"",delete t.dataset[r(this.identifier+"-action")],""==t.dataset.action&&delete t.dataset.action;var a=this.constructor.values;a&&Object.keys(a).forEach(function(e){return delete t.dataset[r(s.identifier+"-"+e+"-value")]});var l=this.constructor.classes;l&&Object.keys(l).forEach(function(e){return delete t.dataset[r(s.identifier+"-"+e+"-class")]})},e}(d),vt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.connect=function(){var t=this;requestAnimationFrame(function(){it(t.el,{behavior:t.hasBehaviorValue?t.behaviorValue:"smooth",block:t.hasBlockValue?t.blockValue:"center",inline:t.hasInlineValue?t.inlineValue:"center"}).catch(function(){return t.el.scrollIntoView()}),t._cleanupSelf()})},e}(pt);vt.values={behavior:String,block:String,inline:String};var gt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(t){var e;null==t||t.preventDefault(),null!=(e="document"==(this.hasModeValue?this.modeValue:"document")?document.body:st(this.el))&&it(e,{behavior:"smooth",block:"end"}).catch(function(){return e.scrollIntoView(!1)})},e}(d);gt.values={mode:String};var yt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(){var t=document.querySelector(this.selectorValue);t?it(t,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return t.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},e}(d);yt.values={selector:String,behavior:String,block:String,inline:String};var bt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(t){var e;null==t||t.preventDefault(),null!=(e="document"==(this.hasModeValue?this.modeValue:"document")?document.body:st(this.el))&&it(e,{behavior:"smooth",block:"start"}).catch(function(){return e.scrollIntoView(!1)})},e}(d);bt.values={mode:String};var _t=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._timeout=null,e}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;requestAnimationFrame(function(){t._timeout=setTimeout(function(){return t.el.remove()},1e3*t.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},e}(d);_t.values={seconds:Number};var Et=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._magicElement=null,e}l(e,t);var n=e.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var t=this,e=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===t._magicElement&&(0===n.intersectionRatio?e.classList.add(t.hasStuckClass?t.stuckClass:"stuck"):1===n.intersectionRatio&&e.classList.remove(t.hasStuckClass?t.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},o(e,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),e}(d);Et.classes=["stuck"],Et.values={mode:String};var wt=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._lastIndex=null,e._reverse=!1,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t._tableHeaders.forEach(function(e){return e.addEventListener("click",t.sort)}),t.hasStartSortValue&&t._sortByColumn(t.startSortValue)})},n.disconnect=function(){var t=this;this._tableHeaders.forEach(function(e){return e.removeEventListener("click",t.sort)})},n.sort=function(t){t.preventDefault();var e=this._indexOfHeaderCell(t.target);this._sortByColumn(e)},n._indexOfHeaderCell=function(t){return this._tableHeaders.indexOf(t)},n._sortByColumn=function(t){var e=this;this._reverse=t===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[t])?void 0:r.innerText)||"",c=(null==(s=a[t])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:e._reverse?u>0?-1:1:u}).forEach(function(t){return n.appendChild(t)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=t},o(e,[{key:"_tableHead",get:function(){var t=this.el.tHead;if(null==t)throw new Error("Expected table to have a element.");return t}},{key:"_tableHeaders",get:function(){var t=this._tableHead.rows;if(0==t.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(t[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),e}(d);wt.values={startSort:Number};var kt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var t=this;S(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){t.truncate(),t.showMoreTarget.addEventListener("click",t.expand)})},n.truncate=function(t){var e=this;null==t||t.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(t){var e=this;this._truncated=!1,null==t||t.preventDefault(),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._hideElement(this.showMoreTarget)},n.mutate=function(t){this._truncated&&this._reTruncate()},n._showElement=function(t){t.style.display=""},n._hideElement=function(t){t.style.display="none"},n._reTruncate=function(){var t=this;this._tableRows.slice(0,this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)},o(e,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(t){this.truncatedValue=t}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),e}(d);kt.targets=["showMore"],kt.values={limit:Number,truncated:Boolean};var Vt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){t.hasImmediateValue&&t.immediateValue&&t.execute()})},n.execute=function(t){null==t||t.preventDefault();var e=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=e.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}e.remove()}else this.dispatch(e,"teleport:error")},e}(pt);Vt.values={target:String,insert:String,immediate:Boolean};var Tt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((t,e={})=>{new T(this,e)})(),this.hasClickAwayValue&&this.clickAwayValue&&((t,e={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},w,e),o=r=>{const o=(null==e?void 0:e.element)||t.element;if(!(o.contains(r.target)||!function(t){const e=t.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return e.top<=n&&e.top+e.height>=0&&e.left<=i&&e.left+e.width>=0}(o)&&n)&&(t.clickOutside&&t.clickOutside(r),i)){const e=y("click:outside",t,s),n=b(e,r,{controller:t});o.dispatchEvent(n)}},a=t.disconnect.bind(t);Object.assign(t,{disconnect(){null==r||r.forEach(t=>{window.removeEventListener(t,o,!1)}),a()}}),null==r||r.forEach(t=>{window.addEventListener(t,o,!1)})})(this),requestAnimationFrame(function(){t.hasInitialValue&&t.toggleTargets.forEach("on"===t.initialValue?function(e){return t._elementOn(e)}:function(e){return t._elementOff(e)})})},n.clickOutside=function(){var t=this;this.toggleTargets.forEach(function(e){t._elementWasToggled(e)&&(t._elementToggleStatus(e),t._elementToggle(e))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementOn(t)})},n.off=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementOff(t)})},n.toggle=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementToggle(t)})},n._elementWasToggled=function(t){return"true"==t.dataset.toggled},n._elementToggleStatus=function(t){this._elementWasToggled(t)?delete t.dataset.toggled:t.dataset.toggled="true"},n._elementToggle=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e)})},n._elementOn=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e,!0)})},n._elementOff=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e,!1)})},e}(d);function Lt(t){return"TURBO-FRAME"==t.nodeName}Tt.targets=["toggle"],Tt.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var St=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.toggle=function(t){null==t||t.preventDefault();var e=this._getFrame().src;null==e||e!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(t){null==t||t.preventDefault(),this._setSrc()},n.clear=function(t){null==t||t.preventDefault(),this._clear()},n._setSrc=function(){var t=this._getFrame();this.hasLoadingMessageValue&&(t.innerHTML=this.loadingMessageValue),t.src=this._getSrc()},n._clear=function(){var t=this._getFrame();t.src="",t.innerHTML=""},n._getFrame=function(){var t=document.getElementById(""+this.frameIdValue);if(null==t)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(Lt(t))return t;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var t=this.el;if(this.hasSrcValue)return this.srcValue;if(N(t))return t.href;throw new Error("No link given to drive frame to")},e}(d);St.values={frameId:String,src:String,loadingMessage:String};var Ct=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._timeoutHandle=null,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var t=this,e=this.el;if(!Lt(e))throw new Error("Expected controller to be mounted on a element.");if(e.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return t._timeoutHandle=setTimeout(function(){return t.refresh()},t.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(t){null==t||t.preventDefault();var e=this.el;e.src=e.src},o(e,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),e}(d);Ct.values={interval:Number,poll:Boolean};var At=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var t=0,e=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(t=e&&e.length||0).toString(),this.hasErrorClass&&(this._isValidCount(t)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(t){var e=0,n=99999;return this.hasMinValue&&(e=this.minValue),this.hasMaxValue&&(n=this.maxValue),t>=e&&t<=n},e}(d);At.targets=["input","output"],At.values={min:Number,max:Number},At.classes=["error"];export{f as AnchorSpyController,m as AppearanceController,p as AsyncBlockController,v as AutoSubmitFormController,D as AutosizeController,I as CharCountController,x as CheckboxSelectAllController,M as ClipboardController,F as ConfirmController,j as ConfirmNavigationController,q as DebugController,P as DetectDirtyController,W as DetectDirtyFormController,$ as DisableInputsController,U as DisableWithController,J as DismissableController,Y as ElementSaveController,G as EmptyDomController,K as EnableInputsController,Q as FallbackImageController,X as FormRcController,Z as FormSaveController,tt as IntersectionController,nt as LazyBlockController,ot as LightboxImageController,at as LimitedSelectionCheckboxesController,lt as MediaPlayerController,ct as NestedFormController,ut as PasswordConfirmController,ht as PasswordPeekController,dt as RemoteFormController,mt as ResponsiveIframeBodyController,ft as ResponsiveIframeWrapperController,vt as ScrollIntoFocusController,gt as ScrollToBottomController,yt as ScrollToController,bt as ScrollToTopController,_t as SelfDestructController,Et as StickyController,wt as TableSortController,kt as TableTruncateController,Vt as TeleportController,Tt as ToggleClassController,St as TurboFrameRCController,Ct as TurboFrameRefreshController,At as WordCountController}; +import{Controller as t}from"stimulus";import e from"lodash-es/get";import n from"lodash-es/set";import i from"dialog-polyfill";import r from"camelcase";function s(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=t[Symbol.iterator]()).next.bind(n)}var d=function(t){function e(e){var n;return n=t.call(this,e)||this,new Proxy(c(n),{get:function(t,e){var i=Reflect.get(t,e),r=c(n);if(function(t){switch(t){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(t)||/^.*?Target(s)?$/.test(t)||/^.*?Value$/.test(t)||/^.*?ValueChanged$/.test(t)||/^.*?Class$/.test(t)||/^.*?Classes$/.test(t))}(e.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(t,n,i){return r.log(e.toString(),{args:i}),Reflect.apply(t,n,i)}});n.log(e.toString())}return i}})||c(n)}l(e,t);var n=e.prototype;return n.dispatch=function(t,e,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:t}},n);i.detail.target&&(i.detail.target=t);var r=new CustomEvent(e,i);this.logEvent(e,r,t),t.dispatchEvent(r)},n.log=function(t,e){if(void 0===e&&(e={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+t,"color: #3B82F6","color: unset"),n.log(a({element:this.element},e)),n.groupEnd()}},n.logEvent=function(t,e,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+t+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},o(e,[{key:"el",get:function(){return this.element}}]),e}(t),f=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t._checkAnchor(),window.addEventListener("hashchange",t._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(t){null==t||t.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},o(e,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(t){window.location.hash=t}}]),e}(d);f.values={key:String};var m=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var t=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){t._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},e}(d),p=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var t=this,e=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(t){return t.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,t.hasSelectorValue){var s=r.querySelectorAll(t.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);e.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(t._errorMessage),e.dispatch(n,"ajax:error")}).finally(function(){e.dispatch(n,"ajax:complete")})},o(e,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),e}(d);p.targets=["replace"],p.values={endpoint:String,errorMessage:String,selector:String};var v=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var t=this;this.el.querySelectorAll("input, select, textarea").forEach(function(e){return e.addEventListener("change",t.submit)})},n.disconnect=function(){var t=this;this.el.querySelectorAll("input, select, textarea").forEach(function(e){return e.removeEventListener("change",t.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},e}(d);const g=(t,e)=>{const n=t[e];return"function"==typeof n?n:(...t)=>{}},y=(t,e,n)=>{let i=t;return!0===n?i=`${e.identifier}:${t}`:"string"==typeof n&&(i=`${n}:${t}`),i},b=(t,e,n)=>{const{bubbles:i,cancelable:r,composed:s}=e||{bubbles:!0,cancelable:!0,composed:!0};return e&&Object.assign(n,{originalEvent:e}),new CustomEvent(t,{bubbles:i,cancelable:r,composed:s,detail:n})},_={dispatchEvent:!0,eventPrefix:!0},E=(t,e={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},_,e),r=(null==e?void 0:e.element)||t.element,s=t.disconnect.bind(t),o=new IntersectionObserver(e=>{const[s]=e;s.isIntersecting?(e=>{if(t.isVisible=!0,g(t,"appear").call(t,e),n){const n=y("appear",t,i),s=b(n,null,{controller:t,entry:e});r.dispatchEvent(s)}})(s):t.isVisible&&(e=>{if(t.isVisible=!1,g(t,"disappear").call(t,e),n){const n=y("disappear",t,i),s=b(n,null,{controller:t,entry:e});r.dispatchEvent(s)}})(s)},e),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(t,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},w={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},k={debug:!1,logger:console};class V{constructor(t,e={}){var n,i,r;this.log=(t,e)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${t}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},e)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==e?void 0:e.debug)&&void 0!==n?n:t.application.stimulusUseDebug)&&void 0!==i?i:k.debug,this.logger=null!==(r=null==e?void 0:e.logger)&&void 0!==r?r:k.logger,this.controller=t,this.controllerId=t.element.id||t.element.dataset.id,this.controllerInitialize=t.initialize.bind(t),this.controllerConnect=t.connect.bind(t),this.controllerDisconnect=t.disconnect.bind(t)}}class T extends V{constructor(t,e={}){super(t,e),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{g(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{g(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==e?void 0:e.element)||t.element,this.controller=t,this.enhanceController(),this.observe()}enhanceController(){const t=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),t()}})}}class L extends V{constructor(t,e={}){super(t,e),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(t){this.controller.application.handleError(t,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=t=>{g(this.controller,"mutate").call(this.controller,t),this.log("mutate",{entries:t})},this.targetElement=(null==e?void 0:e.element)||t.element,this.controller=t,this.options=e,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const t=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),t()}})}}const S=(t,e={})=>{const n=new L(t,e);return[n.observe,n.unobserve]},C=t=>{const e=e=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:e};g(t,"windowResize").call(t,r)},n=t.disconnect.bind(t),i=()=>{window.addEventListener("resize",e),e()},r=()=>{window.removeEventListener("resize",e)};return Object.assign(t,{disconnect(){r(),n()}}),i(),[i,r]},A=(t,e=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>t.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,e)}};var D=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var t=this;C(this),requestAnimationFrame(function(){t._handler();var e=t.el;e.style.resize="none",e.style.boxSizing="border-box",e.addEventListener("input",t._handler),e.addEventListener("focus",t._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(t){var e=t.offsetHeight-t.clientHeight;t.style.height="auto",t.style.height=t.scrollHeight+e+"px"},e}(d),I=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t.inputTarget.addEventListener("input",t._updateCharCount),t._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var t=this.inputTarget.value.length;this.outputTarget.innerText=t.toString(),this.hasErrorClass&&(this._isValidCount(t)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(t){var e=0,n=99999;return this.hasMinValue&&(e=this.minValue),this.hasMaxValue&&(n=this.maxValue),t>=e&&t<=n},e}(d);I.targets=["input","output"],I.values={min:Number,max:Number},I.classes=["error"];var x=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t.hasSelectAllTarget&&(t.selectAllTarget.addEventListener("change",t._toggle),t.checkboxTargets.forEach(function(e){return e.addEventListener("change",t._refresh)}),t._refresh())})},n.disconnect=function(){var t=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(e){return e.removeEventListener("change",t._refresh)}))},n._toggle=function(t){t.preventDefault();var e=t.target;this.checkboxTargets.forEach(function(t){return t.checked=e.checked})},n._refresh=function(){var t=this.checkboxTargets.length,e=this._checked.length;this.selectAllTarget.checked=e>0,this.selectAllTarget.indeterminate=e>0&&e0&&(H(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:H(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),e}(d);Z.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var tt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){E(this,{threshold:this._threshold,element:this.el})},n.appear=function(t){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(t){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},o(e,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(t){return Number.parseFloat(t.trim())}).filter(function(t){return t>=0&&t<=1}):[0,1]}}]),e}(d);tt.values={threshold:String};var et,nt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){if("IntersectionObserver"in window){var t=E(this,{element:this.el,threshold:.3});this.observe=t[0],this.unobserve=t[1]}else this.loadContent()},n.appear=function(t){t.target===this.el&&t.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},e}(p),it=function(t,e){var n=void 0===e?{}:e,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,o=void 0===s?"start":s,a=n.inline,l=void 0===a?"nearest":a;try{var c=function(){t.scrollIntoView({behavior:r,block:o,inline:l})},u=function(){if("smooth"==r&&!rt)return Promise.resolve(function(){try{return Promise.resolve(import("smoothscroll-polyfill")).then(function(t){et||(et=!0,(0,t.polyfill)())})}catch(t){return Promise.reject(t)}}()).then(function(){})}();return Promise.resolve(u&&u.then?u.then(c):c())}catch(t){return Promise.reject(t)}},rt="scrollBehavior"in document.documentElement.style;function st(t){if(!t)return null;var e=getComputedStyle(t).overflowY;return"visible"!==e&&"hidden"!==e&&t.scrollHeight>=t.clientHeight?t:st(t.parentElement)||document.body}var ot=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._dialog=null,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var t=this,e=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),e.insertAdjacentElement("afterend",this._dialog),i.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),it(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return t._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var t=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,it(this.el,{behavior:"smooth",block:"end"}).catch(function(){return t.el.scrollIntoView(!1)}))},o(e,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),e}(d);ot.values={src:String,srcSet:String,sizes:String},ot.classes=["modal","image"];var at=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var t=this;this.inputTargets.forEach(function(e){return e.addEventListener("change",t.handleInputs)})},n.disconnect=function(){var t=this;this.inputTargets.forEach(function(e){return e.removeEventListener("change",t.handleInputs)})},n.handleInputs=function(t){var e=this.inputTargets.reduce(function(t,e){return e.checked?t+1:t},0),n=t.target;e>this.maxValue?(t.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},e}(d);at.targets=["input","error"],at.values={max:Number,message:String};var lt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(t){try{return null==t||t.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(t){return Promise.reject(t)}},n.pause=function(t){null==t||t.preventDefault(),this.mediaTarget.pause()},n.restart=function(t){null==t||t.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(t){null==t||t.preventDefault(),this.mediaTarget.currentTime+=5},e}(d);lt.targets=["media"];var ct=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){this._checkStructure()},n.add=function(t){null==t||t.preventDefault();var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,e)},n.remove=function(t){t.preventDefault();var e=t.target.closest("."+this._wrapperClass);if(null==e)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===e.dataset.newRecord)e.remove();else{e.style.display="none";var n=e.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},o(e,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),e}(d);ct.targets=["target","template"],ct.values={insertMode:String,wrapperClass:String};var ut=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var t=this;this.passwordTargets.forEach(function(e){return e.addEventListener("change",t.checkPasswordsMatch)})},n.disconnect=function(){var t=this;this.passwordTargets.forEach(function(e){return e.removeEventListener("change",t.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var t=new Set(this.passwordTargets.map(function(t){return t.value}));return t.has("")||1==t.size},n.checkPasswordsMatch=function(){var t=this,e=this.el;this._allPasswordsMatch()?(this.dispatch(e,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(e){return e.classList.remove(t.errorClass)})):(this.dispatch(e,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(e){return e.classList.add(t.errorClass)}))},e}(d);ut.targets=["password"],ut.classes=["error"];var ht=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.peak=function(t){null==t||t.preventDefault(),this.passwordTarget.type="text"},n.hide=function(t){null==t||t.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(t){null==t||t.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},e}(d);ht.targets=["password"];var dt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.replace=function(t){var e=t.detail[0];if(e instanceof Node){var n=e.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",e)},o(e,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),e}(d);dt.targets=[],dt.values={selector:String};var ft=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(t){var e=t.data;e.hasOwnProperty("name")&&"iframe-body"===e.name&&e.hasOwnProperty("height")&&this.resize(e.height)},n.resize=function(t){this.el.style.height=t+"px"},e}(d),mt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t,e,n;window.self!==window.top&&(C(this),e={},null===(n=(t=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(t[n]=A(t[n],null==e?void 0:e.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;t[i]=A(t[i],r||(null==e?void 0:e.wait))}}),this.postUpdate())},n.windowResize=function(t){this.postUpdate()},n.postUpdate=function(){var t={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(t,"*")},n.getHeight=function(){var t=document.body,e=document.documentElement;return Math.max(t.scrollHeight,t.offsetHeight,e.clientHeight,e.scrollHeight,e.offsetHeight)},e}(d);mt.debounces=["postUpdate"];var pt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(t){var e,n,i,s=this;t.dataset.controller=(null==(e=t.dataset.controller)?void 0:e.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==t.dataset.controller&&delete t.dataset.controller;var o=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");t.dataset.target=(null==(n=t.dataset.target)?void 0:n.replaceAll(o,""))||"",delete t.dataset[r(this.identifier+"-target")],""==t.dataset.target&&delete t.dataset.target,t.dataset.action=(null==(i=t.dataset.target)?void 0:i.replaceAll(o,""))||"",delete t.dataset[r(this.identifier+"-action")],""==t.dataset.action&&delete t.dataset.action;var a=this.constructor.values;a&&Object.keys(a).forEach(function(e){return delete t.dataset[r(s.identifier+"-"+e+"-value")]});var l=this.constructor.classes;l&&Object.keys(l).forEach(function(e){return delete t.dataset[r(s.identifier+"-"+e+"-class")]})},e}(d),vt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.connect=function(){var t=this;requestAnimationFrame(function(){it(t.el,{behavior:t.hasBehaviorValue?t.behaviorValue:"smooth",block:t.hasBlockValue?t.blockValue:"center",inline:t.hasInlineValue?t.inlineValue:"center"}).catch(function(){return t.el.scrollIntoView()}),t._cleanupSelf()})},e}(pt);vt.values={behavior:String,block:String,inline:String};var gt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(t){var e;null==t||t.preventDefault(),null!=(e="document"==(this.hasModeValue?this.modeValue:"document")?document.body:st(this.el))&&it(e,{behavior:"smooth",block:"end"}).catch(function(){return e.scrollIntoView(!1)})},e}(d);gt.values={mode:String};var yt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(){var t=document.querySelector(this.selectorValue);t?it(t,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return t.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},e}(d);yt.values={selector:String,behavior:String,block:String,inline:String};var bt=function(t){function e(){return t.apply(this,arguments)||this}return l(e,t),e.prototype.scroll=function(t){var e;null==t||t.preventDefault(),null!=(e="document"==(this.hasModeValue?this.modeValue:"document")?document.body:st(this.el))&&it(e,{behavior:"smooth",block:"start"}).catch(function(){return e.scrollIntoView(!1)})},e}(d);bt.values={mode:String};var _t=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._timeout=null,e}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;requestAnimationFrame(function(){t._timeout=setTimeout(function(){return t.el.remove()},1e3*t.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},e}(d);_t.values={seconds:Number};var Et=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._magicElement=null,e}l(e,t);var n=e.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var t=this,e=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===t._magicElement&&(0===n.intersectionRatio?e.classList.add(t.hasStuckClass?t.stuckClass:"stuck"):1===n.intersectionRatio&&e.classList.remove(t.hasStuckClass?t.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},o(e,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),e}(d);Et.classes=["stuck"],Et.values={mode:String};var wt=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._lastIndex=null,e._reverse=!1,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t._tableHeaders.forEach(function(e){return e.addEventListener("click",t.sort)}),t.hasStartSortValue&&t._sortByColumn(t.startSortValue)})},n.disconnect=function(){var t=this;this._tableHeaders.forEach(function(e){return e.removeEventListener("click",t.sort)})},n.sort=function(t){t.preventDefault();var e=this._indexOfHeaderCell(t.target);this._sortByColumn(e)},n._indexOfHeaderCell=function(t){return this._tableHeaders.indexOf(t)},n._sortByColumn=function(t){var e=this;this._reverse=t===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[t])?void 0:r.innerText)||"",c=(null==(s=a[t])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:e._reverse?u>0?-1:1:u}).forEach(function(t){return n.appendChild(t)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=t},o(e,[{key:"_tableHead",get:function(){var t=this.el.tHead;if(null==t)throw new Error("Expected table to have a element.");return t}},{key:"_tableHeaders",get:function(){var t=this._tableHead.rows;if(0==t.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(t[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),e}(d);wt.values={startSort:Number};var kt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var t=this;S(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){t.truncate(),t.showMoreTarget.addEventListener("click",t.expand)})},n.truncate=function(t){var e=this;null==t||t.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(t){var e=this;this._truncated=!1,null==t||t.preventDefault(),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._hideElement(this.showMoreTarget)},n.mutate=function(t){this._truncated&&this._reTruncate()},n._showElement=function(t){t.style.display=""},n._hideElement=function(t){t.style.display="none"},n._reTruncate=function(){var t=this;this._tableRows.slice(0,this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)},o(e,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(t){this.truncatedValue=t}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),e}(d);kt.targets=["showMore"],kt.values={limit:Number,truncated:Boolean};var Vt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){t.hasImmediateValue&&t.immediateValue&&t.execute()})},n.execute=function(t){null==t||t.preventDefault();var e=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=e.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}e.remove()}else this.dispatch(e,"teleport:error")},e}(pt);Vt.values={target:String,insert:String,immediate:Boolean};var Tt=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._timeoutHandle=null,e}l(e,t);var n=e.prototype;return n.initialize=function(){this._timeout=this._timeout.bind(this)},n.connect=function(){var t=this;requestAnimationFrame(function(){t._timeoutHandle=window.setTimeout(t._timeout,1e3*t.secondsValue)})},n.disconnect=function(){this._timeoutHandle&&window.clearTimeout(this._timeoutHandle)},n._timeout=function(){this.dispatch(this.el,"timeout")},e}(d);Tt.values={seconds:Number};var Lt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.connect=function(){var t=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((t,e={})=>{new T(this,e)})(),this.hasClickAwayValue&&this.clickAwayValue&&((t,e={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},w,e),o=r=>{const o=(null==e?void 0:e.element)||t.element;if(!(o.contains(r.target)||!function(t){const e=t.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return e.top<=n&&e.top+e.height>=0&&e.left<=i&&e.left+e.width>=0}(o)&&n)&&(t.clickOutside&&t.clickOutside(r),i)){const e=y("click:outside",t,s),n=b(e,r,{controller:t});o.dispatchEvent(n)}},a=t.disconnect.bind(t);Object.assign(t,{disconnect(){null==r||r.forEach(t=>{window.removeEventListener(t,o,!1)}),a()}}),null==r||r.forEach(t=>{window.addEventListener(t,o,!1)})})(this),requestAnimationFrame(function(){t.hasInitialValue&&t.toggleTargets.forEach("on"===t.initialValue?function(e){return t._elementOn(e)}:function(e){return t._elementOff(e)})})},n.clickOutside=function(){var t=this;this.toggleTargets.forEach(function(e){t._elementWasToggled(e)&&(t._elementToggleStatus(e),t._elementToggle(e))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementOn(t)})},n.off=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementOff(t)})},n.toggle=function(t){var e=this;this.toggleTargets.forEach(function(t){e._elementToggleStatus(t),e._elementToggle(t)})},n._elementWasToggled=function(t){return"true"==t.dataset.toggled},n._elementToggleStatus=function(t){this._elementWasToggled(t)?delete t.dataset.toggled:t.dataset.toggled="true"},n._elementToggle=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e)})},n._elementOn=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e,!0)})},n._elementOff=function(t){this.classValue.split(" ").forEach(function(e){return t.classList.toggle(e,!1)})},e}(d);function St(t){return"TURBO-FRAME"==t.nodeName}Lt.targets=["toggle"],Lt.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var Ct=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.toggle=function(t){null==t||t.preventDefault();var e=this._getFrame().src;null==e||e!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(t){null==t||t.preventDefault(),this._setSrc()},n.clear=function(t){null==t||t.preventDefault(),this._clear()},n._setSrc=function(){var t=this._getFrame();this.hasLoadingMessageValue&&(t.innerHTML=this.loadingMessageValue),t.src=this._getSrc()},n._clear=function(){var t=this._getFrame();t.src="",t.innerHTML=""},n._getFrame=function(){var t=document.getElementById(""+this.frameIdValue);if(null==t)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(St(t))return t;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var t=this.el;if(this.hasSrcValue)return this.srcValue;if(N(t))return t.href;throw new Error("No link given to drive frame to")},e}(d);Ct.values={frameId:String,src:String,loadingMessage:String};var At=function(t){function e(){var e;return(e=t.apply(this,arguments)||this)._timeoutHandle=null,e}l(e,t);var n=e.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var t=this,e=this.el;if(!St(e))throw new Error("Expected controller to be mounted on a element.");if(e.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return t._timeoutHandle=setTimeout(function(){return t.refresh()},t.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(t){null==t||t.preventDefault();var e=this.el;e.src=e.src},o(e,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),e}(d);At.values={interval:Number,poll:Boolean};var Dt=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var n=e.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var t=0,e=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(t=e&&e.length||0).toString(),this.hasErrorClass&&(this._isValidCount(t)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(t){var e=0,n=99999;return this.hasMinValue&&(e=this.minValue),this.hasMaxValue&&(n=this.maxValue),t>=e&&t<=n},e}(d);Dt.targets=["input","output"],Dt.values={min:Number,max:Number},Dt.classes=["error"];export{f as AnchorSpyController,m as AppearanceController,p as AsyncBlockController,v as AutoSubmitFormController,D as AutosizeController,I as CharCountController,x as CheckboxSelectAllController,M as ClipboardController,F as ConfirmController,j as ConfirmNavigationController,q as DebugController,P as DetectDirtyController,W as DetectDirtyFormController,$ as DisableInputsController,U as DisableWithController,J as DismissableController,Y as ElementSaveController,G as EmptyDomController,K as EnableInputsController,Q as FallbackImageController,X as FormRcController,Z as FormSaveController,tt as IntersectionController,nt as LazyBlockController,ot as LightboxImageController,at as LimitedSelectionCheckboxesController,lt as MediaPlayerController,ct as NestedFormController,ut as PasswordConfirmController,ht as PasswordPeekController,dt as RemoteFormController,mt as ResponsiveIframeBodyController,ft as ResponsiveIframeWrapperController,vt as ScrollIntoFocusController,gt as ScrollToBottomController,yt as ScrollToController,bt as ScrollToTopController,_t as SelfDestructController,Et as StickyController,wt as TableSortController,kt as TableTruncateController,Vt as TeleportController,Tt as TimeoutController,Lt as ToggleClassController,Ct as TurboFrameRCController,At as TurboFrameRefreshController,Dt as WordCountController}; //# sourceMappingURL=stimulus-library.module.js.map diff --git a/dist/stimulus-library.module.js.map b/dist/stimulus-library.module.js.map index 69ba06c3..8372c549 100644 --- a/dist/stimulus-library.module.js.map +++ b/dist/stimulus-library.module.js.map @@ -1 +1 @@ -{"version":3,"file":"stimulus-library.module.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","LazyBlockController","smoothPolyfilled","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","import","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"stimulus-library.module.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/lazy_block_controller.ts","../src/utilities/scroll.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TimeoutController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeoutHandle: null | number = null;\r\n\r\n initialize() {\r\n this._timeout = this._timeout.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._timeoutHandle = window.setTimeout(this._timeout, this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeoutHandle) {\r\n window.clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n\r\n _timeout() {\r\n this.dispatch(this.el, \"timeout\");\r\n }\r\n\r\n}","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","LazyBlockController","smoothPolyfilled","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","import","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","TimeoutController","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file diff --git a/dist/stimulus-library.umd.js b/dist/stimulus-library.umd.js index 27eb293c..a38400ef 100644 --- a/dist/stimulus-library.umd.js +++ b/dist/stimulus-library.umd.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("stimulus"),require("lodash-es/get"),require("lodash-es/set"),require("dialog-polyfill"),require("camelcase")):"function"==typeof define&&define.amd?define(["exports","stimulus","lodash-es/get","lodash-es/set","dialog-polyfill","camelcase"],t):t((e||self).stimulusLibrary={},e.stimulus,e._get,e._set,e.dialogPolyfill,e.camelcase)}(this,function(e,t,n,i,r,s){function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(n),l=o(i),c=o(r),u=o(s);function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}var b=function(e){function t(t){var n;return n=e.call(this,t)||this,new Proxy(p(n),{get:function(e,t){var i=Reflect.get(e,t),r=p(n);if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(e,n,i){return r.log(t.toString(),{args:i}),Reflect.apply(e,n,i)}});n.log(t.toString())}return i}})||p(n)}m(t,e);var n=t.prototype;return n.dispatch=function(e,t,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},n);i.detail.target&&(i.detail.target=e);var r=new CustomEvent(t,i);this.logEvent(t,r,e),e.dispatchEvent(r)},n.log=function(e,t){if(void 0===t&&(t={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+e,"color: #3B82F6","color: unset"),n.log(f({element:this.element},t)),n.groupEnd()}},n.logEvent=function(e,t,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+e+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},d(t,[{key:"el",get:function(){return this.element}}]),t}(t.Controller),y=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._checkAnchor(),window.addEventListener("hashchange",e._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(e){null==e||e.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},d(t,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(e){window.location.hash=e}}]),t}(b);y.values={key:String};var _=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var e=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){e._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},t}(b),E=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var e=this,t=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(e){return e.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,e.hasSelectorValue){var s=r.querySelectorAll(e.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);t.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(e._errorMessage),t.dispatch(n,"ajax:error")}).finally(function(){t.dispatch(n,"ajax:complete")})},d(t,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),t}(b);E.targets=["replace"],E.values={endpoint:String,errorMessage:String,selector:String};var w=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.addEventListener("change",e.submit)})},n.disconnect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.removeEventListener("change",e.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},t}(b);const k=(e,t)=>{const n=e[t];return"function"==typeof n?n:(...e)=>{}},C=(e,t,n)=>{let i=e;return!0===n?i=`${t.identifier}:${e}`:"string"==typeof n&&(i=`${n}:${e}`),i},T=(e,t,n)=>{const{bubbles:i,cancelable:r,composed:s}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:r,composed:s,detail:n})},V={dispatchEvent:!0,eventPrefix:!0},S=(e,t={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},V,t),r=(null==t?void 0:t.element)||e.element,s=e.disconnect.bind(e),o=new IntersectionObserver(t=>{const[s]=t;s.isIntersecting?(t=>{if(e.isVisible=!0,k(e,"appear").call(e,t),n){const n=C("appear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s):e.isVisible&&(t=>{if(e.isVisible=!1,k(e,"disappear").call(e,t),n){const n=C("disappear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s)},t),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(e,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},L={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},A={debug:!1,logger:console};class D{constructor(e,t={}){var n,i,r;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==t?void 0:t.debug)&&void 0!==n?n:e.application.stimulusUseDebug)&&void 0!==i?i:A.debug,this.logger=null!==(r=null==t?void 0:t.logger)&&void 0!==r?r:A.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class I extends D{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{k(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{k(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class x extends D{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{k(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const M=(e,t={})=>{const n=new x(e,t);return[n.observe,n.unobserve]},N=e=>{const t=t=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:t};k(e,"windowResize").call(e,r)},n=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},r=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){r(),n()}}),i(),[i,r]},O=(e,t=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>e.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,t)}};var H=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var e=this;N(this),requestAnimationFrame(function(){e._handler();var t=e.el;t.style.resize="none",t.style.boxSizing="border-box",t.addEventListener("input",e._handler),t.addEventListener("focus",e._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(e){var t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"},t}(b),R=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.inputTarget.addEventListener("input",e._updateCharCount),e._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);R.targets=["input","output"],R.values={min:Number,max:Number},R.classes=["error"];var z=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.hasSelectAllTarget&&(e.selectAllTarget.addEventListener("change",e._toggle),e.checkboxTargets.forEach(function(t){return t.addEventListener("change",e._refresh)}),e._refresh())})},n.disconnect=function(){var e=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(t){return t.removeEventListener("change",e._refresh)}))},n._toggle=function(e){e.preventDefault();var t=e.target;this.checkboxTargets.forEach(function(e){return e.checked=t.checked})},n._refresh=function(){var e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t0&&(j(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:j(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),t}(b);se.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var oe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){S(this,{threshold:this._threshold,element:this.el})},n.appear=function(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},d(t,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(e){return Number.parseFloat(e.trim())}).filter(function(e){return e>=0&&e<=1}):[0,1]}}]),t}(b);oe.values={threshold:String};var ae,le=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){if("IntersectionObserver"in window){var e=S(this,{element:this.el,threshold:.3});this.observe=e[0],this.unobserve=e[1]}else this.loadContent()},n.appear=function(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},t}(E),ce=function(e,t){var n=void 0===t?{}:t,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,o=void 0===s?"start":s,a=n.inline,l=void 0===a?"nearest":a;try{var c=function(){e.scrollIntoView({behavior:r,block:o,inline:l})},u=function(){if("smooth"==r&&!ue)return Promise.resolve(function(){try{return Promise.resolve(import("smoothscroll-polyfill")).then(function(e){ae||(ae=!0,(0,e.polyfill)())})}catch(e){return Promise.reject(e)}}()).then(function(){})}();return Promise.resolve(u&&u.then?u.then(c):c())}catch(e){return Promise.reject(e)}},ue="scrollBehavior"in document.documentElement.style;function he(e){if(!e)return null;var t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:he(e.parentElement)||document.body}var de=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._dialog=null,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var e=this,t=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),t.insertAdjacentElement("afterend",this._dialog),c.default.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),ce(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return e._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var e=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,ce(this.el,{behavior:"smooth",block:"end"}).catch(function(){return e.el.scrollIntoView(!1)}))},d(t,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),t}(b);de.values={src:String,srcSet:String,sizes:String},de.classes=["modal","image"];var fe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var e=this;this.inputTargets.forEach(function(t){return t.addEventListener("change",e.handleInputs)})},n.disconnect=function(){var e=this;this.inputTargets.forEach(function(t){return t.removeEventListener("change",e.handleInputs)})},n.handleInputs=function(e){var t=this.inputTargets.reduce(function(e,t){return t.checked?e+1:e},0),n=e.target;t>this.maxValue?(e.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},t}(b);fe.targets=["input","error"],fe.values={max:Number,message:String};var me=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(e){try{return null==e||e.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(e){return Promise.reject(e)}},n.pause=function(e){null==e||e.preventDefault(),this.mediaTarget.pause()},n.restart=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5},t}(b);me.targets=["media"];var pe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){this._checkStructure()},n.add=function(e){null==e||e.preventDefault();var t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)},n.remove=function(e){e.preventDefault();var t=e.target.closest("."+this._wrapperClass);if(null==t)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";var n=t.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},d(t,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),t}(b);pe.targets=["target","template"],pe.values={insertMode:String,wrapperClass:String};var ve=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.addEventListener("change",e.checkPasswordsMatch)})},n.disconnect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.removeEventListener("change",e.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var e=new Set(this.passwordTargets.map(function(e){return e.value}));return e.has("")||1==e.size},n.checkPasswordsMatch=function(){var e=this,t=this.el;this._allPasswordsMatch()?(this.dispatch(t,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.remove(e.errorClass)})):(this.dispatch(t,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.add(e.errorClass)}))},t}(b);ve.targets=["password"],ve.classes=["error"];var ge=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.peak=function(e){null==e||e.preventDefault(),this.passwordTarget.type="text"},n.hide=function(e){null==e||e.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},t}(b);ge.targets=["password"];var be=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.replace=function(e){var t=e.detail[0];if(t instanceof Node){var n=t.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",t)},d(t,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),t}(b);be.targets=[],be.values={selector:String};var ye=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(e){var t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)},n.resize=function(e){this.el.style.height=e+"px"},t}(b),_e=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e,t,n;window.self!==window.top&&(N(this),t={},null===(n=(e=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(e[n]=O(e[n],null==t?void 0:t.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;e[i]=O(e[i],r||(null==t?void 0:t.wait))}}),this.postUpdate())},n.windowResize=function(e){this.postUpdate()},n.postUpdate=function(){var e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")},n.getHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},t}(b);_e.debounces=["postUpdate"];var Ee=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(e){var t,n,i,r=this;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;var s=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");e.dataset.target=(null==(n=e.dataset.target)?void 0:n.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-target")],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-action")],""==e.dataset.action&&delete e.dataset.action;var o=this.constructor.values;o&&Object.keys(o).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-value")]});var a=this.constructor.classes;a&&Object.keys(a).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-class")]})},t}(b),we=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.connect=function(){var e=this;requestAnimationFrame(function(){ce(e.el,{behavior:e.hasBehaviorValue?e.behaviorValue:"smooth",block:e.hasBlockValue?e.blockValue:"center",inline:e.hasInlineValue?e.inlineValue:"center"}).catch(function(){return e.el.scrollIntoView()}),e._cleanupSelf()})},t}(Ee);we.values={behavior:String,block:String,inline:String};var ke=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"end"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);ke.values={mode:String};var Ce=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(){var e=document.querySelector(this.selectorValue);e?ce(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return e.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},t}(b);Ce.values={selector:String,behavior:String,block:String,inline:String};var Te=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"start"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);Te.values={mode:String};var Ve=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeout=null,t}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeout=setTimeout(function(){return e.el.remove()},1e3*e.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},t}(b);Ve.values={seconds:Number};var Se=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._magicElement=null,t}m(t,e);var n=t.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var e=this,t=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===e._magicElement&&(0===n.intersectionRatio?t.classList.add(e.hasStuckClass?e.stuckClass:"stuck"):1===n.intersectionRatio&&t.classList.remove(e.hasStuckClass?e.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},d(t,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),t}(b);Se.classes=["stuck"],Se.values={mode:String};var Le=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._lastIndex=null,t._reverse=!1,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._tableHeaders.forEach(function(t){return t.addEventListener("click",e.sort)}),e.hasStartSortValue&&e._sortByColumn(e.startSortValue)})},n.disconnect=function(){var e=this;this._tableHeaders.forEach(function(t){return t.removeEventListener("click",e.sort)})},n.sort=function(e){e.preventDefault();var t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)},n._indexOfHeaderCell=function(e){return this._tableHeaders.indexOf(e)},n._sortByColumn=function(e){var t=this;this._reverse=e===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[e])?void 0:r.innerText)||"",c=(null==(s=a[e])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:t._reverse?u>0?-1:1:u}).forEach(function(e){return n.appendChild(e)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=e},d(t,[{key:"_tableHead",get:function(){var e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}},{key:"_tableHeaders",get:function(){var e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),t}(b);Le.values={startSort:Number};var Ae=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var e=this;M(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){e.truncate(),e.showMoreTarget.addEventListener("click",e.expand)})},n.truncate=function(e){var t=this;null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(e){var t=this;this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._hideElement(this.showMoreTarget)},n.mutate=function(e){this._truncated&&this._reTruncate()},n._showElement=function(e){e.style.display=""},n._hideElement=function(e){e.style.display="none"},n._reTruncate=function(){var e=this;this._tableRows.slice(0,this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)},d(t,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(e){this.truncatedValue=e}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),t}(b);Ae.targets=["showMore"],Ae.values={limit:Number,truncated:Boolean};var De=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){e.hasImmediateValue&&e.immediateValue&&e.execute()})},n.execute=function(e){null==e||e.preventDefault();var t=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}else this.dispatch(t,"teleport:error")},t}(Ee);De.values={target:String,insert:String,immediate:Boolean};var Ie=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new I(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},L,t),o=r=>{const o=(null==t?void 0:t.element)||e.element;if(!(o.contains(r.target)||!function(e){const t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=n&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(o)&&n)&&(e.clickOutside&&e.clickOutside(r),i)){const t=C("click:outside",e,s),n=T(t,r,{controller:e});o.dispatchEvent(n)}},a=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==r||r.forEach(e=>{window.removeEventListener(e,o,!1)}),a()}}),null==r||r.forEach(e=>{window.addEventListener(e,o,!1)})})(this),requestAnimationFrame(function(){e.hasInitialValue&&e.toggleTargets.forEach("on"===e.initialValue?function(t){return e._elementOn(t)}:function(t){return e._elementOff(t)})})},n.clickOutside=function(){var e=this;this.toggleTargets.forEach(function(t){e._elementWasToggled(t)&&(e._elementToggleStatus(t),e._elementToggle(t))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOn(e)})},n.off=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOff(e)})},n.toggle=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementToggle(e)})},n._elementWasToggled=function(e){return"true"==e.dataset.toggled},n._elementToggleStatus=function(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"},n._elementToggle=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t)})},n._elementOn=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!0)})},n._elementOff=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!1)})},t}(b);function xe(e){return"TURBO-FRAME"==e.nodeName}Ie.targets=["toggle"],Ie.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var Me=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.toggle=function(e){null==e||e.preventDefault();var t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(e){null==e||e.preventDefault(),this._setSrc()},n.clear=function(e){null==e||e.preventDefault(),this._clear()},n._setSrc=function(){var e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()},n._clear=function(){var e=this._getFrame();e.src="",e.innerHTML=""},n._getFrame=function(){var e=document.getElementById(""+this.frameIdValue);if(null==e)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(xe(e))return e;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var e=this.el;if(this.hasSrcValue)return this.srcValue;if(B(e))return e.href;throw new Error("No link given to drive frame to")},t}(b);Me.values={frameId:String,src:String,loadingMessage:String};var Ne=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var e=this,t=this.el;if(!xe(t))throw new Error("Expected controller to be mounted on a element.");if(t.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return e._timeoutHandle=setTimeout(function(){return e.refresh()},e.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(e){null==e||e.preventDefault();var t=this.el;t.src=t.src},d(t,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),t}(b);Ne.values={interval:Number,poll:Boolean};var Oe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var e=0,t=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(e=t&&t.length||0).toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);Oe.targets=["input","output"],Oe.values={min:Number,max:Number},Oe.classes=["error"],e.AnchorSpyController=y,e.AppearanceController=_,e.AsyncBlockController=E,e.AutoSubmitFormController=w,e.AutosizeController=H,e.CharCountController=R,e.CheckboxSelectAllController=z,e.ClipboardController=F,e.ConfirmController=U,e.ConfirmNavigationController=J,e.DebugController=Y,e.DetectDirtyController=G,e.DetectDirtyFormController=K,e.DisableInputsController=Q,e.DisableWithController=X,e.DismissableController=Z,e.ElementSaveController=ee,e.EmptyDomController=te,e.EnableInputsController=ne,e.FallbackImageController=ie,e.FormRcController=re,e.FormSaveController=se,e.IntersectionController=oe,e.LazyBlockController=le,e.LightboxImageController=de,e.LimitedSelectionCheckboxesController=fe,e.MediaPlayerController=me,e.NestedFormController=pe,e.PasswordConfirmController=ve,e.PasswordPeekController=ge,e.RemoteFormController=be,e.ResponsiveIframeBodyController=_e,e.ResponsiveIframeWrapperController=ye,e.ScrollIntoFocusController=we,e.ScrollToBottomController=ke,e.ScrollToController=Ce,e.ScrollToTopController=Te,e.SelfDestructController=Ve,e.StickyController=Se,e.TableSortController=Le,e.TableTruncateController=Ae,e.TeleportController=De,e.ToggleClassController=Ie,e.TurboFrameRCController=Me,e.TurboFrameRefreshController=Ne,e.WordCountController=Oe}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("stimulus"),require("lodash-es/get"),require("lodash-es/set"),require("dialog-polyfill"),require("camelcase")):"function"==typeof define&&define.amd?define(["exports","stimulus","lodash-es/get","lodash-es/set","dialog-polyfill","camelcase"],t):t((e||self).stimulusLibrary={},e.stimulus,e._get,e._set,e.dialogPolyfill,e.camelcase)}(this,function(e,t,n,i,r,s){function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(n),l=o(i),c=o(r),u=o(s);function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}var b=function(e){function t(t){var n;return n=e.call(this,t)||this,new Proxy(p(n),{get:function(e,t){var i=Reflect.get(e,t),r=p(n);if(function(e){switch(e){case"application":case"el":case"element":case"constructor":case"initialize":case"log":case"logEvent":case"dispatch":case"data":case"valueDescriptorMap":case"mutate":case"identifier":return!1}return!(/^_.*?$/.test(e)||/^.*?Target(s)?$/.test(e)||/^.*?Value$/.test(e)||/^.*?ValueChanged$/.test(e)||/^.*?Class$/.test(e)||/^.*?Classes$/.test(e))}(t.toString())){if("function"==typeof i)return new Proxy(i,{apply:function(e,n,i){return r.log(t.toString(),{args:i}),Reflect.apply(e,n,i)}});n.log(t.toString())}return i}})||p(n)}m(t,e);var n=t.prototype;return n.dispatch=function(e,t,n){void 0===n&&(n={});var i=Object.assign({},{bubbles:!0,cancelable:!0,detail:{target:e}},n);i.detail.target&&(i.detail.target=e);var r=new CustomEvent(t,i);this.logEvent(t,r,e),e.dispatchEvent(r)},n.log=function(e,t){if(void 0===t&&(t={}),this.application.debug){var n=console;n.groupCollapsed("%c"+this.identifier+" %c#"+e,"color: #3B82F6","color: unset"),n.log(f({element:this.element},t)),n.groupEnd()}},n.logEvent=function(e,t,n){if(this.application.debug){var i=console;i.groupCollapsed("%c"+this.identifier+" %c"+e+"%c","color: #3B82F6","color: #0be000","color: unset"),i.log({element:n}),i.groupEnd()}},d(t,[{key:"el",get:function(){return this.element}}]),t}(t.Controller),y=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._checkAnchor=this._checkAnchor.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._checkAnchor(),window.addEventListener("hashchange",e._checkAnchor)})},n.disconnect=function(){window.removeEventListener("hashchange",this._checkAnchor)},n.write=function(e){null==e||e.preventDefault(),this._anchor=this._key},n._checkAnchor=function(){this.dispatch(this.el,this._key===this._anchor?"anchor-spy:active":"anchor-spy:inactive")},d(t,[{key:"_key",get:function(){return this.keyValue.replaceAll("#","")}},{key:"_anchor",get:function(){return window.location.hash.substr(1)},set:function(e){window.location.hash=e}}]),t}(b);y.values={key:String};var _=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._handleVisibility=this._handleVisibility.bind(this)},n.connect=function(){var e=this;window.addEventListener("focus",this._handleVisibility),window.addEventListener("blur",this._handleVisibility),document.addEventListener("visibilitychange",this._handleVisibility),requestAnimationFrame(function(){e._handleVisibility()})},n.disconnect=function(){window.removeEventListener("focus",this._handleVisibility),window.removeEventListener("blur",this._handleVisibility),document.removeEventListener("visibilitychange",this._handleVisibility)},n.appear=function(){this.dispatch(this.el,"appearance:appear")},n.away=function(){this.dispatch(this.el,"appearance:away")},n._handleVisibility=function(){this._documentIsActive()?this.appear():this.away()},n._documentIsActive=function(){return"visible"==document.visibilityState&&document.hasFocus()},t}(b),E=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){this.loadContent()},n.loadContent=function(){var e=this,t=this,n=this.hasReplaceTarget?this.replaceTarget:this.el;fetch(this.endpointValue).then(function(e){return e.text()}).then(function(i){var r=document.createElement("div");if(r.innerHTML=i,e.hasSelectorValue){var s=r.querySelectorAll(e.selectorValue);n.replaceWith.apply(n,s)}else n.replaceWith.apply(n,r.children);t.dispatch(n,"ajax:success")}).catch(function(i){n.replaceWith(e._errorMessage),t.dispatch(n,"ajax:error")}).finally(function(){t.dispatch(n,"ajax:complete")})},d(t,[{key:"_errorMessage",get:function(){return this.hasErrorMessageValue?this.errorMessageValue:"This content failed to load"}}]),t}(b);E.targets=["replace"],E.values={endpoint:String,errorMessage:String,selector:String};var w=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.submit=this.submit.bind(this)},n.connect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.addEventListener("change",e.submit)})},n.disconnect=function(){var e=this;this.el.querySelectorAll("input, select, textarea").forEach(function(t){return t.removeEventListener("change",e.submit)})},n.submit=function(){this.dispatch(this.el,"submit")},t}(b);const k=(e,t)=>{const n=e[t];return"function"==typeof n?n:(...e)=>{}},C=(e,t,n)=>{let i=e;return!0===n?i=`${t.identifier}:${e}`:"string"==typeof n&&(i=`${n}:${e}`),i},T=(e,t,n)=>{const{bubbles:i,cancelable:r,composed:s}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(e,{bubbles:i,cancelable:r,composed:s,detail:n})},V={dispatchEvent:!0,eventPrefix:!0},S=(e,t={})=>{const{dispatchEvent:n,eventPrefix:i}=Object.assign({},V,t),r=(null==t?void 0:t.element)||e.element,s=e.disconnect.bind(e),o=new IntersectionObserver(t=>{const[s]=t;s.isIntersecting?(t=>{if(e.isVisible=!0,k(e,"appear").call(e,t),n){const n=C("appear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s):e.isVisible&&(t=>{if(e.isVisible=!1,k(e,"disappear").call(e,t),n){const n=C("disappear",e,i),s=T(n,null,{controller:e,entry:t});r.dispatchEvent(s)}})(s)},t),a=()=>{o.observe(r)},l=()=>{o.unobserve(r)};return Object.assign(e,{isVisible:!1,disconnect(){l(),s()}}),a(),[a,l]},L={events:["click","touchend"],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},A={debug:!1,logger:console};class D{constructor(e,t={}){var n,i,r;this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset"),this.logger.log(Object.assign({controllerId:this.controllerId},t)),this.logger.groupEnd())},this.debug=null!==(i=null!==(n=null==t?void 0:t.debug)&&void 0!==n?n:e.application.stimulusUseDebug)&&void 0!==i?i:A.debug,this.logger=null!==(r=null==t?void 0:t.logger)&&void 0!==r?r:A.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}class I extends D{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter),this.targetElement.addEventListener("mouseleave",this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter),this.targetElement.removeEventListener("mouseleave",this.onLeave)},this.onEnter=()=>{k(this.controller,"mouseEnter").call(this.controller),this.log("mouseEnter",{hover:!0})},this.onLeave=()=>{k(this.controller,"mouseLeave").call(this.controller),this.log("mouseLeave",{hover:!1})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}class x extends D{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{k(this.controller,"mutate").call(this.controller,e),this.log("mutate",{entries:e})},this.targetElement=(null==t?void 0:t.element)||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);Object.assign(this.controller,{disconnect:()=>{this.unobserve(),e()}})}}const M=(e,t={})=>{const n=new x(e,t);return[n.observe,n.unobserve]},N=e=>{const t=t=>{const{innerWidth:n,innerHeight:i}=window,r={height:i||Infinity,width:n||Infinity,event:t};k(e,"windowResize").call(e,r)},n=e.disconnect.bind(e),i=()=>{window.addEventListener("resize",t),t()},r=()=>{window.removeEventListener("resize",t)};return Object.assign(e,{disconnect(){r(),n()}}),i(),[i,r]},O=(e,t=200)=>{let n=null;return function(){const i=arguments,r=this,s=()=>e.apply(r,i);n&&clearTimeout(n),n=setTimeout(s,t)}};var H=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._handler=this._handler.bind(this)},n.connect=function(){var e=this;N(this),requestAnimationFrame(function(){e._handler();var t=e.el;t.style.resize="none",t.style.boxSizing="border-box",t.addEventListener("input",e._handler),t.addEventListener("focus",e._handler)})},n.disconnect=function(){this.el.removeEventListener("input",this._handler),this.el.removeEventListener("focus",this._handler)},n.windowResize=function(){this._handler()},n._handler=function(){this.autosize(this.el)},n.autosize=function(e){var t=e.offsetHeight-e.clientHeight;e.style.height="auto",e.style.height=e.scrollHeight+t+"px"},t}(b),z=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._updateCharCount=this._updateCharCount.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.inputTarget.addEventListener("input",e._updateCharCount),e._updateCharCount()})},n.disconnect=function(){this.inputTarget.removeEventListener("input",this._updateCharCount)},n._updateCharCount=function(){var e=this.inputTarget.value.length;this.outputTarget.innerText=e.toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);z.targets=["input","output"],z.values={min:Number,max:Number},z.classes=["error"];var F=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this._toggle=this._toggle.bind(this),this._refresh=this._refresh.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e.hasSelectAllTarget&&(e.selectAllTarget.addEventListener("change",e._toggle),e.checkboxTargets.forEach(function(t){return t.addEventListener("change",e._refresh)}),e._refresh())})},n.disconnect=function(){var e=this;this.hasSelectAllTarget&&(this.selectAllTarget.removeEventListener("change",this._toggle),this.checkboxTargets.forEach(function(t){return t.removeEventListener("change",e._refresh)}))},n._toggle=function(e){e.preventDefault();var t=e.target;this.checkboxTargets.forEach(function(e){return e.checked=t.checked})},n._refresh=function(){var e=this.checkboxTargets.length,t=this._checked.length;this.selectAllTarget.checked=t>0,this.selectAllTarget.indeterminate=t>0&&t0&&(j(r)&&"checkbox"==r.type?n[this._formIdentifier][r.name]=r.checked:j(r)&&"radio"==r.type?r.checked&&(n[this._formIdentifier][r.name]=r.value):n[this._formIdentifier][r.name]=r.value)}return n}},{key:"_restoreOnLoad",get:function(){return!this.hasRestoreOnLoadValue||this.restoreOnLoadValue}},{key:"_clearOnSubmit",get:function(){return!this.hasClearOnSubmitValue||this.clearOnSubmitValue}}]),t}(b);se.values={id:String,restoreOnLoad:Boolean,clearOnSubmit:Boolean};var oe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){S(this,{threshold:this._threshold,element:this.el})},n.appear=function(e){this.dispatch(this.el,"intersection:appear",{detail:{element:this.el}})},n.disappear=function(e){this.dispatch(this.el,"intersection:disappear",{detail:{element:this.el}})},d(t,[{key:"_threshold",get:function(){return this.hasThresholdValue?this.thresholdValue.split(",").map(function(e){return Number.parseFloat(e.trim())}).filter(function(e){return e>=0&&e<=1}):[0,1]}}]),t}(b);oe.values={threshold:String};var ae,le=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){if("IntersectionObserver"in window){var e=S(this,{element:this.el,threshold:.3});this.observe=e[0],this.unobserve=e[1]}else this.loadContent()},n.appear=function(e){e.target===this.el&&e.isIntersecting&&(this.loadContent(),this.unobserve&&this.unobserve())},t}(E),ce=function(e,t){var n=void 0===t?{}:t,i=n.behavior,r=void 0===i?"smooth":i,s=n.block,o=void 0===s?"start":s,a=n.inline,l=void 0===a?"nearest":a;try{var c=function(){e.scrollIntoView({behavior:r,block:o,inline:l})},u=function(){if("smooth"==r&&!ue)return Promise.resolve(function(){try{return Promise.resolve(import("smoothscroll-polyfill")).then(function(e){ae||(ae=!0,(0,e.polyfill)())})}catch(e){return Promise.reject(e)}}()).then(function(){})}();return Promise.resolve(u&&u.then?u.then(c):c())}catch(e){return Promise.reject(e)}},ue="scrollBehavior"in document.documentElement.style;function he(e){if(!e)return null;var t=getComputedStyle(e).overflowY;return"visible"!==t&&"hidden"!==t&&e.scrollHeight>=e.clientHeight?e:he(e.parentElement)||document.body}var de=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._dialog=null,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.open=this.open.bind(this),this.close=this.close.bind(this)},n.connect=function(){},n.open=function(){var e=this,t=this.el;if(!this._dialog){this._dialog=document.createElement("dialog");var n=document.createElement("img");n.className=this._imageClassName,n.src=this._src,n.srcset=this._srcSet,n.sizes=this._sizes,this._dialog.appendChild(n),t.insertAdjacentElement("afterend",this._dialog),c.default.registerDialog(this._dialog),this._dialog.className=this._modalClassName,this._dialog.showModal(),ce(this._dialog,{behavior:"smooth",block:"end"}).catch(function(){return e._dialog.scrollIntoView(!1)}),this._dialog.addEventListener("click",this.close),this._dialog.addEventListener("cancel",this.close),this._dialog.addEventListener("close",this.close)}},n.close=function(){var e=this;this._dialog&&(this._dialog.close(),this._dialog.remove(),this._dialog=null,ce(this.el,{behavior:"smooth",block:"end"}).catch(function(){return e.el.scrollIntoView(!1)}))},d(t,[{key:"_src",get:function(){return this.hasSrcValue?this.srcValue:this.el.src}},{key:"_srcSet",get:function(){return this.hasSrcSetValue?this.srcSetValue:this.el.srcset}},{key:"_sizes",get:function(){return this.hasSizesValue?this.sizesValue:this.el.sizes}},{key:"_modalClassName",get:function(){return this.hasModalClass?this.modalClass:"image-lightbox-dialog"}},{key:"_imageClassName",get:function(){return this.hasImageClass?this.imageClass:"image-lightbox-image"}}]),t}(b);de.values={src:String,srcSet:String,sizes:String},de.classes=["modal","image"];var fe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.handleInputs=this.handleInputs.bind(this)},n.connect=function(){var e=this;this.inputTargets.forEach(function(t){return t.addEventListener("change",e.handleInputs)})},n.disconnect=function(){var e=this;this.inputTargets.forEach(function(t){return t.removeEventListener("change",e.handleInputs)})},n.handleInputs=function(e){var t=this.inputTargets.reduce(function(e,t){return t.checked?e+1:e},0),n=e.target;t>this.maxValue?(e.preventDefault(),n.checked=!1,this.dispatch(n,"change"),this.dispatch(n,"limited-selection:too-many"),this.hasErrorTarget&&(this.errorTarget.innerHTML=this.messageValue)):(this.dispatch(n,"limited-selection:selection"),this.hasErrorTarget&&(this.errorTarget.innerHTML=""))},t}(b);fe.targets=["input","error"],fe.values={max:Number,message:String};var me=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){},n.connect=function(){},n.disconnect=function(){},n.play=function(e){try{return null==e||e.preventDefault(),Promise.resolve(this.mediaTarget.play()).then(function(){})}catch(e){return Promise.reject(e)}},n.pause=function(e){null==e||e.preventDefault(),this.mediaTarget.pause()},n.restart=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime=0},n.seek=function(e){null==e||e.preventDefault(),this.mediaTarget.currentTime+=5},t}(b);me.targets=["media"];var pe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){this._checkStructure()},n.add=function(e){null==e||e.preventDefault();var t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,this._generateID());this.targetTarget.insertAdjacentHTML(this._insertMode,t)},n.remove=function(e){e.preventDefault();var t=e.target.closest("."+this._wrapperClass);if(null==t)throw new Error("#remove was clicked from outside of a child record. Could not find an ancestor with class ."+this._wrapperClass);if("true"===t.dataset.newRecord)t.remove();else{t.style.display="none";var n=t.querySelector("input[name*='_destroy']");if(null==n)throw new Error("Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.");n.value="1"}},n._generateID=function(){return(new Date).getTime().toString()+Math.random().toString().slice(2)},n._checkStructure=function(){if(this.templateTarget.innerHTML.indexOf("NEW_RECORD"))throw new Error("Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`")},d(t,[{key:"_wrapperClass",get:function(){return this.hasWrapperSelectorValue?this.wrapperClassValue:"nested-fields"}},{key:"_insertMode",get:function(){return this.hasInsertModeValue?this.insertModeValue:"beforeend"}}]),t}(b);pe.targets=["target","template"],pe.values={insertMode:String,wrapperClass:String};var ve=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.checkPasswordsMatch=this.checkPasswordsMatch.bind(this)},n.connect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.addEventListener("change",e.checkPasswordsMatch)})},n.disconnect=function(){var e=this;this.passwordTargets.forEach(function(t){return t.removeEventListener("change",e.checkPasswordsMatch)})},n._allPasswordsMatch=function(){var e=new Set(this.passwordTargets.map(function(e){return e.value}));return e.has("")||1==e.size},n.checkPasswordsMatch=function(){var e=this,t=this.el;this._allPasswordsMatch()?(this.dispatch(t,"password-confirm:match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.remove(e.errorClass)})):(this.dispatch(t,"password-confirm:no-match"),this.hasErrorClass&&this.passwordTargets.forEach(function(t){return t.classList.add(e.errorClass)}))},t}(b);ve.targets=["password"],ve.classes=["error"];var ge=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.peak=function(e){null==e||e.preventDefault(),this.passwordTarget.type="text"},n.hide=function(e){null==e||e.preventDefault(),this.passwordTarget.type="password"},n.toggle=function(e){null==e||e.preventDefault(),"password"===this.passwordTarget.type?this.peak():this.hide()},t}(b);ge.targets=["password"];var be=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.replace=function(e){var t=e.detail[0];if(t instanceof Node){var n=t.querySelector(this._selector);if(null==n)throw new Error('expected new form DOM with [data-controller="'+this.identifier+'"] to be present in returned payload');var i=this.el.parentNode;if(null==i)throw new Error("expected form to have a DOM parent, could not execute replaceChild");i.replaceChild(n,this.el)}else console.log("Unknown",t)},d(t,[{key:"_selector",get:function(){return this.hasSelectorValue?this.selectorValue:'[data-controller~="'+this.identifier+'"]'}}]),t}(b);be.targets=[],be.values={selector:String};var ye=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.messageReceived=this.messageReceived.bind(this)},n.connect=function(){window.addEventListener("message",this.messageReceived)},n.disconnect=function(){window.removeEventListener("message",this.messageReceived)},n.messageReceived=function(e){var t=e.data;t.hasOwnProperty("name")&&"iframe-body"===t.name&&t.hasOwnProperty("height")&&this.resize(t.height)},n.resize=function(e){this.el.style.height=e+"px"},t}(b),_e=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e,t,n;window.self!==window.top&&(N(this),t={},null===(n=(e=this).constructor.debounces)||void 0===n||n.forEach(n=>{if("string"==typeof n&&(e[n]=O(e[n],null==t?void 0:t.wait)),"object"==typeof n){const{name:i,wait:r}=n;if(!i)return;e[i]=O(e[i],r||(null==t?void 0:t.wait))}}),this.postUpdate())},n.windowResize=function(e){this.postUpdate()},n.postUpdate=function(){var e={name:"iframe-body",height:this.getHeight()};window.parent.postMessage(e,"*")},n.getHeight=function(){var e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},t}(b);_e.debounces=["postUpdate"];var Ee=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n._cleanupSelf=function(){this.cleanup(this.el)},n.cleanup=function(e){var t,n,i,r=this;e.dataset.controller=(null==(t=e.dataset.controller)?void 0:t.replaceAll(new RegExp("(s|^)"+this.identifier+"(s|$)","g"),""))||"",""==e.dataset.controller&&delete e.dataset.controller;var s=new RegExp("(s|^)"+this.identifier+"\\..+?(s|$)","g");e.dataset.target=(null==(n=e.dataset.target)?void 0:n.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-target")],""==e.dataset.target&&delete e.dataset.target,e.dataset.action=(null==(i=e.dataset.target)?void 0:i.replaceAll(s,""))||"",delete e.dataset[u.default(this.identifier+"-action")],""==e.dataset.action&&delete e.dataset.action;var o=this.constructor.values;o&&Object.keys(o).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-value")]});var a=this.constructor.classes;a&&Object.keys(a).forEach(function(t){return delete e.dataset[u.default(r.identifier+"-"+t+"-class")]})},t}(b),we=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.connect=function(){var e=this;requestAnimationFrame(function(){ce(e.el,{behavior:e.hasBehaviorValue?e.behaviorValue:"smooth",block:e.hasBlockValue?e.blockValue:"center",inline:e.hasInlineValue?e.inlineValue:"center"}).catch(function(){return e.el.scrollIntoView()}),e._cleanupSelf()})},t}(Ee);we.values={behavior:String,block:String,inline:String};var ke=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"end"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);ke.values={mode:String};var Ce=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(){var e=document.querySelector(this.selectorValue);e?ce(e,{behavior:this.hasBehaviorValue?this.behaviorValue:"smooth",block:this.hasBlockValue?this.blockValue:"center",inline:this.hasInlineValue?this.inlineValue:"center"}).catch(function(){return e.scrollIntoView()}):console.warn("Could not find target for '"+this.selectorValue+"'")},t}(b);Ce.values={selector:String,behavior:String,block:String,inline:String};var Te=function(e){function t(){return e.apply(this,arguments)||this}return m(t,e),t.prototype.scroll=function(e){var t;null==e||e.preventDefault(),null!=(t="document"==(this.hasModeValue?this.modeValue:"document")?document.body:he(this.el))&&ce(t,{behavior:"smooth",block:"start"}).catch(function(){return t.scrollIntoView(!1)})},t}(b);Te.values={mode:String};var Ve=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeout=null,t}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeout=setTimeout(function(){return e.el.remove()},1e3*e.secondsValue)})},n.disconnect=function(){this._timeout&&clearTimeout(this._timeout)},t}(b);Ve.values={seconds:Number};var Se=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._magicElement=null,t}m(t,e);var n=t.prototype;return n.createMagicElement=function(){if(null===this._magicElement)switch(this._magicElement=document.createElement("div"),this._mode){case"top":this.el.insertAdjacentElement("beforebegin",this._magicElement);break;case"bottom":this.el.insertAdjacentElement("afterend",this._magicElement)}},n.connect=function(){var e=this,t=this.el;this.createMagicElement(),new IntersectionObserver(function(n){n.forEach(function(n){n.target===e._magicElement&&(0===n.intersectionRatio?t.classList.add(e.hasStuckClass?e.stuckClass:"stuck"):1===n.intersectionRatio&&t.classList.remove(e.hasStuckClass?e.stuckClass:"stuck"))})},{threshold:[0,1]}).observe(this._magicElement)},d(t,[{key:"_mode",get:function(){return this.hasModeValue?this.modeValue:"top"}}]),t}(b);Se.classes=["stuck"],Se.values={mode:String};var Le=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._lastIndex=null,t._reverse=!1,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.sort=this.sort.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._tableHeaders.forEach(function(t){return t.addEventListener("click",e.sort)}),e.hasStartSortValue&&e._sortByColumn(e.startSortValue)})},n.disconnect=function(){var e=this;this._tableHeaders.forEach(function(t){return t.removeEventListener("click",e.sort)})},n.sort=function(e){e.preventDefault();var t=this._indexOfHeaderCell(e.target);this._sortByColumn(t)},n._indexOfHeaderCell=function(e){return this._tableHeaders.indexOf(e)},n._sortByColumn=function(e){var t=this;this._reverse=e===this._lastIndex&&!this._reverse;var n=document.createDocumentFragment();this._tableRows.sort(function(n,i){var r,s,o=Array.from(n.cells),a=Array.from(i.cells),l=(null==(r=o[e])?void 0:r.innerText)||"",c=(null==(s=a[e])?void 0:s.innerText)||"",u=l.localeCompare(c,"en",{sensitivity:"base",numeric:!0,caseFirst:"upper"});return n.dataset.sortTop||i.dataset.sortBottom?n.dataset.sortTop&&i.dataset.sortTop?u:-1:n.dataset.sortBottom||i.dataset.sortTop?n.dataset.sortBottom&&i.dataset.sortBottom?u:1:t._reverse?u>0?-1:1:u}).forEach(function(e){return n.appendChild(e)}),this._tableBody.innerHTML="",this._tableBody.appendChild(n),this._lastIndex=e},d(t,[{key:"_tableHead",get:function(){var e=this.el.tHead;if(null==e)throw new Error("Expected table to have a element.");return e}},{key:"_tableHeaders",get:function(){var e=this._tableHead.rows;if(0==e.length)throw new Error("Expected table to have a element with at least one row.");return Array.from(e[0].cells)}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}}]),t}(b);Le.values={startSort:Number};var Ae=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.truncate=this.truncate.bind(this),this.expand=this.expand.bind(this)},n.connect=function(){var e=this;M(this,{childList:!0,element:this._tableBody}),requestAnimationFrame(function(){e.truncate(),e.showMoreTarget.addEventListener("click",e.expand)})},n.truncate=function(e){var t=this;null==e||e.preventDefault(),this._truncated=!0,this._tableRows.length>=this._limit?(this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._hideElement(e)}),this._showElement(this.showMoreTarget)):this._hideElement(this.showMoreTarget)},n.expand=function(e){var t=this;this._truncated=!1,null==e||e.preventDefault(),this._tableRows.slice(this._limit).forEach(function(e){e!==t.showMoreTarget&&t._showElement(e)}),this._hideElement(this.showMoreTarget)},n.mutate=function(e){this._truncated&&this._reTruncate()},n._showElement=function(e){e.style.display=""},n._hideElement=function(e){e.style.display="none"},n._reTruncate=function(){var e=this;this._tableRows.slice(0,this._limit).forEach(function(t){t!==e.showMoreTarget&&e._showElement(t)}),this._tableRows.slice(this._limit).forEach(function(t){t!==e.showMoreTarget&&e._hideElement(t)}),this._showElement(this.showMoreTarget)},d(t,[{key:"_truncated",get:function(){return!!this.hasTruncatedValue&&this.truncatedValue},set:function(e){this.truncatedValue=e}},{key:"_tableBody",get:function(){return this.el.tBodies[0]}},{key:"_tableRows",get:function(){return Array.from(this._tableBody.rows)}},{key:"_limit",get:function(){return this.hasLimitValue?this.limitValue:20}}]),t}(b);Ae.targets=["showMore"],Ae.values={limit:Number,truncated:Boolean};var De=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasInsertValue)throw new Error("`insert` value was not specified");requestAnimationFrame(function(){e.hasImmediateValue&&e.immediateValue&&e.execute()})},n.execute=function(e){null==e||e.preventDefault();var t=this.el,n=document.querySelector(this.targetValue);if(null!=n){var i=t.cloneNode(!0);switch(this.cleanup(i),this.insertValue){case"beforebegin":case"beforeend":case"afterend":case"afterbegin":n.insertAdjacentHTML(this.insertValue,i.outerHTML);break;case"replaceOuter":n.outerHTML=i.outerHTML;break;case"replaceInner":n.innerHTML=i.outerHTML;break;case"prepend":n.insertAdjacentHTML("afterbegin",i.outerHTML);break;case"append":n.insertAdjacentHTML("beforeend",i.outerHTML);break;default:throw new Error("`insert` value was not specified")}t.remove()}else this.dispatch(t,"teleport:error")},t}(Ee);De.values={target:String,insert:String,immediate:Boolean};var Ie=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}m(t,e);var n=t.prototype;return n.initialize=function(){this._timeout=this._timeout.bind(this)},n.connect=function(){var e=this;requestAnimationFrame(function(){e._timeoutHandle=window.setTimeout(e._timeout,1e3*e.secondsValue)})},n.disconnect=function(){this._timeoutHandle&&window.clearTimeout(this._timeoutHandle)},n._timeout=function(){this.dispatch(this.el,"timeout")},t}(b);Ie.values={seconds:Number};var xe=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.connect=function(){var e=this;if(!this.hasClassValue)throw new Error("data-toggle-class-class-value must not be empty");(this.hasMouseEnterValue||this.hasMouseLeaveValue)&&((e,t={})=>{new I(this,t)})(),this.hasClickAwayValue&&this.clickAwayValue&&((e,t={})=>{const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:s}=Object.assign({},L,t),o=r=>{const o=(null==t?void 0:t.element)||e.element;if(!(o.contains(r.target)||!function(e){const t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return t.top<=n&&t.top+t.height>=0&&t.left<=i&&t.left+t.width>=0}(o)&&n)&&(e.clickOutside&&e.clickOutside(r),i)){const t=C("click:outside",e,s),n=T(t,r,{controller:e});o.dispatchEvent(n)}},a=e.disconnect.bind(e);Object.assign(e,{disconnect(){null==r||r.forEach(e=>{window.removeEventListener(e,o,!1)}),a()}}),null==r||r.forEach(e=>{window.addEventListener(e,o,!1)})})(this),requestAnimationFrame(function(){e.hasInitialValue&&e.toggleTargets.forEach("on"===e.initialValue?function(t){return e._elementOn(t)}:function(t){return e._elementOff(t)})})},n.clickOutside=function(){var e=this;this.toggleTargets.forEach(function(t){e._elementWasToggled(t)&&(e._elementToggleStatus(t),e._elementToggle(t))})},n.mouseEnter=function(){if(this.hasMouseEnterValue)switch(this.mouseEnterValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.mouseLeave=function(){if(this.hasMouseLeaveValue)switch(this.mouseLeaveValue){case"on":this.on();break;case"off":this.off();break;case"toggle":this.toggle()}return{}},n.on=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOn(e)})},n.off=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementOff(e)})},n.toggle=function(e){var t=this;this.toggleTargets.forEach(function(e){t._elementToggleStatus(e),t._elementToggle(e)})},n._elementWasToggled=function(e){return"true"==e.dataset.toggled},n._elementToggleStatus=function(e){this._elementWasToggled(e)?delete e.dataset.toggled:e.dataset.toggled="true"},n._elementToggle=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t)})},n._elementOn=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!0)})},n._elementOff=function(e){this.classValue.split(" ").forEach(function(t){return e.classList.toggle(t,!1)})},t}(b);function Me(e){return"TURBO-FRAME"==e.nodeName}xe.targets=["toggle"],xe.values={class:String,mouseEnter:String,mouseLeave:String,clickAway:Boolean,initial:String};var Ne=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.toggle=function(e){null==e||e.preventDefault();var t=this._getFrame().src;null==t||t!==this._getSrc()?this._setSrc():this._clear()},n.setSrc=function(e){null==e||e.preventDefault(),this._setSrc()},n.clear=function(e){null==e||e.preventDefault(),this._clear()},n._setSrc=function(){var e=this._getFrame();this.hasLoadingMessageValue&&(e.innerHTML=this.loadingMessageValue),e.src=this._getSrc()},n._clear=function(){var e=this._getFrame();e.src="",e.innerHTML=""},n._getFrame=function(){var e=document.getElementById(""+this.frameIdValue);if(null==e)throw new Error("Could not find frame with ID '"+this.frameIdValue+"'");if(Me(e))return e;throw new Error("Element targeted by ID '"+this.frameIdValue+"'")},n._getSrc=function(){var e=this.el;if(this.hasSrcValue)return this.srcValue;if(B(e))return e.href;throw new Error("No link given to drive frame to")},t}(b);Ne.values={frameId:String,src:String,loadingMessage:String};var Oe=function(e){function t(){var t;return(t=e.apply(this,arguments)||this)._timeoutHandle=null,t}m(t,e);var n=t.prototype;return n.initialize=function(){this.refresh=this.refresh.bind(this)},n.connect=function(){var e=this,t=this.el;if(!Me(t))throw new Error("Expected controller to be mounted on a element.");if(t.src)throw new Error("The provided element has no `src` attribute.");this._poll&&requestAnimationFrame(function(){return e._timeoutHandle=setTimeout(function(){return e.refresh()},e.intervalValue)})},n.disconnect=function(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)},n.refresh=function(e){null==e||e.preventDefault();var t=this.el;t.src=t.src},d(t,[{key:"_poll",get:function(){return!!this.hasPollValue&&this.pollValue}}]),t}(b);Oe.values={interval:Number,poll:Boolean};var He=function(e){function t(){return e.apply(this,arguments)||this}m(t,e);var n=t.prototype;return n.initialize=function(){this.updateWordCount=this.updateWordCount.bind(this)},n.connect=function(){this.updateWordCount(),this.inputTarget.addEventListener("input",this.updateWordCount)},n.disconnect=function(){this.inputTarget.removeEventListener("input",this.updateWordCount)},n.updateWordCount=function(){var e=0,t=this.inputTarget.value.match(/\S+/g);this.outputTarget.innerText=(e=t&&t.length||0).toString(),this.hasErrorClass&&(this._isValidCount(e)?this.outputTarget.classList.remove(this.errorClass):this.outputTarget.classList.add(this.errorClass))},n._isValidCount=function(e){var t=0,n=99999;return this.hasMinValue&&(t=this.minValue),this.hasMaxValue&&(n=this.maxValue),e>=t&&e<=n},t}(b);He.targets=["input","output"],He.values={min:Number,max:Number},He.classes=["error"],e.AnchorSpyController=y,e.AppearanceController=_,e.AsyncBlockController=E,e.AutoSubmitFormController=w,e.AutosizeController=H,e.CharCountController=z,e.CheckboxSelectAllController=F,e.ClipboardController=R,e.ConfirmController=U,e.ConfirmNavigationController=J,e.DebugController=Y,e.DetectDirtyController=G,e.DetectDirtyFormController=K,e.DisableInputsController=Q,e.DisableWithController=X,e.DismissableController=Z,e.ElementSaveController=ee,e.EmptyDomController=te,e.EnableInputsController=ne,e.FallbackImageController=ie,e.FormRcController=re,e.FormSaveController=se,e.IntersectionController=oe,e.LazyBlockController=le,e.LightboxImageController=de,e.LimitedSelectionCheckboxesController=fe,e.MediaPlayerController=me,e.NestedFormController=pe,e.PasswordConfirmController=ve,e.PasswordPeekController=ge,e.RemoteFormController=be,e.ResponsiveIframeBodyController=_e,e.ResponsiveIframeWrapperController=ye,e.ScrollIntoFocusController=we,e.ScrollToBottomController=ke,e.ScrollToController=Ce,e.ScrollToTopController=Te,e.SelfDestructController=Ve,e.StickyController=Se,e.TableSortController=Le,e.TableTruncateController=Ae,e.TeleportController=De,e.TimeoutController=Ie,e.ToggleClassController=xe,e.TurboFrameRCController=Ne,e.TurboFrameRefreshController=Oe,e.WordCountController=He}); //# sourceMappingURL=stimulus-library.umd.js.map diff --git a/dist/stimulus-library.umd.js.map b/dist/stimulus-library.umd.js.map index 78050eda..4dfe2c57 100644 --- a/dist/stimulus-library.umd.js.map +++ b/dist/stimulus-library.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"stimulus-library.umd.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/utilities/scroll.ts","../src/controllers/lazy_block_controller.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","smoothPolyfilled","LazyBlockController","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","import","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"stimulus-library.umd.js","sources":["../src/utilities/base_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/utility/appearance_controller.ts","../src/controllers/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus_use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/utilities/elements.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/disable_inputs_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/utilities/scroll.ts","../src/controllers/lazy_block_controller.ts","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/utilities/ephemeral_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/toggle_class_controller.ts","../src/utilities/turbo.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/word_count_controller.ts"],"sourcesContent":["import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class AnchorSpyController extends BaseController {\r\n static values = {key: String};\r\n\r\n declare readonly keyValue: string;\r\n\r\n get _key(): string {\r\n return this.keyValue.replaceAll('#', '');\r\n }\r\n\r\n get _anchor(): string {\r\n return window.location.hash.substr(1);\r\n }\r\n\r\n set _anchor(value: string) {\r\n window.location.hash = value;\r\n }\r\n\r\n initialize() {\r\n this._checkAnchor = this._checkAnchor.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._checkAnchor();\r\n window.addEventListener(\"hashchange\", this._checkAnchor);\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"hashchange\", this._checkAnchor);\r\n }\r\n\r\n write(event?: Event) {\r\n event?.preventDefault();\r\n this._anchor = this._key;\r\n }\r\n\r\n private _checkAnchor() {\r\n if (this._key === this._anchor) {\r\n this.dispatch(this.el, \"anchor-spy:active\");\r\n } else {\r\n this.dispatch(this.el, \"anchor-spy:inactive\");\r\n }\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class AppearanceController extends BaseController {\r\n\r\n initialize() {\r\n this._handleVisibility = this._handleVisibility.bind(this);\r\n }\r\n\r\n connect() {\r\n window.addEventListener(\"focus\", this._handleVisibility);\r\n window.addEventListener(\"blur\", this._handleVisibility);\r\n document.addEventListener(\"visibilitychange\", this._handleVisibility);\r\n requestAnimationFrame(() => {\r\n this._handleVisibility();\r\n });\r\n }\r\n\r\n disconnect() {\r\n window.removeEventListener(\"focus\", this._handleVisibility);\r\n window.removeEventListener(\"blur\", this._handleVisibility);\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibility);\r\n }\r\n\r\n appear() {\r\n this.dispatch(this.el, \"appearance:appear\");\r\n }\r\n\r\n away() {\r\n this.dispatch(this.el, \"appearance:away\");\r\n }\r\n\r\n private _handleVisibility() {\r\n this._documentIsActive() ? this.appear() : this.away();\r\n }\r\n\r\n private _documentIsActive() {\r\n return document.visibilityState == \"visible\" && document.hasFocus();\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class AsyncBlockController extends BaseController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n connect() {\n this.loadContent();\n }\n\n loadContent() {\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n fetch(this.endpointValue)\n .then((response) => response.text())\n .then((html) => {\n let newEl = document.createElement(\"div\");\n newEl.innerHTML = html;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n })\n .catch(err => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n })\n .finally(() => {\n self.dispatch(el, \"ajax:complete\");\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n initialize() {\n this.submit = this.submit.bind(this);\n }\n\n connect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.addEventListener(\"change\", this.submit));\n }\n\n disconnect() {\n this.el.querySelectorAll(\"input, select, textarea\").forEach(el => el.removeEventListener(\"change\", this.submit));\n }\n\n private submit() {\n // Trigger synthetic \"submit\" event on form\n this.dispatch((this.el), \"submit\");\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail,\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n return (vertInView && horInView);\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true,\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log(Object.assign({ controllerId: this.controllerId }, args));\n this.logger.groupEnd();\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus_use.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = () => {\n method(this.controller, 'mouseEnter').call(this.controller);\n this.log('mouseEnter', { hover: true });\n };\n this.onLeave = () => {\n method(this.controller, 'mouseLeave').call(this.controller);\n this.log('mouseLeave', { hover: false });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus_use';\nimport { method } from '../support/index';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, \"At a minimum, one of childList, attributes, and/or characterData must be true\", {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n method(this.controller, 'mutate').call(this.controller, entries);\n this.log('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n },\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === \"string\") {\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === \"object\") {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {useWindowResize} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class AutosizeController extends BaseController {\n\n initialize() {\n this._handler = this._handler.bind(this);\n }\n\n connect() {\n useWindowResize(this);\n requestAnimationFrame(() => {\n this._handler();\n let target = this.el as HTMLTextAreaElement;\n target.style.resize = \"none\";\n target.style.boxSizing = \"border-box\";\n target.addEventListener(\"input\", this._handler);\n target.addEventListener(\"focus\", this._handler);\n });\n }\n\n disconnect() {\n this.el.removeEventListener(\"input\", this._handler);\n this.el.removeEventListener(\"focus\", this._handler);\n }\n\n windowResize() {\n this._handler();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n };\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CharCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this._updateCharCount = this._updateCharCount.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.inputTarget.addEventListener(\"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this._updateCharCount);\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n initialize() {\n this._toggle = this._toggle.bind(this);\n this._refresh = this._refresh.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.addEventListener('change', this._toggle);\n this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));\n this._refresh();\n });\n }\n\n disconnect() {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n this.selectAllTarget.removeEventListener('change', this._toggle);\n this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class ClipboardController extends BaseController {\r\n\r\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\r\n static values = {removeUnused: Boolean};\r\n\r\n declare readonly sourceTarget: HTMLElement;\r\n declare readonly copyTarget: HTMLElement;\r\n declare readonly hasCopyTarget: boolean;\r\n declare readonly fallbackTarget: HTMLElement;\r\n declare readonly hasFallbackTarget: boolean;\r\n\r\n declare readonly hasRemoveUnusedValue: boolean;\r\n declare readonly removeUnusedValue: boolean;\r\n\r\n _supported = false;\r\n\r\n connect() {\r\n this._supported = document.queryCommandSupported(\"copy\");\r\n\r\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\r\n if (this._supported && this.hasFallbackTarget) {\r\n this.fallbackTarget.remove();\r\n } else if (this.hasCopyTarget) {\r\n this.copyTarget.remove();\r\n }\r\n }\r\n }\r\n\r\n select(event: MouseEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n }\r\n\r\n copy(event: ClipboardEvent) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\r\n if (this._supported) {\r\n document.execCommand(\"copy\");\r\n }\r\n }\r\n}\r\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n initialize() {\n this.confirm = this.confirm.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.addEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.addEventListener(\"click\", this.confirm);\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n });\n }\n\n disconnect() {\n let element = this.el;\n if (isHTMLFormElement(element)) {\n element.removeEventListener(\"submit\", this.confirm);\n } else if (isHTMLAnchorElement(element)) {\n element.removeEventListener(\"click\", this.confirm);\n }\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {_message: String};\n\n declare readonly _messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this._messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n window.addEventListener(\"popstate\", this.confirmNavigation);\n window.addEventListener(\"submit\", this.allowSubmit);\n window.addEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.addEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n window.removeEventListener(\"submit\", this.allowSubmit);\n window.removeEventListener(\"turbolinks:before-visit\", this.confirmTurboNavigation);\n window.removeEventListener(\"turbo:before-visit\", this.confirmTurboNavigation);\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyController extends BaseController {\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._restoreElementFromLoadValue();\r\n }\r\n\r\n private _getElementValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(): boolean | string {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(): boolean {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkDirty() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (this._isElementDirty()) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(): boolean {\r\n return this._getElementValue() !== this._getElementLoadValue();\r\n }\r\n\r\n private _restoreElementFromLoadValue() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\r\n\r\nexport class DetectDirtyFormController extends BaseController {\r\n\r\n get _formElements(): Array {\r\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\r\n }\r\n\r\n get _cacheAttrName(): string {\r\n return 'detect-dirty-load-value';\r\n }\r\n\r\n initialize() {\r\n this._checkDirty = this._checkDirty.bind(this);\r\n }\r\n\r\n connect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n\r\n this._cacheLoadValues();\r\n this._checkDirty();\r\n element.addEventListener(\"input\", this._checkDirty);\r\n element.addEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n disconnect() {\r\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n element.removeEventListener(\"input\", this._checkDirty);\r\n element.removeEventListener(\"change\", this._checkDirty);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\r\n }\r\n\r\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n return isElementCheckable(element) ? element.checked : element.value;\r\n }\r\n\r\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\r\n let value = element.getAttribute(this._cacheAttrName);\r\n if (isElementCheckable(element)) {\r\n return value == null ? element.defaultChecked : value == \"true\";\r\n } else if (value !== null) {\r\n return value;\r\n }\r\n\r\n if (isHTMLSelectElement(element)) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return option.value;\r\n }\r\n });\r\n }\r\n\r\n return value!;\r\n }\r\n\r\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return element.hasAttribute(this._cacheAttrName);\r\n }\r\n\r\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (this._isElementDirty(element)) {\r\n element.setAttribute('data-dirty', \"true\");\r\n } else {\r\n element.removeAttribute('data-dirty');\r\n }\r\n }\r\n\r\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\r\n return this._getElementValue(element) !== this._getElementLoadValue(element);\r\n }\r\n\r\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n } else {\r\n element.setAttribute(this._cacheAttrName, element.value.toString());\r\n }\r\n }\r\n\r\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\r\n let cacheValue = element.getAttribute(this._cacheAttrName);\r\n\r\n if (isElementCheckable(element)) {\r\n element.setAttribute(this._cacheAttrName, element.checked.toString());\r\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\r\n } else if (isHTMLSelectElement(element)) {\r\n if (cacheValue == null) {\r\n let options = Array.from(element.options);\r\n options.forEach((option) => {\r\n if (option.defaultSelected) {\r\n element.value = option.value;\r\n return;\r\n }\r\n });\r\n } else {\r\n element.value = cacheValue;\r\n }\r\n\r\n } else {\r\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\r\n }\r\n }\r\n\r\n private _cacheLoadValues(): void {\r\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\r\n }\r\n\r\n private _checkDirty(): void {\r\n this._formElements.forEach(el => this._checkElementDirty(el));\r\n if (this._formElements.some(el => isDirty(el))) {\r\n this.el.setAttribute(\"data-dirty\", \"true\");\r\n } else {\r\n this.el.removeAttribute(\"data-dirty\");\r\n }\r\n }\r\n}\r\n\r\nexport function isDirty(element: HTMLElement) {\r\n return element.hasAttribute(\"data-dirty\");\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class DisableInputsController extends BaseController {\r\n\r\n static targets = [\"disabler\", \"disable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasDisablerTarget: boolean;\r\n declare readonly disablerTarget: HTMLInputElement;\r\n declare readonly disableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\r\n this.disableInputs();\r\n } else {\r\n this.enableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.disableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.disableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n _timeoutHandle?: ReturnType;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this.el.addEventListener(\"click\", this.disable);\n });\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable(element);\n setTimeout(this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable(element);\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable(el: HTMLElement) {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable(el: HTMLElement) {\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n","import {BaseController} from '../utilities/base_controller';\nimport _get from \"lodash-es/get\";\nimport _set from \"lodash-es/set\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare hasEmptyClass: boolean;\n declare emptyClass: string;\n declare hasNotEmptyClass: boolean;\n declare notEmptyClass: string;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get emptyClasses(): string[] {\n return this.emptyClass.split(\" \");\n }\n\n get notEmptyClasses(): string[] {\n return this.notEmptyClass.split(\" \");\n }\n\n get _children(): Element[] {\n let element = this.el;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this.el, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this.el;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _removeEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.remove(...this.emptyClasses);\n }\n }\n\n private _addNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.add(...this.notEmptyClasses);\n }\n }\n\n private _addEmptyClasses() {\n if (this.hasEmptyClass) {\n this.el.classList.add(...this.emptyClasses);\n }\n }\n\n private _removeNotEmptyClasses() {\n if (this.hasNotEmptyClass) {\n this.el.classList.remove(...this.notEmptyClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class EnableInputsController extends BaseController {\r\n\r\n static targets = [\"enabler\", \"enable\"];\r\n\r\n static values = {\r\n clear: Boolean,\r\n };\r\n\r\n declare readonly hasEnablerTarget: boolean;\r\n declare readonly enablerTarget: HTMLInputElement;\r\n declare readonly enableTargets: Array;\r\n declare readonly clearValue: boolean;\r\n declare readonly hasClearValue: boolean;\r\n\r\n connect() {\r\n this.toggle();\r\n }\r\n\r\n toggle() {\r\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\r\n this.enableInputs();\r\n } else {\r\n this.disableInputs();\r\n }\r\n }\r\n\r\n disableInputs() {\r\n let shouldClear = this.hasClearValue && this.clearValue;\r\n this.enableTargets.forEach((el, _) => {\r\n if (shouldClear) {\r\n el.value = \"\";\r\n }\r\n el.disabled = true;\r\n });\r\n }\r\n\r\n enableInputs() {\r\n this.enableTargets.forEach((el, _) => {\r\n el.disabled = false;\r\n });\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class FallbackImageController extends BaseController {\r\n\r\n static values = {placeholder: String};\r\n\r\n declare readonly placeholderValue: string;\r\n declare readonly hasPlaceholderValue: boolean;\r\n\r\n connect() {\r\n let element = this.el as HTMLImageElement;\r\n\r\n element.onerror = () => {\r\n if (this.hasPlaceholderValue) {\r\n element.src = this.placeholderValue;\r\n } else {\r\n element.style.display = \"none\";\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import {BaseController} from '../../utilities/base_controller';\r\n\r\nexport class FormRcController extends BaseController {\r\n\r\n static targets = [\"form\"];\r\n\r\n declare readonly formTarget: HTMLFormElement;\r\n\r\n submit(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"submit\");\r\n this.formTarget.submit();\r\n }\r\n\r\n reset(event?: Event) {\r\n event?.preventDefault();\r\n this.dispatch(this.formTarget, \"reset\");\r\n this.formTarget.reset();\r\n }\r\n\r\n}","import {BaseController} from '../../utilities/base_controller';\r\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\r\n\r\ninterface FormSavePayload {\r\n [idx: string]: {\r\n [idx: string]: string | boolean\r\n }\r\n}\r\n\r\nexport class FormSaveController extends BaseController {\r\n\r\n static values = {\r\n id: String,\r\n restoreOnLoad: Boolean,\r\n clearOnSubmit: Boolean,\r\n };\r\n\r\n declare readonly idValue: string;\r\n declare readonly hasIdValue: boolean;\r\n declare readonly restoreOnLoadValue: boolean;\r\n declare readonly hasRestoreOnLoadValue: boolean;\r\n declare readonly clearOnSubmitValue: boolean;\r\n declare readonly hasClearOnSubmitValue: boolean;\r\n\r\n get _formID() {\r\n if (this.hasIdValue) {\r\n return this.idValue;\r\n }\r\n let elementID = (this.el as HTMLFormElement).id;\r\n\r\n if (elementID !== \"\") {\r\n return elementID;\r\n } else {\r\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\r\n }\r\n }\r\n\r\n get _formIdentifier() {\r\n const url = location.href;\r\n return `${url} ${this._formID}`;\r\n }\r\n\r\n get _formElements() {\r\n return (this.el as HTMLFormElement).elements;\r\n }\r\n\r\n get _formData(): FormSavePayload {\r\n let data: FormSavePayload = {[this._formIdentifier]: {}};\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name.length > 0) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n data[this._formIdentifier][el.name] = el.checked;\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.checked) {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n } else {\r\n data[this._formIdentifier][el.name] = el.value;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n get _restoreOnLoad() {\r\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\r\n }\r\n\r\n get _clearOnSubmit() {\r\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\r\n }\r\n\r\n initialize() {\r\n this._clear = this._clear.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n let element = this.el;\r\n if (!isHTMLFormElement(element)) {\r\n throw new Error('Expected controller to be mounted on a form element.');\r\n }\r\n\r\n if (this._restoreOnLoad) {\r\n this.restore();\r\n }\r\n if (this._clearOnSubmit) {\r\n this.el.addEventListener('submit', this._clear);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._clearOnSubmit) {\r\n this.el.removeEventListener('submit', this._clear);\r\n }\r\n }\r\n\r\n _clear() {\r\n localStorage.removeItem(this._formIdentifier);\r\n this.dispatch(this.el, `form-save:cleared`);\r\n }\r\n\r\n clear(event?: Event) {\r\n event?.preventDefault();\r\n this._clear();\r\n }\r\n\r\n save(event: Event) {\r\n event.preventDefault();\r\n let data = this._formData;\r\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\r\n this.dispatch(this.el, `form-save:save:success`);\r\n }\r\n\r\n restore(event?: Event) {\r\n event?.preventDefault();\r\n if (localStorage.getItem(this._formIdentifier)) {\r\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\r\n for (const element of this._formElements) {\r\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (el.name in savedData) {\r\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\r\n el.checked = savedData[el.name];\r\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\r\n if (el.value == savedData[el.name]) {\r\n el.checked = true;\r\n }\r\n } else {\r\n el.value = savedData[el.name];\r\n }\r\n }\r\n }\r\n this.dispatch(this.el, `form-save:restore:success`);\r\n } else {\r\n this.dispatch(this.el, `form-save:restore:empty`);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"stimulus-use\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\r\nlet smoothPolyfilled: boolean;\r\n\r\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\r\n if (behavior == \"smooth\" && !smoothSupported) {\r\n await polyfillSmooth();\r\n }\r\n element.scrollIntoView({behavior, block, inline});\r\n}\r\n\r\nasync function polyfillSmooth() {\r\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\r\n if (smoothPolyfilled) {\r\n return;\r\n }\r\n smoothPolyfilled = true;\r\n polyfill();\r\n}\r\n\r\nexport function getScrollParent(node: HTMLElement | null): HTMLElement | null {\r\n if (!node) {\r\n return null;\r\n }\r\n const overflowY = getComputedStyle(node).overflowY;\r\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\r\n\r\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\r\n return node;\r\n }\r\n\r\n return getScrollParent(node.parentElement) || document.body;\r\n}\r\n","import {useIntersection} from \"stimulus-use\";\nimport {AsyncBlockController} from \"./async_block_controller\";\n\nexport class LazyBlockController extends AsyncBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n this.loadContent();\n }\n }\n\n appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\nimport dialogPolyfill from \"dialog-polyfill\";\r\n\r\nexport class LightboxImageController extends BaseController {\r\n\r\n static values = {\r\n src: String,\r\n srcSet: String,\r\n sizes: String,\r\n };\r\n static classes = [\"modal\", \"image\"];\r\n\r\n declare readonly hasModalClass: boolean;\r\n declare readonly modalClass: string;\r\n declare readonly hasImageClass: boolean;\r\n declare readonly imageClass: string;\r\n declare readonly hasSrcValue: boolean;\r\n declare readonly srcValue: string;\r\n declare readonly hasSrcSetValue: boolean;\r\n declare readonly srcSetValue: string;\r\n declare readonly hasSizesValue: boolean;\r\n declare readonly sizesValue: string;\r\n _dialog: HTMLDialogElement | null = null;\r\n\r\n get _src(): string {\r\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\r\n }\r\n\r\n get _srcSet(): string {\r\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\r\n }\r\n\r\n get _sizes(): string {\r\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\r\n }\r\n\r\n get _modalClassName() {\r\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\r\n }\r\n\r\n get _imageClassName() {\r\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\r\n }\r\n\r\n initialize() {\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n open() {\r\n let element = this.el as HTMLImageElement;\r\n if (this._dialog) {\r\n return;\r\n }\r\n this._dialog = document.createElement(\"dialog\");\r\n\r\n let image = document.createElement(\"img\") as HTMLImageElement;\r\n image.className = this._imageClassName;\r\n image.src = this._src;\r\n image.srcset = this._srcSet;\r\n image.sizes = this._sizes;\r\n this._dialog.appendChild(image);\r\n\r\n element.insertAdjacentElement(\"afterend\", this._dialog);\r\n dialogPolyfill.registerDialog(this._dialog);\r\n this._dialog.className = this._modalClassName;\r\n this._dialog.showModal();\r\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\r\n this._dialog.addEventListener(\"click\", this.close);\r\n this._dialog.addEventListener(\"cancel\", this.close);\r\n this._dialog.addEventListener(\"close\", this.close);\r\n }\r\n\r\n close() {\r\n if (this._dialog) {\r\n this._dialog.close();\r\n this._dialog.remove();\r\n this._dialog = null;\r\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\r\n }\r\n }\r\n\r\n} ","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n initialize() {\n this.handleInputs = this.handleInputs.bind(this);\n }\n\n connect() {\n this.inputTargets.forEach((el) => el.addEventListener(\"change\", this.handleInputs));\n }\n\n disconnect() {\n this.inputTargets.forEach((el) => el.removeEventListener(\"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class MediaPlayerController extends BaseController {\r\n\r\n static targets = [\"media\"];\r\n\r\n declare readonly mediaTarget: HTMLMediaElement;\r\n\r\n initialize() {\r\n }\r\n\r\n connect() {\r\n }\r\n\r\n disconnect() {\r\n }\r\n\r\n async play(event?: Event) {\r\n event?.preventDefault();\r\n await this.mediaTarget.play();\r\n }\r\n\r\n pause(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.pause();\r\n }\r\n\r\n restart(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime = 0;\r\n }\r\n\r\n seek(event?: Event) {\r\n event?.preventDefault();\r\n this.mediaTarget.currentTime += 5;\r\n }\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n initialize() {\n this.checkPasswordsMatch = this.checkPasswordsMatch.bind(this);\n }\n\n connect() {\n this.passwordTargets.forEach((el) => el.addEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n disconnect() {\n this.passwordTargets.forEach((el) => el.removeEventListener(\"change\", this.checkPasswordsMatch));\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.remove(this.errorClass));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => el.classList.add(this.errorClass));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class RemoteFormController extends BaseController {\r\n static targets = [];\r\n\r\n static values = {selector: String};\r\n\r\n declare readonly hasSelectorValue: boolean;\r\n declare readonly selectorValue: string;\r\n\r\n get _selector(): string {\r\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\r\n }\r\n\r\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\r\n const [data, status, xhr] = event.detail;\r\n if (data instanceof Node) {\r\n let new_element = data.querySelector(this._selector);\r\n\r\n if (new_element == null) {\r\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\r\n }\r\n\r\n let parentNode = this.el.parentNode;\r\n if (parentNode == null) {\r\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\r\n }\r\n parentNode.replaceChild(new_element, this.el);\r\n } else {\r\n console.log('Unknown', data);\r\n }\r\n }\r\n}\r\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n initialize() {\n this.messageReceived = this.messageReceived.bind(this);\n }\n\n connect() {\n window.addEventListener(\"message\", this.messageReceived);\n }\n\n disconnect() {\n window.removeEventListener(\"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import camelCase from \"camelcase\";\r\nimport {BaseController} from \"./base_controller\";\r\n\r\nexport class EphemeralController extends BaseController {\r\n\r\n _cleanupSelf() {\r\n this.cleanup(this.el);\r\n }\r\n\r\n cleanup(element: HTMLElement) {\r\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\r\n if (element.dataset.controller == \"\") {\r\n // If there are no controllers left, remove the attribute\r\n delete element.dataset.controller;\r\n }\r\n\r\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\r\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-target`)];\r\n if (element.dataset.target == \"\") {\r\n // If there are no targets left, remove the attribute\r\n delete element.dataset.target;\r\n }\r\n\r\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\r\n delete element.dataset[camelCase(`${this.identifier}-action`)];\r\n if (element.dataset.action == \"\") {\r\n // If there are no actions left, remove the attribute\r\n delete element.dataset.action;\r\n }\r\n\r\n // @ts-ignore\r\n let values = this.constructor.values;\r\n if (values) {\r\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\r\n }\r\n\r\n // @ts-ignore\r\n let classes = this.constructor.classes;\r\n if (classes) {\r\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\r\n }\r\n }\r\n\r\n}\r\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\r\nimport {scrollToElement} from \"../../utilities/scroll\";\r\n\r\nexport class ScrollIntoFocusController extends EphemeralController {\r\n\r\n static values = {\r\n behavior: String,\r\n block: String,\r\n inline: String,\r\n };\r\n\r\n declare behaviorValue: ScrollBehavior;\r\n declare hasBehaviorValue: boolean;\r\n declare blockValue: ScrollLogicalPosition;\r\n declare hasBlockValue: boolean;\r\n declare inlineValue: ScrollLogicalPosition;\r\n declare hasInlineValue: boolean;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Attempt smooth scrolling, with polyfill\r\n scrollToElement(\r\n this.el,\r\n {\r\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\r\n block: this.hasBlockValue ? this.blockValue : \"center\",\r\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\r\n },\r\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\r\n this._cleanupSelf();\r\n });\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"end\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n scroll(event?: Event) {\n event?.preventDefault();\n let mode = this.hasModeValue ? this.modeValue : \"document\";\n let target: null | HTMLElement;\n if (mode == \"document\") {\n target = document.body;\n } else {\n target = getScrollParent(this.el);\n }\n if (target == null) {\n return;\n }\n scrollToElement(target!, {behavior: \"smooth\", block: \"start\"}).catch(() => target!.scrollIntoView(false));\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class SelfDestructController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeout: null | ReturnType = null;\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n // Only start countdown on first paint\r\n this._timeout = setTimeout(() => this.el.remove(), this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeout) {\r\n clearTimeout(this._timeout);\r\n }\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\r\n\r\nexport class StickyController extends BaseController {\r\n\r\n static classes = [\"stuck\"];\r\n static values = {\r\n mode: String,\r\n };\r\n\r\n declare readonly hasStuckClass: boolean;\r\n declare readonly stuckClass: string;\r\n declare readonly hasModeValue: \"top\" | \"bottom\";\r\n declare readonly modeValue: \"top\" | \"bottom\";\r\n\r\n _magicElement: HTMLDivElement | null = null;\r\n\r\n get _mode(): \"top\" | \"bottom\" {\r\n return this.hasModeValue ? this.modeValue : \"top\";\r\n }\r\n\r\n createMagicElement() {\r\n // Magic element placed next to the sticky el that acts as an external border.\r\n // When the magic element is off the page, we know that the sticky el is \"stuck\"\r\n if (this._magicElement !== null) {\r\n return;\r\n }\r\n\r\n this._magicElement = document.createElement(\"div\");\r\n switch (this._mode) {\r\n case \"top\":\r\n this.el.insertAdjacentElement(\"beforebegin\", this._magicElement);\r\n break;\r\n case \"bottom\":\r\n this.el.insertAdjacentElement(\"afterend\", this._magicElement);\r\n break;\r\n }\r\n }\r\n\r\n connect() {\r\n let element = this.el;\r\n this.createMagicElement();\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== this._magicElement) {\r\n return;\r\n }\r\n if (entry.intersectionRatio === 0) {\r\n element.classList.add(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n } else if (entry.intersectionRatio === 1) {\r\n element.classList.remove(this.hasStuckClass ? this.stuckClass : \"stuck\");\r\n }\r\n });\r\n\r\n }, {\r\n threshold: [0, 1],\r\n });\r\n observer.observe(this._magicElement!);\r\n }\r\n\r\n}\r\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableSortController extends BaseController {\r\n\r\n static values = {startSort: Number};\r\n\r\n declare readonly startSortValue: number;\r\n declare readonly hasStartSortValue: boolean;\r\n _lastIndex: number | null = null;\r\n _reverse: boolean = false;\r\n\r\n get _tableHead(): HTMLTableSectionElement {\r\n let head = (this.el as HTMLTableElement).tHead;\r\n if (head == null) {\r\n throw new Error('Expected table to have a element.');\r\n }\r\n return head;\r\n }\r\n\r\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\r\n let rows = this._tableHead.rows;\r\n if (rows.length == 0) {\r\n throw new Error('Expected table to have a element with at least one row.');\r\n }\r\n return Array.from(rows[0].cells);\r\n }\r\n\r\n get _tableBody() {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n initialize() {\r\n this.sort = this.sort.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._tableHeaders.forEach(cell => cell.addEventListener(\"click\", this.sort));\r\n if (this.hasStartSortValue) {\r\n this._sortByColumn(this.startSortValue);\r\n }\r\n });\r\n }\r\n\r\n disconnect() {\r\n this._tableHeaders.forEach(cell => cell.removeEventListener(\"click\", this.sort));\r\n }\r\n\r\n sort(event: Event) {\r\n event.preventDefault();\r\n let headerCell = event.target! as HTMLTableHeaderCellElement;\r\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\r\n this._sortByColumn(headerCellIndex);\r\n }\r\n\r\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\r\n return this._tableHeaders.indexOf(cell);\r\n }\r\n\r\n private _sortByColumn(index: number) {\r\n this._reverse = index === this._lastIndex && !this._reverse;\r\n let frag = document.createDocumentFragment();\r\n let rows = this._tableRows;\r\n\r\n let newRows = rows.sort((row, otherRow) => {\r\n let cells = Array.from(row.cells);\r\n let otherCells = Array.from(otherRow.cells);\r\n\r\n // TODO: Handle colspans?\r\n let x = cells[index]?.innerText || \"\";\r\n let y = otherCells[index]?.innerText || \"\";\r\n\r\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\r\n\r\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\r\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\r\n return sortVal;\r\n }\r\n return -1;\r\n }\r\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\r\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\r\n return sortVal;\r\n }\r\n return 1;\r\n }\r\n\r\n if (this._reverse) {\r\n return sortVal > 0 ? -1 : 1;\r\n }\r\n return sortVal;\r\n });\r\n\r\n newRows.forEach(row => frag.appendChild(row));\r\n\r\n this._tableBody.innerHTML = \"\";\r\n this._tableBody.appendChild(frag);\r\n this._lastIndex = index;\r\n }\r\n\r\n}","import {useMutation} from \"stimulus-use\";\r\nimport {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TableTruncateController extends BaseController {\r\n\r\n static targets = [\"showMore\"];\r\n static values = {\r\n limit: Number,\r\n truncated: Boolean,\r\n };\r\n\r\n declare readonly showMoreTarget: HTMLElement;\r\n declare limitValue: number;\r\n declare readonly hasLimitValue: boolean;\r\n declare truncatedValue: boolean;\r\n declare readonly hasTruncatedValue: boolean;\r\n\r\n get _truncated(): boolean {\r\n return this.hasTruncatedValue ? this.truncatedValue : false;\r\n }\r\n\r\n set _truncated(value) {\r\n this.truncatedValue = value;\r\n }\r\n\r\n get _tableBody(): HTMLTableSectionElement {\r\n return (this.el as HTMLTableElement).tBodies[0];\r\n }\r\n\r\n get _tableRows(): HTMLTableRowElement[] {\r\n return Array.from(this._tableBody.rows);\r\n }\r\n\r\n get _limit(): number {\r\n return this.hasLimitValue ? this.limitValue : 20;\r\n }\r\n\r\n initialize() {\r\n this.truncate = this.truncate.bind(this);\r\n this.expand = this.expand.bind(this);\r\n }\r\n\r\n connect() {\r\n useMutation(this, {childList: true, element: this._tableBody});\r\n\r\n requestAnimationFrame(() => {\r\n this.truncate();\r\n this.showMoreTarget.addEventListener(\"click\", this.expand);\r\n });\r\n }\r\n\r\n truncate(event?: Event) {\r\n event?.preventDefault();\r\n this._truncated = true;\r\n if (this._tableRows.length >= this._limit) {\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n } else {\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n }\r\n\r\n expand(event?: Event) {\r\n this._truncated = false;\r\n event?.preventDefault();\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._hideElement(this.showMoreTarget);\r\n }\r\n\r\n mutate(entries: MutationRecord[]) {\r\n if (this._truncated) {\r\n this._reTruncate();\r\n }\r\n }\r\n\r\n private _showElement(el: HTMLElement): void {\r\n el.style.display = \"\";\r\n }\r\n\r\n private _hideElement(el: HTMLElement): void {\r\n el.style.display = \"none\";\r\n }\r\n\r\n private _reTruncate() {\r\n this._tableRows.slice(0, this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._showElement(el);\r\n }\r\n });\r\n this._tableRows.slice(this._limit).forEach((el) => {\r\n if (el !== this.showMoreTarget) {\r\n this._hideElement(el);\r\n }\r\n });\r\n this._showElement(this.showMoreTarget);\r\n }\r\n\r\n}","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\r\n\r\nexport class TimeoutController extends BaseController {\r\n\r\n static values = {seconds: Number};\r\n\r\n declare readonly secondsValue: number;\r\n _timeoutHandle: null | number = null;\r\n\r\n initialize() {\r\n this._timeout = this._timeout.bind(this);\r\n }\r\n\r\n connect() {\r\n requestAnimationFrame(() => {\r\n this._timeoutHandle = window.setTimeout(this._timeout, this.secondsValue * 1000);\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this._timeoutHandle) {\r\n window.clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n\r\n _timeout() {\r\n this.dispatch(this.el, \"timeout\");\r\n }\r\n\r\n}","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\r\n return element.nodeName == \"TURBO-FRAME\";\r\n}\r\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n _timeoutHandle: null | ReturnType = null;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n initialize() {\n this.refresh = this.refresh.bind(this);\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => this._timeoutHandle = setTimeout(() => this.refresh(), this.intervalValue));\n }\n }\n\n disconnect() {\n if (this._timeoutHandle) {\n clearTimeout(this._timeoutHandle);\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n declare errorClass: string;\n declare hasErrorClass: boolean;\n\n initialize() {\n this.updateWordCount = this.updateWordCount.bind(this);\n }\n\n connect() {\n this.updateWordCount();\n this.inputTarget.addEventListener(\"input\", this.updateWordCount);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.updateWordCount);\n }\n\n updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this.outputTarget.classList.remove(this.errorClass);\n } else {\n this.outputTarget.classList.add(this.errorClass);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n"],"names":["BaseController","context","_this","Proxy","get","obj","prop","returnVal","Reflect","self","test","logProperty","toString","apply","target","thisArg","argArray","log","args","dispatch","element","eventName","options","mergedOptions","Object","assign","bubbles","cancelable","detail","event","CustomEvent","this","logEvent","dispatchEvent","functionName","application","debug","logger","console","groupCollapsed","identifier","groupEnd","Controller","AnchorSpyController","initialize","_checkAnchor","bind","connect","requestAnimationFrame","window","addEventListener","disconnect","removeEventListener","write","preventDefault","_anchor","_key","el","keyValue","replaceAll","location","hash","substr","value","key","String","AppearanceController","_handleVisibility","document","appear","away","_documentIsActive","visibilityState","hasFocus","AsyncBlockController","loadContent","hasReplaceTarget","replaceTarget","fetch","endpointValue","then","response","text","html","newEl","createElement","innerHTML","hasSelectorValue","selectedContent","querySelectorAll","selectorValue","replaceWith","children","err","_errorMessage","hasErrorMessageValue","errorMessageValue","endpoint","errorMessage","selector","AutoSubmitFormController","submit","forEach","_this2","method","controller","methodName","composeEventName","name","eventPrefix","composedName","extendedEvent","type","composed","originalEvent","defaultOptions","useIntersection","targetElement","controllerDisconnect","observer","IntersectionObserver","entries","entry","isIntersecting","isVisible","call","appearEvent","dispatchAppear","disappearEvent","dispatchDisappear","observe","unobserve","[object Object]","events","onlyVisible","StimulusUse","_a","_b","_c","controllerId","stimulusUseDebug","id","dataset","controllerInitialize","controllerConnect","UseHover","super","onEnter","onLeave","hover","enhanceController","UseMutation","error","handleError","mutation","MutationObserver","useMutation","useWindowResize","callback","innerWidth","innerHeight","payload","height","Infinity","width","debounce","fn","wait","timeoutId","arguments","clearTimeout","setTimeout","AutosizeController","_handler","style","resize","boxSizing","windowResize","autosize","offset","offsetHeight","clientHeight","scrollHeight","CharCountController","_updateCharCount","inputTarget","charCount","length","outputTarget","innerText","hasErrorClass","_isValidCount","classList","remove","errorClass","add","count","min","max","hasMinValue","minValue","hasMaxValue","maxValue","Number","CheckboxSelectAllController","_toggle","_refresh","hasSelectAllTarget","selectAllTarget","checkboxTargets","checkbox","checked","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","filter","ClipboardController","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","select","sourceTarget","copy","execCommand","isHTMLAnchorElement","nodeName","isHTMLFormElement","isHTMLInputElement","isHTMLButtonElement","isHTMLSelectElement","isElementCheckable","removeUnused","Boolean","ConfirmController","confirm","Error","_message","hasMessageValue","messageValue","message","ConfirmNavigationController","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","_messageValue","DebugController","testTargets","DetectDirtyController","_checkDirty","_cacheLoadValues","restore","_restoreElementFromLoadValue","_getElementValue","_getElementLoadValue","getAttribute","_cacheAttrName","defaultChecked","Array","from","option","defaultSelected","_elementHasCachedLoadValue","hasAttribute","_isElementDirty","setAttribute","removeAttribute","cacheValue","defaultValue","DetectDirtyFormController","_formElements","_checkElementDirty","_cacheElementLoadValue","_this3","some","DisableInputsController","toggle","hasDisablerTarget","disablerTarget","disableInputs","enableInputs","shouldClear","hasClearValue","clearValue","disableTargets","_","disabled","clear","DisableWithController","enable","disable","_timeoutHandle","_isDisabled","stopImmediatePropagation","_cacheText","_getElText","_setElText","_disable","_timeout","_enable","str","undefined","hasTimeoutValue","timeoutValue","timeout","DismissableController","dismiss","ElementSaveController","_restoreOnLoad","localStorage","removeItem","_uniqueIdentifier","_element","save","attributes","attributesValue","split","data","attr","_get","setItem","JSON","stringify","getItem","savedData","parse","keys","_set","hasIdValue","idValue","elementID","href","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","restoreOnLoad","EmptyDomController","childList","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasEmptyClass","emptyClasses","hasNotEmptyClass","notEmptyClasses","emptyClass","notEmptyClass","hasScopeSelectorValue","scopeSelectorValue","scopeSelector","EnableInputsController","hasEnablerTarget","enablerTarget","enableTargets","FallbackImageController","onerror","hasPlaceholderValue","src","placeholderValue","display","placeholder","FormRcController","formTarget","reset","FormSaveController","_clear","_clearOnSubmit","_formIdentifier","_formData","_formID","elements","hasClearOnSubmitValue","clearOnSubmitValue","clearOnSubmit","IntersectionController","threshold","_threshold","disappear","hasThresholdValue","thresholdValue","map","val","parseFloat","trim","smoothPolyfilled","LazyBlockController","scrollToElement","behavior","block","inline","scrollIntoView","smoothSupported","import","polyfill","polyfillSmooth","documentElement","getScrollParent","node","overflowY","getComputedStyle","parentElement","body","LightboxImageController","open","close","_dialog","image","className","_imageClassName","_src","srcset","_srcSet","sizes","_sizes","appendChild","insertAdjacentElement","dialogPolyfill","registerDialog","_modalClassName","showModal","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","hasSizesValue","sizesValue","hasModalClass","modalClass","hasImageClass","imageClass","srcSet","LimitedSelectionCheckboxesController","handleInputs","inputTargets","tickedInputs","reduce","previousValue","hasErrorTarget","errorTarget","MediaPlayerController","play","mediaTarget","pause","restart","currentTime","seek","NestedFormController","_checkStructure","content","templateTarget","replace","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","closest","_wrapperClass","newRecord","destroyInput","querySelector","Date","getTime","Math","random","slice","indexOf","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","insertMode","wrapperClass","PasswordConfirmController","checkPasswordsMatch","passwordTargets","_allPasswordsMatch","values","Set","has","size","PasswordPeekController","peak","passwordTarget","hide","RemoteFormController","Node","new_element","_selector","parentNode","replaceChild","ResponsiveIframeWrapperController","messageReceived","hasOwnProperty","ResponsiveIframeBodyController","top","constructor","debounces","func","postUpdate","getHeight","parent","postMessage","EphemeralController","_cleanupSelf","cleanup","RegExp","substringIdentifierValueRegex","camelCase","action","classes","ScrollIntoFocusController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","ScrollToBottomController","scroll","hasModeValue","modeValue","mode","ScrollToController","warn","ScrollToTopController","SelfDestructController","secondsValue","seconds","StickyController","createMagicElement","_magicElement","_mode","intersectionRatio","hasStuckClass","stuckClass","TableSortController","sort","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCellIndex","_indexOfHeaderCell","index","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","cells","otherCells","x","y","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","_this4","_tableBody","head","tHead","rows","_tableHead","tBodies","startSort","TableTruncateController","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","limit","truncated","TeleportController","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","TimeoutController","ToggleClassController","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","useHover","hasClickAwayValue","clickAwayValue","onEvent","contains","rect","getBoundingClientRect","windowHeight","windowWidth","clientWidth","left","isElementInViewport","clickOutside","clickOutsideEvent","useClickOutside","hasInitialValue","toggleTargets","initialValue","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","on","off","mouseLeave","mouseLeaveValue","_this5","toggled","classValue","klass","isTurboFrame","class","clickAway","initial","TurboFrameRCController","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","frameId","loadingMessage","TurboFrameRefreshController","refresh","_poll","intervalValue","hasPollValue","pollValue","interval","poll","WordCountController","updateWordCount","wordCount","matches","match"],"mappings":"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"} \ No newline at end of file diff --git a/docs/docs/controllers/timeout_controller.mdx b/docs/docs/controllers/timeout_controller.mdx new file mode 100644 index 00000000..ac67befa --- /dev/null +++ b/docs/docs/controllers/timeout_controller.mdx @@ -0,0 +1,57 @@ +--- +id: TimeoutController +title: TimeoutController +--- + + + + + +import NoActions from "../_partials/no-actions.md"; +import NoTargets from "../_partials/no-targets.md"; +import NoClasses from "../_partials/no-classes.md"; + +## Purpose + +Utility controller to wire up other controller actions that need to fire after an elapsed time. + +## [Actions](https://stimulus.hotwire.dev/reference/actions) + + + +## [Targets](https://stimulus.hotwire.dev/reference/targets) + + + +## [Classes](https://stimulus.hotwire.dev/reference/classes) + + + +## [Values](https://stimulus.hotwire.dev/reference/values) + +| Value | Type | Description | Default | +| --- | --- | --- | --- | +| `seconds` | Number | The number of seconds until the action fires | - | + +## Events + +| Event | When | Dispatched on | `event.detail` | +| --- | --- |--- | --- | +|`timeout:action` | Fired after `secondsValue` seconds, used to wire your desired controller actions to | the controller root element | `element`: the controller root element | + +## Side Effects + +Calls `setTimeout` with the desired timeout. Cleans up on disconnect if that happens before timeout occurs. + +# How to Use + +An example: Show a marketing popup after 30 seconds. + +```html +
+ +

Sign up to get great deals!

+ + No thanks +
+``` diff --git a/docs/sidebars.js b/docs/sidebars.js index 66ebe02e..9802189e 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -58,6 +58,7 @@ module.exports = { "Utility Controllers": [ "controllers/AppearanceController", "controllers/IntersectionController", + "controllers/TimeoutController", ], }, { diff --git a/src/controllers/utility/timeout_controller.ts b/src/controllers/utility/timeout_controller.ts new file mode 100644 index 00000000..148742c6 --- /dev/null +++ b/src/controllers/utility/timeout_controller.ts @@ -0,0 +1,30 @@ +import {BaseController} from "../../utilities/base_controller"; + +export class TimeoutController extends BaseController { + + static values = {seconds: Number}; + + declare readonly secondsValue: number; + _timeoutHandle: null | number = null; + + initialize() { + this._timeout = this._timeout.bind(this); + } + + connect() { + requestAnimationFrame(() => { + this._timeoutHandle = window.setTimeout(this._timeout, this.secondsValue * 1000); + }); + } + + disconnect() { + if (this._timeoutHandle) { + window.clearTimeout(this._timeoutHandle); + } + } + + _timeout() { + this.dispatch(this.el, "timeout"); + } + +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f6e8e0ce..0a20a0e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,6 +39,7 @@ export {StickyController} from "./controllers/sticky_controller"; export {TableSortController} from "./controllers/tables/table_sort_controller"; export {TableTruncateController} from "./controllers/tables/table_truncate_controller"; export {TeleportController} from "./controllers/teleport_controller"; +export {TimeoutController} from "./controllers/utility/timeout_controller"; export {ToggleClassController} from "./controllers/toggle_class_controller"; export {TurboFrameRCController} from "./controllers/turbo_frame_rc_controller"; export {TurboFrameRefreshController} from "./controllers/turbo_frame_refresh_controller";