@hortonstudio/main 1.9.24 → 1.9.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/assets/hs-animations-tvD4W7u0.js +3 -0
  2. package/dist/assets/hs-animations-tvD4W7u0.js.br +0 -0
  3. package/dist/assets/hs-animations-tvD4W7u0.js.gz +0 -0
  4. package/dist/assets/hs-animations-tvD4W7u0.js.map +1 -0
  5. package/dist/assets/hs-counter-DmspKHOV.js +2 -0
  6. package/dist/assets/hs-counter-DmspKHOV.js.br +0 -0
  7. package/dist/assets/hs-counter-DmspKHOV.js.gz +0 -0
  8. package/dist/assets/{hs-counter-Bfh7_P60.js.map → hs-counter-DmspKHOV.js.map} +1 -1
  9. package/dist/assets/hs-default-Dxg7WNGx.js +2 -0
  10. package/dist/assets/hs-default-Dxg7WNGx.js.br +0 -0
  11. package/dist/assets/hs-default-Dxg7WNGx.js.gz +0 -0
  12. package/dist/assets/hs-default-Dxg7WNGx.js.map +1 -0
  13. package/dist/assets/hs-marquee-Dwenaw7L.js +2 -0
  14. package/dist/assets/hs-marquee-Dwenaw7L.js.br +0 -0
  15. package/dist/assets/hs-marquee-Dwenaw7L.js.gz +0 -0
  16. package/dist/assets/{hs-marquee-CZ9pmCbT.js.map → hs-marquee-Dwenaw7L.js.map} +1 -1
  17. package/dist/assets/hs-normalize-iTnWVIjq.js +2 -0
  18. package/dist/assets/hs-normalize-iTnWVIjq.js.br +0 -0
  19. package/dist/assets/hs-normalize-iTnWVIjq.js.gz +0 -0
  20. package/dist/assets/{hs-normalize-CTwtG5-a.js.map → hs-normalize-iTnWVIjq.js.map} +1 -1
  21. package/dist/assets/hs-utils-CNwAFmmK.js +2 -0
  22. package/dist/assets/hs-utils-CNwAFmmK.js.br +0 -0
  23. package/dist/assets/hs-utils-CNwAFmmK.js.gz +0 -0
  24. package/dist/assets/hs-utils-CNwAFmmK.js.map +1 -0
  25. package/dist/main.js +2 -2
  26. package/dist/main.js.br +0 -0
  27. package/dist/main.js.gz +0 -0
  28. package/dist/main.js.map +1 -1
  29. package/package.json +2 -2
  30. package/dist/assets/hs-animations-BDMqlbof.js +0 -3
  31. package/dist/assets/hs-animations-BDMqlbof.js. +0 -3
  32. package/dist/assets/hs-animations-BDMqlbof.js.gz +0 -0
  33. package/dist/assets/hs-animations-BDMqlbof.js.map +0 -1
  34. package/dist/assets/hs-attributeSelector-6pGcDBo-.js +0 -2
  35. package/dist/assets/hs-attributeSelector-6pGcDBo-.js.map +0 -1
  36. package/dist/assets/hs-comparison-Ja8EiSGD.js +0 -2
  37. package/dist/assets/hs-comparison-Ja8EiSGD.js. +0 -2
  38. package/dist/assets/hs-comparison-Ja8EiSGD.js.gz +0 -0
  39. package/dist/assets/hs-comparison-Ja8EiSGD.js.map +0 -1
  40. package/dist/assets/hs-counter-Bfh7_P60.js +0 -2
  41. package/dist/assets/hs-counter-Bfh7_P60.js. +0 -2
  42. package/dist/assets/hs-counter-Bfh7_P60.js.gz +0 -0
  43. package/dist/assets/hs-cssVariables-BjuwJfDJ.js +0 -2
  44. package/dist/assets/hs-cssVariables-BjuwJfDJ.js.map +0 -1
  45. package/dist/assets/hs-default-CLmDRb9d.js +0 -2
  46. package/dist/assets/hs-default-CLmDRb9d.js. +0 -2
  47. package/dist/assets/hs-default-CLmDRb9d.js.gz +0 -0
  48. package/dist/assets/hs-default-CLmDRb9d.js.map +0 -1
  49. package/dist/assets/hs-form-COFGgawz.js +0 -2
  50. package/dist/assets/hs-form-COFGgawz.js. +0 -2
  51. package/dist/assets/hs-form-COFGgawz.js.gz +0 -0
  52. package/dist/assets/hs-form-COFGgawz.js.map +0 -1
  53. package/dist/assets/hs-marquee-CZ9pmCbT.js +0 -2
  54. package/dist/assets/hs-marquee-CZ9pmCbT.js. +0 -2
  55. package/dist/assets/hs-marquee-CZ9pmCbT.js.gz +0 -0
  56. package/dist/assets/hs-modalManager-H_YegPAO.js +0 -2
  57. package/dist/assets/hs-modalManager-H_YegPAO.js. +0 -2
  58. package/dist/assets/hs-modalManager-H_YegPAO.js.gz +0 -0
  59. package/dist/assets/hs-modalManager-H_YegPAO.js.map +0 -1
  60. package/dist/assets/hs-normalize-CTwtG5-a.js +0 -2
  61. package/dist/assets/hs-normalize-CTwtG5-a.js. +0 -2
  62. package/dist/assets/hs-normalize-CTwtG5-a.js.gz +0 -0
  63. package/dist/assets/hs-orchestrator-J8b7XRk1.js +0 -2
  64. package/dist/assets/hs-orchestrator-J8b7XRk1.js. +0 -2
  65. package/dist/assets/hs-orchestrator-J8b7XRk1.js.gz +0 -0
  66. package/dist/assets/hs-orchestrator-J8b7XRk1.js.map +0 -1
  67. package/dist/assets/hs-pagination-DcOxmDPJ.js +0 -2
  68. package/dist/assets/hs-pagination-DcOxmDPJ.js. +0 -2
  69. package/dist/assets/hs-pagination-DcOxmDPJ.js.gz +0 -0
  70. package/dist/assets/hs-pagination-DcOxmDPJ.js.map +0 -1
  71. package/dist/assets/hs-structure-DhNix64P.js +0 -3
  72. package/dist/assets/hs-structure-DhNix64P.js. +0 -3
  73. package/dist/assets/hs-structure-DhNix64P.js.gz +0 -0
  74. package/dist/assets/hs-structure-DhNix64P.js.map +0 -1
  75. package/dist/assets/hs-tabs-CaxqHoGW.js +0 -2
  76. package/dist/assets/hs-tabs-CaxqHoGW.js. +0 -2
  77. package/dist/assets/hs-tabs-CaxqHoGW.js.gz +0 -0
  78. package/dist/assets/hs-tabs-CaxqHoGW.js.map +0 -1
  79. package/dist/assets/hs-toc-fxIQS7tz.js +0 -2
  80. package/dist/assets/hs-toc-fxIQS7tz.js. +0 -2
  81. package/dist/assets/hs-toc-fxIQS7tz.js.gz +0 -0
  82. package/dist/assets/hs-toc-fxIQS7tz.js.map +0 -1
  83. package/dist/assets/hs-transition-CDNuGJNq.js +0 -2
  84. package/dist/assets/hs-transition-CDNuGJNq.js. +0 -2
  85. package/dist/assets/hs-transition-CDNuGJNq.js.gz +0 -0
  86. package/dist/assets/hs-transition-CDNuGJNq.js.map +0 -1
  87. package/dist/assets/hs-utils-CKm6QhLw.js +0 -2
  88. package/dist/assets/hs-utils-CKm6QhLw.js.map +0 -1
  89. package/dist/main.js. +0 -3
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";import{a as t,q as n,g as o}from"./hs-attributeSelector-6pGcDBo-.js";import{s as a,o as r,c as s,a as i}from"./hs-modalManager-H_YegPAO.js";function l(o){const a={handlers:[],domContentLoadedHandler:null},r=(e,t,n)=>{e.addEventListener(t,n),a.handlers.push({element:e,event:t,handler:n})};function s(){n(o,"wrapper").forEach(n=>{const a=n;a.dataset.hsFormRangeInit||(a.dataset.hsFormRangeInit="true",function(n,a){const r=n.querySelector("input[type='range']");if(!r)return void console.warn('[range] Missing <input type="range"> element in wrapper',n);const s=t(o,"output",n),i=()=>{const t=r.min?+r.min:0,a=r.max?+r.max:100,i=+r.value||t,l=(i-t)/(a-t);n.style.setProperty(`${e._global.cssVars.prefix}${o.cssVars?.progress||"progress"}`,String(l)),s&&(s.textContent=String(i))};a(r,"input",i),i()}(a,r))})}return"loading"===document.readyState?(a.domContentLoadedHandler=s,document.addEventListener("DOMContentLoaded",a.domContentLoadedHandler)):s(),{result:"range initialized",destroy:()=>{a.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",a.domContentLoadedHandler),a.domContentLoadedHandler=null),a.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),a.handlers.length=0;n(o,"wrapper").forEach(e=>{delete e.dataset.hsFormRangeInit})}}}const c=[{name:"Alabama",value:"AL"},{name:"Alaska",value:"AK"},{name:"Arizona",value:"AZ"},{name:"Arkansas",value:"AR"},{name:"California",value:"CA"},{name:"Colorado",value:"CO"},{name:"Connecticut",value:"CT"},{name:"Delaware",value:"DE"},{name:"Florida",value:"FL"},{name:"Georgia",value:"GA"},{name:"Hawaii",value:"HI"},{name:"Idaho",value:"ID"},{name:"Illinois",value:"IL"},{name:"Indiana",value:"IN"},{name:"Iowa",value:"IA"},{name:"Kansas",value:"KS"},{name:"Kentucky",value:"KY"},{name:"Louisiana",value:"LA"},{name:"Maine",value:"ME"},{name:"Maryland",value:"MD"},{name:"Massachusetts",value:"MA"},{name:"Michigan",value:"MI"},{name:"Minnesota",value:"MN"},{name:"Mississippi",value:"MS"},{name:"Missouri",value:"MO"},{name:"Montana",value:"MT"},{name:"Nebraska",value:"NE"},{name:"Nevada",value:"NV"},{name:"New Hampshire",value:"NH"},{name:"New Jersey",value:"NJ"},{name:"New Mexico",value:"NM"},{name:"New York",value:"NY"},{name:"North Carolina",value:"NC"},{name:"North Dakota",value:"ND"},{name:"Ohio",value:"OH"},{name:"Oklahoma",value:"OK"},{name:"Oregon",value:"OR"},{name:"Pennsylvania",value:"PA"},{name:"Rhode Island",value:"RI"},{name:"South Carolina",value:"SC"},{name:"South Dakota",value:"SD"},{name:"Tennessee",value:"TN"},{name:"Texas",value:"TX"},{name:"Utah",value:"UT"},{name:"Vermont",value:"VT"},{name:"Virginia",value:"VA"},{name:"Washington",value:"WA"},{name:"West Virginia",value:"WV"},{name:"Wisconsin",value:"WI"},{name:"Wyoming",value:"WY"}];function u(e){const o={observers:[],handlers:[],timeouts:[],domContentLoadedHandler:null},l=e=>o.observers.push(e),c=(e,t,n,a)=>{e.addEventListener(t,n,a),o.handlers.push({element:e,event:t,handler:n,options:a})},u=e=>o.timeouts.push(e);function d(){document.querySelectorAll("select > div").forEach(e=>{const t=e.parentElement;for(;e.firstChild;)t.appendChild(e.firstChild);e.remove()});n(e,"wrapper").forEach(n=>{!function(n,l,c,u){const d=n.querySelector("select");if(!d)return void console.warn("[select] Missing <select> element in custom select wrapper",n);d.setAttribute("aria-hidden","true"),d.setAttribute("tabindex","-1");const m=d.getAttribute("name")||"custom-select",v=t(e,"list",n),p=t(e,"button",n);if(!v||!p)return void console.warn("[select] Missing required elements (list or button) in custom select wrapper",n);function f(){d.disabled?(p.disabled=!0,p.setAttribute("aria-disabled","true")):(p.disabled=!1,p.removeAttribute("aria-disabled"))}f();const h=v.firstElementChild;if(!h)return void console.warn("[select] Missing option template in custom select list",n);const y=h.cloneNode(!0);h.remove();d.querySelectorAll("option").forEach((e,t)=>{const n=y.cloneNode(!0),o=n.querySelector("span");if(o&&(o.textContent=e.textContent),n.setAttribute("data-value",e.value),n.setAttribute("role","option"),n.setAttribute("id",`${m}-option-${t}`),n.setAttribute("tabindex","-1"),e.selected){n.setAttribute("aria-selected","true");const t=p.querySelector("span")||p;"SPAN"===t.tagName&&(t.textContent=e.textContent),e.value?p.classList.add("is-filled"):p.classList.remove("is-filled")}else n.setAttribute("aria-selected","false");v.appendChild(n)}),v.setAttribute("role","listbox"),v.setAttribute("id",`${m}-listbox`),v.setAttribute("tabindex","-1"),v.setAttribute("aria-hidden","true"),v.inert=!0,p.setAttribute("role","combobox"),p.setAttribute("aria-haspopup","listbox"),p.setAttribute("aria-controls",`${m}-listbox`),p.setAttribute("aria-expanded","false"),p.setAttribute("id",`${m}-button`);const b=n.querySelector("label")||document.querySelector(`label[for="${d.id}"]`);if(b){const e=b.id||`${m}-label`;b.id=e,d.id||(d.id=`${m}-select`),b.setAttribute("for",d.id),p.setAttribute("aria-labelledby",e)}const g=n.querySelector('[data-hs-height="element"]'),A=g||null;let L="",C=null;function E(){return n.classList.contains("is-active")}function S(){const e=E(),t="true"===p.getAttribute("aria-expanded");if(t&&!e&&v.contains(document.activeElement)&&p.focus(),p.setAttribute("aria-expanded",e?"true":"false"),v.setAttribute("aria-hidden",e?"false":"true"),v.inert=!e,e){v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","0")}),t||r()}else{p.removeAttribute("aria-activedescendant");v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","-1")}),t&&s()}A&&i(A,e,{duration:300,ease:"power2.inOut"})}A&&a(A,E());function w(e){const t=v.querySelectorAll('[role="option"]');e<0||e>=t.length||(t.forEach(e=>{e.classList.remove("focused"),e.setAttribute("tabindex","-1")}),t[e].classList.add("focused"),t[e].setAttribute("tabindex","0"),t[e].focus(),p.setAttribute("aria-activedescendant",t[e].id))}function x(e){if(1!==e.length)return!1;if(null!==C){clearTimeout(C);const e=o.timeouts.indexOf(C);e>-1&&o.timeouts.splice(e,1)}const t=Array.from(v.querySelectorAll('[role="option"]'));if(0===t.length)return!1;L+=e.toLowerCase();const a=t.findIndex(e=>e.classList.contains("focused"));if(1===L.length||L.split("").every(e=>e===L[0])){const e=L[0];let o=a+1;for(let a=0;a<t.length;a++){const r=(o+a)%t.length;if((t[r].querySelector("span")?.textContent||t[r].textContent).toLowerCase().startsWith(e))return w(r),E()||n.classList.add("is-active"),C=setTimeout(q,500),u(C),!0}}else{const e=t.findIndex(e=>(e.querySelector("span")?.textContent||e.textContent).toLowerCase().startsWith(L));if(-1!==e)return w(e),E()||n.classList.add("is-active"),C=setTimeout(q,500),u(C),!0}return C=setTimeout(q,500),u(C),!1}function q(){L="",C=null}function k(e){const t=e.getAttribute("data-value")||"",o=e.querySelector("span")?.textContent||e.textContent;d.value=t,d.dispatchEvent(new Event("change",{bubbles:!0}));const a=p.querySelector("span")||p;"SPAN"===a.tagName&&(a.textContent=o),t?p.classList.add("is-filled"):p.classList.remove("is-filled"),v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("aria-selected","false")}),e.setAttribute("aria-selected","true"),n.classList.remove("is-active")}S();const D=e=>{e.preventDefault(),n.classList.toggle("is-active")};l(p,"click",D);const N=e=>{switch(e.key){case"Enter":e.preventDefault();const t=p.closest("form");if(t){const e=t.querySelector('button[type="submit"], input[type="submit"]')||t.querySelector("button:not([type])");e&&e.click()}break;case" ":e.preventDefault(),n.classList.toggle("is-active");break;case"ArrowDown":e.preventDefault(),E()?w(0):(n.classList.add("is-active"),requestAnimationFrame(()=>{w(0)}));break;case"ArrowUp":if(e.preventDefault(),E()){w(v.querySelectorAll('[role="option"]').length-1)}else n.classList.add("is-active"),requestAnimationFrame(()=>{w(0)});break;case"Escape":E()&&(e.preventDefault(),n.classList.remove("is-active"));break;case"Home":e.preventDefault(),E()||n.classList.add("is-active"),w(0);break;case"End":e.preventDefault(),E()||n.classList.add("is-active");w(v.querySelectorAll('[role="option"]').length-1);break;default:x(e.key)&&e.preventDefault()}};l(p,"keydown",N);const M=e=>{const t=e.target.closest('[role="option"]');if(!t)return;const o=Array.from(v.querySelectorAll('[role="option"]')),a=o.indexOf(t);switch(e.key){case"ArrowDown":e.preventDefault(),a<o.length-1&&w(a+1);break;case"ArrowUp":e.preventDefault(),a>0&&w(a-1);break;case"Enter":e.preventDefault(),k(t);break;case"Escape":e.preventDefault(),n.classList.remove("is-active"),p.focus();break;case"Home":e.preventDefault(),w(0);break;case"End":e.preventDefault(),w(o.length-1);break;default:x(e.key)&&e.preventDefault()}};l(v,"keydown",M);l(v,"click",e=>{const t=e.target.closest('[role="option"]');t&&k(t)});const F=e=>{e.relatedTarget&&n.contains(e.relatedTarget)||!n.classList.contains("is-active")||n.classList.remove("is-active")};l(v,"focusout",F);const H=e=>{n.classList.contains("is-active")&&!n.contains(e.target)&&n.classList.remove("is-active")};l(document,"click",H);const T=new MutationObserver(()=>{S()});T.observe(n,{attributes:!0,attributeFilter:["class"]}),c(T);const I=new MutationObserver(()=>{f()});I.observe(d,{attributes:!0,attributeFilter:["disabled"]}),c(I);const O=()=>{const e=d.options[d.selectedIndex];if(e){const t=v.querySelectorAll('[role="option"]'),n=Array.from(t).find(t=>t.getAttribute("data-value")===e.value);if(n){const o=n.querySelector("span")?.textContent||n.textContent,a=p.querySelector("span")||p;"SPAN"===a.tagName&&(a.textContent=o),e.value?p.classList.add("is-filled"):p.classList.remove("is-filled"),t.forEach(e=>{e.setAttribute("aria-selected","false")}),n.setAttribute("aria-selected","true")}}};l(d,"change",O),l(d,"input",O);const $=d.closest("form");if($){l($,"reset",()=>{setTimeout(()=>{O()},0)})}}(n,c,l,u)})}return"loading"===document.readyState?(o.domContentLoadedHandler=d,document.addEventListener("DOMContentLoaded",o.domContentLoadedHandler)):d(),window.initCustomSelects=d,{result:"select initialized",destroy:()=>{o.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",o.domContentLoadedHandler),o.domContentLoadedHandler=null),o.observers.forEach(e=>e.disconnect()),o.observers.length=0,o.timeouts.forEach(e=>clearTimeout(e)),o.timeouts.length=0,o.handlers.forEach(({element:e,event:t,handler:n,options:o})=>{e.removeEventListener(t,n,o)}),o.handlers.length=0,window.initCustomSelects&&delete window.initCustomSelects}}}async function d(e){const t={destroyFunctions:[]};try{const o=function(e){const t=n(e,"states");return t.forEach(e=>{const t=e;if("SELECT"!==t.tagName)return void console.warn('[select-states] data-hs-form-select="states" must be on a <select> element',t);const n=t.querySelectorAll("option");if(1!==n.length)return void console.warn("[select-states] Select must have exactly 1 default template option (placeholder). Found:",n.length,t);const o=n[0];if(""!==o.value)return void console.warn("[select-states] Template option must have empty value for placeholder. Found value:",o.value,t);const a=o.textContent;t.innerHTML="";const r=document.createElement("option");r.value="",r.textContent=a,t.appendChild(r),c.forEach(e=>{const n=document.createElement("option");n.value=e.value,n.textContent=e.name,t.appendChild(n)})}),{result:`states initialized on ${t.length} select${1!==t.length?"s":""}`,destroy:()=>{}}}(e.states);o?.destroy&&t.destroyFunctions.push(o.destroy);const a=u(e["custom-select"]);return a?.destroy&&t.destroyFunctions.push(a.destroy),{result:"select initialized",destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[select] Error during cleanup:",t)}}),t.destroyFunctions.length=0}}}catch(o){throw console.error("[select] Initialization failed:",o),t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[select] Error during error cleanup:",t)}}),o}}async function m(){const a=e.structure.form,r={destroyFunctions:[]},s=o(a.honeypot,"form-handler");if(document.querySelector(s))try{const e=function(e){const n={honeypotHandler:null},o=n=>{const o=n.target;if("FORM"!==o.tagName)return;const a=t(e,"form-handler",o);return a&&a.value?(n.preventDefault(),n.stopPropagation(),n.stopImmediatePropagation(),!1):void 0};return n.honeypotHandler=o,document.addEventListener("submit",o,!0),{result:"honeypot initialized",destroy:()=>{n.honeypotHandler&&(document.removeEventListener("submit",n.honeypotHandler,!0),n.honeypotHandler=null)}}}(a.honeypot);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing honeypot:",m)}const i=o(a.range,"wrapper");if(document.querySelector(i))try{const e=l(a.range);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing range:",m)}const c=o(a.test,"wrapper");if(document.querySelector(c))try{const e=function(e){const o={handlers:[]},a=(e,t,n,a)=>{e.addEventListener(t,n,a),o.handlers.push({element:e,event:t,handler:n,options:a})},r=n(e,"wrapper");return r.forEach(n=>{const o=n.querySelector("form");if(!o)return void console.warn('[form-test] No <form> element found within data-hs-form-test="wrapper"',n);const r=t(e,"info",n),s=()=>{const e=new FormData(o),t={};for(const[n,o]of e.entries())t[n]=o;if(r){const e=document.createElement("pre");e.textContent=JSON.stringify(t,null,2),r.innerHTML="",r.appendChild(document.createTextNode("Test mode active - Live form data:")),r.appendChild(e)}};r&&(r.textContent="Test mode active, preventing native submissions",s()),a(o,"input",s),a(o,"change",s);const i=o.querySelector('button[type="submit"], input[type="submit"]')||o.querySelector("button:not([type])");i&&a(i,"click",()=>{console.log("[form-test] Submit button clicked"),requestAnimationFrame(()=>{o.checkValidity()||console.log("[form-test] Browser blocked submission - validation failed")})}),a(o,"submit",e=>{e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),console.log("[form-test] Submission prevented - displaying test results");const t=new FormData(o),n={};for(const[o,r]of t.entries())n[o]=r;const a=`✅ Form would submit successfully at ${(new Date).toLocaleTimeString()}`;if(r){const e=document.createElement("pre");e.textContent=JSON.stringify(n,null,2),r.innerHTML="",r.appendChild(document.createTextNode(a)),r.appendChild(e)}else console.log(a),console.log("Form data:",n);return!1},!0)}),{result:`test initialized on ${r.length} form${1!==r.length?"s":""}`,destroy:()=>{o.handlers.forEach(({element:e,event:t,handler:n,options:o})=>{e.removeEventListener(t,n,o)}),o.handlers.length=0}}}(a.test);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing test:",m)}const u=o(a.select,"wrapper");if(document.querySelector(u))try{const e=await d(a.select);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing select:",m)}return{result:`form initialized (${r.destroyFunctions.length} modules active)`,destroy:()=>{r.destroyFunctions.forEach(e=>{try{e()}catch(m){console.error("[form] Error during cleanup:",m)}}),r.destroyFunctions.length=0}}}export{m as init};
2
- //# sourceMappingURL=hs-form-COFGgawz.js.map
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";import{a as t,q as n,g as o}from"./hs-attributeSelector-6pGcDBo-.js";import{s as a,o as r,c as s,a as i}from"./hs-modalManager-H_YegPAO.js";function l(o){const a={handlers:[],domContentLoadedHandler:null},r=(e,t,n)=>{e.addEventListener(t,n),a.handlers.push({element:e,event:t,handler:n})};function s(){n(o,"wrapper").forEach(n=>{const a=n;a.dataset.hsFormRangeInit||(a.dataset.hsFormRangeInit="true",function(n,a){const r=n.querySelector("input[type='range']");if(!r)return void console.warn('[range] Missing <input type="range"> element in wrapper',n);const s=t(o,"output",n),i=()=>{const t=r.min?+r.min:0,a=r.max?+r.max:100,i=+r.value||t,l=(i-t)/(a-t);n.style.setProperty(`${e._global.cssVars.prefix}${o.cssVars?.progress||"progress"}`,String(l)),s&&(s.textContent=String(i))};a(r,"input",i),i()}(a,r))})}return"loading"===document.readyState?(a.domContentLoadedHandler=s,document.addEventListener("DOMContentLoaded",a.domContentLoadedHandler)):s(),{result:"range initialized",destroy:()=>{a.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",a.domContentLoadedHandler),a.domContentLoadedHandler=null),a.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),a.handlers.length=0;n(o,"wrapper").forEach(e=>{delete e.dataset.hsFormRangeInit})}}}const c=[{name:"Alabama",value:"AL"},{name:"Alaska",value:"AK"},{name:"Arizona",value:"AZ"},{name:"Arkansas",value:"AR"},{name:"California",value:"CA"},{name:"Colorado",value:"CO"},{name:"Connecticut",value:"CT"},{name:"Delaware",value:"DE"},{name:"Florida",value:"FL"},{name:"Georgia",value:"GA"},{name:"Hawaii",value:"HI"},{name:"Idaho",value:"ID"},{name:"Illinois",value:"IL"},{name:"Indiana",value:"IN"},{name:"Iowa",value:"IA"},{name:"Kansas",value:"KS"},{name:"Kentucky",value:"KY"},{name:"Louisiana",value:"LA"},{name:"Maine",value:"ME"},{name:"Maryland",value:"MD"},{name:"Massachusetts",value:"MA"},{name:"Michigan",value:"MI"},{name:"Minnesota",value:"MN"},{name:"Mississippi",value:"MS"},{name:"Missouri",value:"MO"},{name:"Montana",value:"MT"},{name:"Nebraska",value:"NE"},{name:"Nevada",value:"NV"},{name:"New Hampshire",value:"NH"},{name:"New Jersey",value:"NJ"},{name:"New Mexico",value:"NM"},{name:"New York",value:"NY"},{name:"North Carolina",value:"NC"},{name:"North Dakota",value:"ND"},{name:"Ohio",value:"OH"},{name:"Oklahoma",value:"OK"},{name:"Oregon",value:"OR"},{name:"Pennsylvania",value:"PA"},{name:"Rhode Island",value:"RI"},{name:"South Carolina",value:"SC"},{name:"South Dakota",value:"SD"},{name:"Tennessee",value:"TN"},{name:"Texas",value:"TX"},{name:"Utah",value:"UT"},{name:"Vermont",value:"VT"},{name:"Virginia",value:"VA"},{name:"Washington",value:"WA"},{name:"West Virginia",value:"WV"},{name:"Wisconsin",value:"WI"},{name:"Wyoming",value:"WY"}];function u(e){const o={observers:[],handlers:[],timeouts:[],domContentLoadedHandler:null},l=e=>o.observers.push(e),c=(e,t,n,a)=>{e.addEventListener(t,n,a),o.handlers.push({element:e,event:t,handler:n,options:a})},u=e=>o.timeouts.push(e);function d(){document.querySelectorAll("select > div").forEach(e=>{const t=e.parentElement;for(;e.firstChild;)t.appendChild(e.firstChild);e.remove()});n(e,"wrapper").forEach(n=>{!function(n,l,c,u){const d=n.querySelector("select");if(!d)return void console.warn("[select] Missing <select> element in custom select wrapper",n);d.setAttribute("aria-hidden","true"),d.setAttribute("tabindex","-1");const m=d.getAttribute("name")||"custom-select",v=t(e,"list",n),p=t(e,"button",n);if(!v||!p)return void console.warn("[select] Missing required elements (list or button) in custom select wrapper",n);function f(){d.disabled?(p.disabled=!0,p.setAttribute("aria-disabled","true")):(p.disabled=!1,p.removeAttribute("aria-disabled"))}f();const h=v.firstElementChild;if(!h)return void console.warn("[select] Missing option template in custom select list",n);const y=h.cloneNode(!0);h.remove();d.querySelectorAll("option").forEach((e,t)=>{const n=y.cloneNode(!0),o=n.querySelector("span");if(o&&(o.textContent=e.textContent),n.setAttribute("data-value",e.value),n.setAttribute("role","option"),n.setAttribute("id",`${m}-option-${t}`),n.setAttribute("tabindex","-1"),e.selected){n.setAttribute("aria-selected","true");const t=p.querySelector("span")||p;"SPAN"===t.tagName&&(t.textContent=e.textContent),e.value?p.classList.add("is-filled"):p.classList.remove("is-filled")}else n.setAttribute("aria-selected","false");v.appendChild(n)}),v.setAttribute("role","listbox"),v.setAttribute("id",`${m}-listbox`),v.setAttribute("tabindex","-1"),v.setAttribute("aria-hidden","true"),v.inert=!0,p.setAttribute("role","combobox"),p.setAttribute("aria-haspopup","listbox"),p.setAttribute("aria-controls",`${m}-listbox`),p.setAttribute("aria-expanded","false"),p.setAttribute("id",`${m}-button`);const b=n.querySelector("label")||document.querySelector(`label[for="${d.id}"]`);if(b){const e=b.id||`${m}-label`;b.id=e,d.id||(d.id=`${m}-select`),b.setAttribute("for",d.id),p.setAttribute("aria-labelledby",e)}const g=n.querySelector('[data-hs-height="element"]'),A=g||null;let L="",C=null;function E(){return n.classList.contains("is-active")}function S(){const e=E(),t="true"===p.getAttribute("aria-expanded");if(t&&!e&&v.contains(document.activeElement)&&p.focus(),p.setAttribute("aria-expanded",e?"true":"false"),v.setAttribute("aria-hidden",e?"false":"true"),v.inert=!e,e){v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","0")}),t||r()}else{p.removeAttribute("aria-activedescendant");v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","-1")}),t&&s()}A&&i(A,e,{duration:300,ease:"power2.inOut"})}A&&a(A,E());function w(e){const t=v.querySelectorAll('[role="option"]');e<0||e>=t.length||(t.forEach(e=>{e.classList.remove("focused"),e.setAttribute("tabindex","-1")}),t[e].classList.add("focused"),t[e].setAttribute("tabindex","0"),t[e].focus(),p.setAttribute("aria-activedescendant",t[e].id))}function x(e){if(1!==e.length)return!1;if(null!==C){clearTimeout(C);const e=o.timeouts.indexOf(C);e>-1&&o.timeouts.splice(e,1)}const t=Array.from(v.querySelectorAll('[role="option"]'));if(0===t.length)return!1;L+=e.toLowerCase();const a=t.findIndex(e=>e.classList.contains("focused"));if(1===L.length||L.split("").every(e=>e===L[0])){const e=L[0];let o=a+1;for(let a=0;a<t.length;a++){const r=(o+a)%t.length;if((t[r].querySelector("span")?.textContent||t[r].textContent).toLowerCase().startsWith(e))return w(r),E()||n.classList.add("is-active"),C=setTimeout(q,500),u(C),!0}}else{const e=t.findIndex(e=>(e.querySelector("span")?.textContent||e.textContent).toLowerCase().startsWith(L));if(-1!==e)return w(e),E()||n.classList.add("is-active"),C=setTimeout(q,500),u(C),!0}return C=setTimeout(q,500),u(C),!1}function q(){L="",C=null}function k(e){const t=e.getAttribute("data-value")||"",o=e.querySelector("span")?.textContent||e.textContent;d.value=t,d.dispatchEvent(new Event("change",{bubbles:!0}));const a=p.querySelector("span")||p;"SPAN"===a.tagName&&(a.textContent=o),t?p.classList.add("is-filled"):p.classList.remove("is-filled"),v.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("aria-selected","false")}),e.setAttribute("aria-selected","true"),n.classList.remove("is-active")}S();const D=e=>{e.preventDefault(),n.classList.toggle("is-active")};l(p,"click",D);const N=e=>{switch(e.key){case"Enter":e.preventDefault();const t=p.closest("form");if(t){const e=t.querySelector('button[type="submit"], input[type="submit"]')||t.querySelector("button:not([type])");e&&e.click()}break;case" ":e.preventDefault(),n.classList.toggle("is-active");break;case"ArrowDown":e.preventDefault(),E()?w(0):(n.classList.add("is-active"),requestAnimationFrame(()=>{w(0)}));break;case"ArrowUp":if(e.preventDefault(),E()){w(v.querySelectorAll('[role="option"]').length-1)}else n.classList.add("is-active"),requestAnimationFrame(()=>{w(0)});break;case"Escape":E()&&(e.preventDefault(),n.classList.remove("is-active"));break;case"Home":e.preventDefault(),E()||n.classList.add("is-active"),w(0);break;case"End":e.preventDefault(),E()||n.classList.add("is-active");w(v.querySelectorAll('[role="option"]').length-1);break;default:x(e.key)&&e.preventDefault()}};l(p,"keydown",N);const M=e=>{const t=e.target.closest('[role="option"]');if(!t)return;const o=Array.from(v.querySelectorAll('[role="option"]')),a=o.indexOf(t);switch(e.key){case"ArrowDown":e.preventDefault(),a<o.length-1&&w(a+1);break;case"ArrowUp":e.preventDefault(),a>0&&w(a-1);break;case"Enter":e.preventDefault(),k(t);break;case"Escape":e.preventDefault(),n.classList.remove("is-active"),p.focus();break;case"Home":e.preventDefault(),w(0);break;case"End":e.preventDefault(),w(o.length-1);break;default:x(e.key)&&e.preventDefault()}};l(v,"keydown",M);l(v,"click",e=>{const t=e.target.closest('[role="option"]');t&&k(t)});const F=e=>{e.relatedTarget&&n.contains(e.relatedTarget)||!n.classList.contains("is-active")||n.classList.remove("is-active")};l(v,"focusout",F);const H=e=>{n.classList.contains("is-active")&&!n.contains(e.target)&&n.classList.remove("is-active")};l(document,"click",H);const T=new MutationObserver(()=>{S()});T.observe(n,{attributes:!0,attributeFilter:["class"]}),c(T);const I=new MutationObserver(()=>{f()});I.observe(d,{attributes:!0,attributeFilter:["disabled"]}),c(I);const O=()=>{const e=d.options[d.selectedIndex];if(e){const t=v.querySelectorAll('[role="option"]'),n=Array.from(t).find(t=>t.getAttribute("data-value")===e.value);if(n){const o=n.querySelector("span")?.textContent||n.textContent,a=p.querySelector("span")||p;"SPAN"===a.tagName&&(a.textContent=o),e.value?p.classList.add("is-filled"):p.classList.remove("is-filled"),t.forEach(e=>{e.setAttribute("aria-selected","false")}),n.setAttribute("aria-selected","true")}}};l(d,"change",O),l(d,"input",O);const $=d.closest("form");if($){l($,"reset",()=>{setTimeout(()=>{O()},0)})}}(n,c,l,u)})}return"loading"===document.readyState?(o.domContentLoadedHandler=d,document.addEventListener("DOMContentLoaded",o.domContentLoadedHandler)):d(),window.initCustomSelects=d,{result:"select initialized",destroy:()=>{o.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",o.domContentLoadedHandler),o.domContentLoadedHandler=null),o.observers.forEach(e=>e.disconnect()),o.observers.length=0,o.timeouts.forEach(e=>clearTimeout(e)),o.timeouts.length=0,o.handlers.forEach(({element:e,event:t,handler:n,options:o})=>{e.removeEventListener(t,n,o)}),o.handlers.length=0,window.initCustomSelects&&delete window.initCustomSelects}}}async function d(e){const t={destroyFunctions:[]};try{const o=function(e){const t=n(e,"states");return t.forEach(e=>{const t=e;if("SELECT"!==t.tagName)return void console.warn('[select-states] data-hs-form-select="states" must be on a <select> element',t);const n=t.querySelectorAll("option");if(1!==n.length)return void console.warn("[select-states] Select must have exactly 1 default template option (placeholder). Found:",n.length,t);const o=n[0];if(""!==o.value)return void console.warn("[select-states] Template option must have empty value for placeholder. Found value:",o.value,t);const a=o.textContent;t.innerHTML="";const r=document.createElement("option");r.value="",r.textContent=a,t.appendChild(r),c.forEach(e=>{const n=document.createElement("option");n.value=e.value,n.textContent=e.name,t.appendChild(n)})}),{result:`states initialized on ${t.length} select${1!==t.length?"s":""}`,destroy:()=>{}}}(e.states);o?.destroy&&t.destroyFunctions.push(o.destroy);const a=u(e["custom-select"]);return a?.destroy&&t.destroyFunctions.push(a.destroy),{result:"select initialized",destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[select] Error during cleanup:",t)}}),t.destroyFunctions.length=0}}}catch(o){throw console.error("[select] Initialization failed:",o),t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[select] Error during error cleanup:",t)}}),o}}async function m(){const a=e.structure.form,r={destroyFunctions:[]},s=o(a.honeypot,"form-handler");if(document.querySelector(s))try{const e=function(e){const n={honeypotHandler:null},o=n=>{const o=n.target;if("FORM"!==o.tagName)return;const a=t(e,"form-handler",o);return a&&a.value?(n.preventDefault(),n.stopPropagation(),n.stopImmediatePropagation(),!1):void 0};return n.honeypotHandler=o,document.addEventListener("submit",o,!0),{result:"honeypot initialized",destroy:()=>{n.honeypotHandler&&(document.removeEventListener("submit",n.honeypotHandler,!0),n.honeypotHandler=null)}}}(a.honeypot);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing honeypot:",m)}const i=o(a.range,"wrapper");if(document.querySelector(i))try{const e=l(a.range);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing range:",m)}const c=o(a.test,"wrapper");if(document.querySelector(c))try{const e=function(e){const o={handlers:[]},a=(e,t,n,a)=>{e.addEventListener(t,n,a),o.handlers.push({element:e,event:t,handler:n,options:a})},r=n(e,"wrapper");return r.forEach(n=>{const o=n.querySelector("form");if(!o)return void console.warn('[form-test] No <form> element found within data-hs-form-test="wrapper"',n);const r=t(e,"info",n),s=()=>{const e=new FormData(o),t={};for(const[n,o]of e.entries())t[n]=o;if(r){const e=document.createElement("pre");e.textContent=JSON.stringify(t,null,2),r.innerHTML="",r.appendChild(document.createTextNode("Test mode active - Live form data:")),r.appendChild(e)}};r&&(r.textContent="Test mode active, preventing native submissions",s()),a(o,"input",s),a(o,"change",s);const i=o.querySelector('button[type="submit"], input[type="submit"]')||o.querySelector("button:not([type])");i&&a(i,"click",()=>{console.log("[form-test] Submit button clicked"),requestAnimationFrame(()=>{o.checkValidity()||console.log("[form-test] Browser blocked submission - validation failed")})}),a(o,"submit",e=>{e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),console.log("[form-test] Submission prevented - displaying test results");const t=new FormData(o),n={};for(const[o,r]of t.entries())n[o]=r;const a=`✅ Form would submit successfully at ${(new Date).toLocaleTimeString()}`;if(r){const e=document.createElement("pre");e.textContent=JSON.stringify(n,null,2),r.innerHTML="",r.appendChild(document.createTextNode(a)),r.appendChild(e)}else console.log(a),console.log("Form data:",n);return!1},!0)}),{result:`test initialized on ${r.length} form${1!==r.length?"s":""}`,destroy:()=>{o.handlers.forEach(({element:e,event:t,handler:n,options:o})=>{e.removeEventListener(t,n,o)}),o.handlers.length=0}}}(a.test);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing test:",m)}const u=o(a.select,"wrapper");if(document.querySelector(u))try{const e=await d(a.select);e?.destroy&&r.destroyFunctions.push(e.destroy)}catch(m){console.error("[form] Error initializing select:",m)}return{result:`form initialized (${r.destroyFunctions.length} modules active)`,destroy:()=>{r.destroyFunctions.forEach(e=>{try{e()}catch(m){console.error("[form] Error during cleanup:",m)}}),r.destroyFunctions.length=0}}}export{m as init};
2
- //# sourceMappingURL=hs-form-COFGgawz.js.map
Binary file
@@ -1 +0,0 @@
1
- {"version":3,"file":"hs-form-COFGgawz.js","sources":["../../src/modules/structure/functions/form/functions/range.ts","../../src/modules/structure/functions/form/functions/select/functions/states.ts","../../src/modules/structure/functions/form/functions/select/functions/custom-select.ts","../../src/modules/structure/functions/form/functions/select/select.ts","../../src/modules/structure/functions/form/form.ts","../../src/modules/structure/functions/form/functions/honeypot.ts","../../src/modules/structure/functions/form/functions/test.ts"],"sourcesContent":["/**\n * Range Slider Component\n *\n * Custom range slider that syncs with native <input type=\"range\"> for proper form submission.\n * Automatically updates output display and sets CSS custom property for progress styling.\n *\n * Features:\n * - Calculates normalized progress (0-1) from min/max values\n * - Sets CSS custom property (--_hs---progress) on wrapper\n * - Updates optional output element with current value\n * - Prevents duplicate initialization with dataset flag\n * - Works with negative min values and custom step sizes\n *\n * HTML Structure:\n * <div data-hs-form-range=\"wrapper\">\n * <input type=\"range\" min=\"0\" max=\"100\" value=\"50\">\n * <span data-hs-form-range=\"output\">50</span>\n * </div>\n *\n * CSS Usage:\n * .range-fill { width: calc(var(--_hs---progress) * 100%); }\n */\n\nimport { querySelectorAll, querySelector } from '@utils';\nimport globalConfig from '@config';\n\ninterface ModuleConfig {\n attributes: {\n elements: Record<string, { primary: string; aliases?: string[] }>;\n };\n cssVars?: {\n progress?: string;\n };\n}\n\nexport function init(config: ModuleConfig) {\n // Centralized cleanup tracking\n const cleanup = {\n handlers: [],\n domContentLoadedHandler: null,\n };\n\n const addHandler = (element: Element, event: string, handler: EventListener) => {\n element.addEventListener(event, handler);\n cleanup.handlers.push({ element, event, handler });\n };\n\n // Helper: Get CSS var name with global prefix\n function getProgressVarName(): string {\n const prefix = globalConfig._global.cssVars.prefix;\n const varName = config.cssVars?.progress || 'progress';\n return `${prefix}${varName}`;\n }\n\n // Initialize all range components\n function initRangeComponents() {\n const rangeWrappers = querySelectorAll(config, 'wrapper');\n\n rangeWrappers.forEach((wrapper) => {\n const htmlWrapper = wrapper as HTMLElement;\n // Prevent duplicate initialization\n if (htmlWrapper.dataset.hsFormRangeInit) return;\n htmlWrapper.dataset.hsFormRangeInit = 'true';\n\n initSingleRange(htmlWrapper, addHandler);\n });\n }\n\n // Initialize a single range component\n function initSingleRange(\n wrapper: HTMLElement,\n addHandler: (element: Element, event: string, handler: EventListener) => void\n ) {\n const input = wrapper.querySelector(\"input[type='range']\") as HTMLInputElement;\n if (!input) {\n console.warn('[range] Missing <input type=\"range\"> element in wrapper', wrapper);\n return;\n }\n\n const output = querySelector(config, 'output', wrapper);\n\n // Update function\n const update = () => {\n const min = input.min ? +input.min : 0;\n const max = input.max ? +input.max : 100;\n const val = +input.value || min;\n const progress = (val - min) / (max - min);\n\n // Set CSS custom property using global config\n wrapper.style.setProperty(getProgressVarName(), String(progress));\n\n // Update output text if exists\n if (output) {\n output.textContent = String(val);\n }\n };\n\n // Add input event listener\n addHandler(input, 'input', update);\n\n // Initialize on load\n update();\n }\n\n // Initialize on DOM ready\n if (document.readyState === 'loading') {\n cleanup.domContentLoadedHandler = initRangeComponents;\n document.addEventListener('DOMContentLoaded', cleanup.domContentLoadedHandler);\n } else {\n initRangeComponents();\n }\n\n return {\n result: 'range initialized',\n destroy: () => {\n // Remove DOMContentLoaded listener\n if (cleanup.domContentLoadedHandler) {\n document.removeEventListener('DOMContentLoaded', cleanup.domContentLoadedHandler);\n cleanup.domContentLoadedHandler = null;\n }\n\n // Remove all event listeners\n cleanup.handlers.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n cleanup.handlers.length = 0;\n\n // Remove init flags\n const rangeWrappers = querySelectorAll(config, 'wrapper');\n rangeWrappers.forEach((wrapper) => {\n delete (wrapper as HTMLElement).dataset.hsFormRangeInit;\n });\n },\n };\n}\n","/**\n * US States Select Populator\n *\n * Automatically populates a <select> element with all 50 US states.\n * Maintains the existing placeholder option and adds state options dynamically.\n *\n * Features:\n * - Auto-populates all 50 US states (full names + abbreviations)\n * - Preserves placeholder option (must have empty value)\n * - Validates select has exactly 1 template option\n * - State values use standard 2-letter abbreviations (CA, NY, TX, etc.)\n * - Works with both native and custom select components\n *\n * HTML Structure:\n * <select data-hs-form-select=\"states\">\n * <option value=\"\">Select a state</option>\n * </select>\n *\n * Result:\n * <select data-hs-form-select=\"states\">\n * <option value=\"\">Select a state</option>\n * <option value=\"AL\">Alabama</option>\n * <option value=\"AK\">Alaska</option>\n * ...all 50 states...\n * </select>\n *\n * Validation:\n * - Must be applied to <select> element\n * - Must have exactly 1 existing option (placeholder)\n * - Placeholder must have empty value=\"\"\n */\n\nimport { querySelectorAll } from '@utils';\n\nconst US_STATES = [\n { name: 'Alabama', value: 'AL' },\n { name: 'Alaska', value: 'AK' },\n { name: 'Arizona', value: 'AZ' },\n { name: 'Arkansas', value: 'AR' },\n { name: 'California', value: 'CA' },\n { name: 'Colorado', value: 'CO' },\n { name: 'Connecticut', value: 'CT' },\n { name: 'Delaware', value: 'DE' },\n { name: 'Florida', value: 'FL' },\n { name: 'Georgia', value: 'GA' },\n { name: 'Hawaii', value: 'HI' },\n { name: 'Idaho', value: 'ID' },\n { name: 'Illinois', value: 'IL' },\n { name: 'Indiana', value: 'IN' },\n { name: 'Iowa', value: 'IA' },\n { name: 'Kansas', value: 'KS' },\n { name: 'Kentucky', value: 'KY' },\n { name: 'Louisiana', value: 'LA' },\n { name: 'Maine', value: 'ME' },\n { name: 'Maryland', value: 'MD' },\n { name: 'Massachusetts', value: 'MA' },\n { name: 'Michigan', value: 'MI' },\n { name: 'Minnesota', value: 'MN' },\n { name: 'Mississippi', value: 'MS' },\n { name: 'Missouri', value: 'MO' },\n { name: 'Montana', value: 'MT' },\n { name: 'Nebraska', value: 'NE' },\n { name: 'Nevada', value: 'NV' },\n { name: 'New Hampshire', value: 'NH' },\n { name: 'New Jersey', value: 'NJ' },\n { name: 'New Mexico', value: 'NM' },\n { name: 'New York', value: 'NY' },\n { name: 'North Carolina', value: 'NC' },\n { name: 'North Dakota', value: 'ND' },\n { name: 'Ohio', value: 'OH' },\n { name: 'Oklahoma', value: 'OK' },\n { name: 'Oregon', value: 'OR' },\n { name: 'Pennsylvania', value: 'PA' },\n { name: 'Rhode Island', value: 'RI' },\n { name: 'South Carolina', value: 'SC' },\n { name: 'South Dakota', value: 'SD' },\n { name: 'Tennessee', value: 'TN' },\n { name: 'Texas', value: 'TX' },\n { name: 'Utah', value: 'UT' },\n { name: 'Vermont', value: 'VT' },\n { name: 'Virginia', value: 'VA' },\n { name: 'Washington', value: 'WA' },\n { name: 'West Virginia', value: 'WV' },\n { name: 'Wisconsin', value: 'WI' },\n { name: 'Wyoming', value: 'WY' },\n];\n\nexport function init(config) {\n // Find all select elements with data-hs-form-select=\"states\"\n const stateSelects = querySelectorAll(config, 'states');\n\n stateSelects.forEach((selectElement) => {\n const select = selectElement as HTMLSelectElement;\n if (select.tagName !== 'SELECT') {\n console.warn(\n '[select-states] data-hs-form-select=\"states\" must be on a <select> element',\n select\n );\n return;\n }\n\n const existingOptions = select.querySelectorAll('option') as NodeListOf<HTMLOptionElement>;\n\n // Validate: Must have exactly 1 option (placeholder template)\n if (existingOptions.length !== 1) {\n console.warn(\n '[select-states] Select must have exactly 1 default template option (placeholder). Found:',\n existingOptions.length,\n select\n );\n return;\n }\n\n const templateOption = existingOptions[0];\n\n // Validate: Template option must have empty value\n if (templateOption.value !== '') {\n console.warn(\n '[select-states] Template option must have empty value for placeholder. Found value:',\n templateOption.value,\n select\n );\n return;\n }\n\n // Store placeholder text and clear select\n const placeholderText = templateOption.textContent;\n select.innerHTML = '';\n\n // Re-create placeholder as first option\n const placeholder = document.createElement('option');\n placeholder.value = '';\n placeholder.textContent = placeholderText;\n select.appendChild(placeholder);\n\n // Add all 50 states after placeholder\n US_STATES.forEach((state) => {\n const option = document.createElement('option');\n option.value = state.value;\n option.textContent = state.name;\n select.appendChild(option);\n });\n });\n\n return {\n result: `states initialized on ${stateSelects.length} select${stateSelects.length !== 1 ? 's' : ''}`,\n destroy: () => {\n // No cleanup needed - states are just populated into native select\n },\n };\n}\n","/**\n * Custom Select Component\n *\n * Transforms native <select> elements into fully accessible custom dropdowns.\n * Maintains sync with native select for proper form submission and accessibility.\n *\n * Features:\n * - Full keyboard navigation (Arrow keys, Home/End, Enter, Space, Escape)\n * - Typeahead search (type letters to jump to options)\n * - ARIA-compliant with screen reader support\n * - Syncs with native select value changes and form resets\n * - Disabled state support with mutation observer\n * - Optional height animation with GSAP\n * - Modal scroll prevention when open\n * - Click outside to close\n * - Auto-unwraps Webflow component slot divs\n *\n * HTML Structure:\n * <div data-hs-form-select=\"wrapper\">\n * <label>Choose option</label>\n * <select name=\"example\">\n * <option value=\"\">Select...</option>\n * <option value=\"1\">Option 1</option>\n * </select>\n * <button data-hs-form-select=\"button\">\n * <span>Placeholder text</span>\n * </button>\n * <div data-hs-height=\"element\">\n * <div data-hs-form-select=\"list\">\n * <div role=\"option\"><span>Template</span></div>\n * </div>\n * </div>\n * </div>\n *\n * Keyboard Controls:\n * - Space/Enter (button): Open dropdown\n * - Arrow Up/Down: Navigate options\n * - Home/End: Jump to first/last option\n * - Escape: Close dropdown\n * - Type letters: Typeahead search\n *\n * Accessibility:\n * - Native select hidden but kept for form submission\n * - Custom UI uses role=\"combobox\" and role=\"listbox\"\n * - aria-expanded, aria-selected, aria-activedescendant\n * - Label properly connected to native select\n */\n\nimport {\n querySelectorAll,\n querySelector,\n animateHeight,\n setHeight,\n openModal,\n closeModal,\n} from '@utils';\n\nexport function init(config) {\n // Centralized cleanup tracking\n const cleanup = {\n observers: [] as MutationObserver[],\n handlers: [] as Array<{\n element: Element | Document;\n event: string;\n handler: EventListener;\n options?: boolean | AddEventListenerOptions;\n }>,\n timeouts: [] as number[],\n domContentLoadedHandler: null as (() => void) | null,\n };\n\n const addObserver = (observer: MutationObserver) => cleanup.observers.push(observer);\n const addHandler = (\n element: Element | Document,\n event: string,\n handler: EventListener,\n options?: boolean | AddEventListenerOptions\n ) => {\n element.addEventListener(event, handler, options);\n cleanup.handlers.push({ element, event, handler, options });\n };\n const addTimeout = (timeoutId: number) => cleanup.timeouts.push(timeoutId);\n\n // Initialize all custom selects on the page\n function initCustomSelects() {\n // Unwrap any divs inside select elements (Webflow component slots)\n document.querySelectorAll('select > div').forEach((div) => {\n const select = div.parentElement;\n while (div.firstChild) {\n select.appendChild(div.firstChild);\n }\n div.remove();\n });\n\n const selectWrappers = querySelectorAll(config, 'wrapper');\n\n selectWrappers.forEach((wrapper) => {\n initSingleSelect(wrapper, addHandler, addObserver, addTimeout);\n });\n }\n\n // Initialize a single custom select\n function initSingleSelect(\n wrapper: Element,\n addHandler: (\n element: Element | Document,\n event: string,\n handler: EventListener,\n options?: boolean | AddEventListenerOptions\n ) => void,\n addObserver: (observer: MutationObserver) => void,\n addTimeout: (timeoutId: number) => void\n ) {\n // Find all required elements\n const realSelect = wrapper.querySelector('select') as HTMLSelectElement;\n if (!realSelect) {\n console.warn('[select] Missing <select> element in custom select wrapper', wrapper);\n return;\n }\n\n // Hide real select from screen readers since custom UI provides accessible alternative\n realSelect.setAttribute('aria-hidden', 'true');\n realSelect.setAttribute('tabindex', '-1');\n\n const selectName = realSelect.getAttribute('name') || 'custom-select';\n const customList = querySelector(config, 'list', wrapper) as HTMLElement;\n const button = querySelector(config, 'button', wrapper) as HTMLButtonElement;\n\n if (!customList || !button) {\n console.warn(\n '[select] Missing required elements (list or button) in custom select wrapper',\n wrapper\n );\n return;\n }\n\n // Sync disabled state from native select\n function updateDisabledState() {\n if (realSelect.disabled) {\n button.disabled = true;\n button.setAttribute('aria-disabled', 'true');\n } else {\n button.disabled = false;\n button.removeAttribute('aria-disabled');\n }\n }\n updateDisabledState();\n\n // Get and clone the option template\n const optionTemplate = customList.firstElementChild;\n if (!optionTemplate) {\n console.warn('[select] Missing option template in custom select list', wrapper);\n return;\n }\n\n const templateClone = optionTemplate.cloneNode(true);\n optionTemplate.remove();\n\n // Build options from real select\n const realOptions = realSelect.querySelectorAll('option');\n realOptions.forEach((option: HTMLOptionElement, index: number) => {\n const optionElement = templateClone.cloneNode(true) as HTMLElement;\n const textSpan = optionElement.querySelector('span');\n\n if (textSpan) {\n textSpan.textContent = option.textContent;\n }\n\n // Add attributes\n optionElement.setAttribute('data-value', option.value);\n optionElement.setAttribute('role', 'option');\n optionElement.setAttribute('id', `${selectName}-option-${index}`);\n optionElement.setAttribute('tabindex', '-1');\n\n // Set selected state if this option is selected\n if (option.selected) {\n optionElement.setAttribute('aria-selected', 'true');\n // Update button text\n const buttonText = button.querySelector('span') || button;\n if (buttonText.tagName === 'SPAN') {\n buttonText.textContent = option.textContent;\n }\n // Set initial is-filled state based on value\n if (option.value) {\n button.classList.add('is-filled');\n } else {\n button.classList.remove('is-filled');\n }\n } else {\n optionElement.setAttribute('aria-selected', 'false');\n }\n\n customList.appendChild(optionElement);\n });\n\n // Add ARIA attributes\n customList.setAttribute('role', 'listbox');\n customList.setAttribute('id', `${selectName}-listbox`);\n customList.setAttribute('tabindex', '-1');\n customList.setAttribute('aria-hidden', 'true'); // Initial state: hidden\n customList.inert = true; // Prevent keyboard/mouse interaction when closed\n\n button.setAttribute('role', 'combobox');\n button.setAttribute('aria-haspopup', 'listbox');\n button.setAttribute('aria-controls', `${selectName}-listbox`);\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('id', `${selectName}-button`);\n\n // Find and connect label if exists\n const label =\n wrapper.querySelector('label') || document.querySelector(`label[for=\"${realSelect.id}\"]`);\n if (label) {\n const labelId = label.id || `${selectName}-label`;\n label.id = labelId;\n // Ensure real select has proper ID for label connection\n if (!realSelect.id) {\n realSelect.id = `${selectName}-select`;\n }\n label.setAttribute('for', realSelect.id);\n button.setAttribute('aria-labelledby', labelId);\n }\n\n // Check for visual height wrapper (optional)\n // Only animate if data-hs-height=\"element\" exists in wrapper\n const heightElement = wrapper.querySelector('[data-hs-height=\"element\"]');\n const animationTarget = heightElement || null;\n\n // Track state\n let searchString = '';\n let searchTimeout: number | null = null;\n let enterPressed = false;\n\n // Function to check if select is open\n function isSelectOpen() {\n return wrapper.classList.contains('is-active');\n }\n\n // Update ARIA states based on current visual state\n function updateARIAStates() {\n const isCurrentlyOpen = isSelectOpen();\n const wasOpen = button.getAttribute('aria-expanded') === 'true';\n\n // If closing and focus is inside list, return focus first\n if (wasOpen && !isCurrentlyOpen && customList.contains(document.activeElement)) {\n button.focus();\n }\n\n // Update ARIA attributes\n button.setAttribute('aria-expanded', isCurrentlyOpen ? 'true' : 'false');\n customList.setAttribute('aria-hidden', isCurrentlyOpen ? 'false' : 'true');\n customList.inert = !isCurrentlyOpen; // Enable/disable interaction\n\n if (isCurrentlyOpen) {\n // Make all options tabbable when opened\n const options = customList.querySelectorAll('[role=\"option\"]');\n options.forEach((opt) => {\n opt.setAttribute('tabindex', '0');\n });\n\n // Register with modal manager to prevent body scroll (only when opening)\n if (!wasOpen) {\n openModal();\n }\n } else {\n // Reset on close\n button.removeAttribute('aria-activedescendant');\n const options = customList.querySelectorAll('[role=\"option\"]');\n options.forEach((opt) => {\n opt.setAttribute('tabindex', '-1');\n });\n\n // Unregister with modal manager to restore body scroll (only when closing)\n if (wasOpen) {\n closeModal();\n }\n }\n\n // Animate height if configured\n if (animationTarget) {\n animateHeight(animationTarget, isCurrentlyOpen, { duration: 300, ease: 'power2.inOut' });\n }\n }\n\n // Set initial height without animation (if configured)\n if (animationTarget) {\n setHeight(animationTarget, isSelectOpen());\n }\n\n // Set initial ARIA states\n updateARIAStates();\n\n // Focus option by index\n function focusOption(index: number) {\n const options = customList.querySelectorAll('[role=\"option\"]') as NodeListOf<HTMLElement>;\n if (index < 0 || index >= options.length) return;\n\n // Remove previous focus\n options.forEach((opt) => {\n opt.classList.remove('focused');\n opt.setAttribute('tabindex', '-1');\n });\n\n // Add new focus\n options[index].classList.add('focused');\n options[index].setAttribute('tabindex', '0');\n options[index].focus();\n button.setAttribute('aria-activedescendant', options[index].id);\n }\n\n // Typeahead search functionality\n function handleTypeahead(key: string) {\n // Only handle printable characters (single character keys)\n if (key.length !== 1) return false;\n\n // Clear existing timeout\n if (searchTimeout !== null) {\n clearTimeout(searchTimeout);\n // Remove from cleanup tracking\n const index = cleanup.timeouts.indexOf(searchTimeout);\n if (index > -1) cleanup.timeouts.splice(index, 1);\n }\n\n // Get all options\n const options = Array.from(customList.querySelectorAll('[role=\"option\"]'));\n if (options.length === 0) return false;\n\n // Append to search string\n searchString += key.toLowerCase();\n\n // Find currently focused option index\n const currentIndex = options.findIndex((opt) => opt.classList.contains('focused'));\n\n // If repeating single letter, cycle through options starting with that letter\n if (\n searchString.length === 1 ||\n searchString.split('').every((char) => char === searchString[0])\n ) {\n const letter = searchString[0];\n let startIndex = currentIndex + 1;\n\n // Search from next option onwards\n for (let i = 0; i < options.length; i++) {\n const index = (startIndex + i) % options.length;\n const text = (\n options[index].querySelector('span')?.textContent || options[index].textContent\n ).toLowerCase();\n if (text.startsWith(letter)) {\n focusOption(index);\n if (!isSelectOpen()) wrapper.classList.add('is-active'); // Open if closed\n searchTimeout = setTimeout(clearSearch, 500);\n addTimeout(searchTimeout);\n return true;\n }\n }\n } else {\n // Multi-character search - find first match starting with search string\n const matchIndex = options.findIndex((opt) => {\n const text = (opt.querySelector('span')?.textContent || opt.textContent).toLowerCase();\n return text.startsWith(searchString);\n });\n\n if (matchIndex !== -1) {\n focusOption(matchIndex);\n if (!isSelectOpen()) wrapper.classList.add('is-active'); // Open if closed\n searchTimeout = setTimeout(clearSearch, 500);\n addTimeout(searchTimeout);\n return true;\n }\n }\n\n // Reset timeout even if no match found\n searchTimeout = setTimeout(clearSearch, 500);\n addTimeout(searchTimeout);\n return false;\n }\n\n // Clear search string\n function clearSearch() {\n searchString = '';\n searchTimeout = null;\n }\n\n // Select option\n function selectOption(optionElement: HTMLElement) {\n const value = optionElement.getAttribute('data-value') || '';\n const text = optionElement.querySelector('span')?.textContent || optionElement.textContent;\n\n // Update real select\n realSelect.value = value;\n realSelect.dispatchEvent(new Event('change', { bubbles: true }));\n\n // Update button text\n const buttonText = button.querySelector('span') || button;\n if (buttonText.tagName === 'SPAN') {\n buttonText.textContent = text;\n }\n\n // Update is-filled class based on value\n if (value) {\n button.classList.add('is-filled');\n } else {\n button.classList.remove('is-filled');\n }\n\n // Update aria-selected\n customList.querySelectorAll('[role=\"option\"]').forEach((opt) => {\n opt.setAttribute('aria-selected', 'false');\n });\n optionElement.setAttribute('aria-selected', 'true');\n\n // Close dropdown by toggling wrapper\n wrapper.classList.remove('is-active');\n }\n\n // Button click handler\n const buttonClickHandler = (e: Event) => {\n // If Enter was pressed, don't toggle - allow form submission\n if (enterPressed) {\n enterPressed = false;\n return;\n }\n e.preventDefault();\n wrapper.classList.toggle('is-active');\n };\n addHandler(button, 'click', buttonClickHandler);\n\n // Button keyboard events\n const buttonKeydownHandler = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n // Find the form's submit button and click it\n const formElement = button.closest('form');\n if (formElement) {\n const submitButton = (formElement.querySelector(\n 'button[type=\"submit\"], input[type=\"submit\"]'\n ) || formElement.querySelector('button:not([type])')) as HTMLElement | null;\n if (submitButton) {\n submitButton.click();\n }\n }\n break;\n\n case ' ':\n e.preventDefault();\n wrapper.classList.toggle('is-active');\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n if (!isSelectOpen()) {\n wrapper.classList.add('is-active');\n // Wait for dropdown to open, then focus first option\n requestAnimationFrame(() => {\n focusOption(0);\n });\n } else {\n focusOption(0);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isSelectOpen()) {\n wrapper.classList.add('is-active');\n // Wait for dropdown to open, then focus first option (matches native)\n requestAnimationFrame(() => {\n focusOption(0);\n });\n } else {\n const options = customList.querySelectorAll('[role=\"option\"]');\n focusOption(options.length - 1);\n }\n break;\n\n case 'Escape':\n if (isSelectOpen()) {\n e.preventDefault();\n wrapper.classList.remove('is-active');\n }\n break;\n\n case 'Home':\n e.preventDefault();\n if (!isSelectOpen()) {\n wrapper.classList.add('is-active');\n }\n focusOption(0);\n break;\n\n case 'End':\n e.preventDefault();\n if (!isSelectOpen()) {\n wrapper.classList.add('is-active');\n }\n const endOptions = customList.querySelectorAll('[role=\"option\"]');\n focusOption(endOptions.length - 1);\n break;\n\n default:\n // Handle typeahead search\n if (handleTypeahead(e.key)) {\n e.preventDefault();\n }\n break;\n }\n };\n addHandler(button, 'keydown', buttonKeydownHandler);\n\n // Option keyboard events (delegated)\n const listKeydownHandler = (e: KeyboardEvent) => {\n const option = (e.target as Element).closest('[role=\"option\"]') as HTMLElement | null;\n if (!option) return;\n\n const options = Array.from(customList.querySelectorAll('[role=\"option\"]'));\n const currentIdx = options.indexOf(option);\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (currentIdx < options.length - 1) {\n focusOption(currentIdx + 1);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (currentIdx > 0) {\n focusOption(currentIdx - 1);\n }\n // Stay on first option if already there (matches native)\n break;\n\n case 'Enter':\n e.preventDefault();\n selectOption(option);\n break;\n\n case 'Escape':\n e.preventDefault();\n wrapper.classList.remove('is-active');\n button.focus();\n break;\n\n case 'Home':\n e.preventDefault();\n focusOption(0);\n break;\n\n case 'End':\n e.preventDefault();\n focusOption(options.length - 1);\n break;\n\n default:\n // Handle typeahead search\n if (handleTypeahead(e.key)) {\n e.preventDefault();\n }\n break;\n }\n };\n addHandler(customList, 'keydown', listKeydownHandler);\n\n // Option click events\n const listClickHandler = (e: MouseEvent) => {\n const option = (e.target as Element).closest('[role=\"option\"]') as HTMLElement | null;\n if (option) {\n selectOption(option);\n }\n };\n addHandler(customList, 'click', listClickHandler);\n\n // Handle tabbing out of select list\n const listFocusoutHandler = (e: FocusEvent) => {\n // Check if focus is moving outside the wrapper (or to browser chrome)\n if (\n (!e.relatedTarget || !wrapper.contains(e.relatedTarget as Node)) &&\n wrapper.classList.contains('is-active')\n ) {\n wrapper.classList.remove('is-active'); // Close the dropdown\n }\n };\n addHandler(customList, 'focusout', listFocusoutHandler);\n\n // Handle clicks outside to close dropdown\n const documentClickHandler = (e: MouseEvent) => {\n // If dropdown is open and click is outside wrapper, close it\n if (wrapper.classList.contains('is-active') && !wrapper.contains(e.target as Node)) {\n wrapper.classList.remove('is-active');\n }\n };\n addHandler(document, 'click', documentClickHandler);\n\n // Monitor for class changes on wrapper and update ARIA states\n const observer = new MutationObserver(() => {\n updateARIAStates();\n });\n\n observer.observe(wrapper, {\n attributes: true,\n attributeFilter: ['class'],\n });\n addObserver(observer);\n\n // Observe native select for disabled attribute changes\n const disabledObserver = new MutationObserver(() => {\n updateDisabledState();\n });\n disabledObserver.observe(realSelect, {\n attributes: true,\n attributeFilter: ['disabled'],\n });\n addObserver(disabledObserver);\n\n // Sync with real select changes\n const selectChangeHandler = () => {\n const selectedOption = realSelect.options[realSelect.selectedIndex];\n if (selectedOption) {\n const options = customList.querySelectorAll('[role=\"option\"]');\n const customOption = Array.from(options).find(\n (opt) => opt.getAttribute('data-value') === selectedOption.value\n );\n if (customOption) {\n // Update button text\n const text = customOption.querySelector('span')?.textContent || customOption.textContent;\n const buttonText = button.querySelector('span') || button;\n if (buttonText.tagName === 'SPAN') {\n buttonText.textContent = text;\n }\n\n // Update is-filled class based on value\n if (selectedOption.value) {\n button.classList.add('is-filled');\n } else {\n button.classList.remove('is-filled');\n }\n\n // Update aria-selected\n options.forEach((opt) => {\n opt.setAttribute('aria-selected', 'false');\n });\n customOption.setAttribute('aria-selected', 'true');\n }\n }\n };\n addHandler(realSelect, 'change', selectChangeHandler);\n addHandler(realSelect, 'input', selectChangeHandler);\n\n // Handle form reset\n const form = realSelect.closest('form') as HTMLFormElement | null;\n if (form) {\n const formResetHandler = () => {\n // Native select resets on next tick\n setTimeout(() => {\n selectChangeHandler();\n }, 0);\n };\n addHandler(form, 'reset', formResetHandler);\n }\n }\n\n // Initialize on DOM ready\n if (document.readyState === 'loading') {\n cleanup.domContentLoadedHandler = initCustomSelects;\n document.addEventListener('DOMContentLoaded', cleanup.domContentLoadedHandler);\n } else {\n initCustomSelects();\n }\n\n // INTERNAL API: Exposed for dynamic content reinitialization\n // WARNING: This is an internal API and may change without notice\n // Use window.hsmain.form.reinit() instead (if available in future versions)\n (window as any).initCustomSelects = initCustomSelects;\n\n return {\n result: 'select initialized',\n destroy: () => {\n // Remove DOMContentLoaded listener\n if (cleanup.domContentLoadedHandler) {\n document.removeEventListener('DOMContentLoaded', cleanup.domContentLoadedHandler);\n cleanup.domContentLoadedHandler = null;\n }\n\n // Disconnect all observers\n cleanup.observers.forEach((obs) => obs.disconnect());\n cleanup.observers.length = 0;\n\n // Clear all timeouts\n cleanup.timeouts.forEach((timeoutId) => clearTimeout(timeoutId));\n cleanup.timeouts.length = 0;\n\n // Remove all event listeners\n cleanup.handlers.forEach(({ element, event, handler, options }) => {\n element.removeEventListener(event, handler, options);\n });\n cleanup.handlers.length = 0;\n\n // Remove window API\n if ((window as any).initCustomSelects) {\n delete (window as any).initCustomSelects;\n }\n },\n };\n}\n","/**\n * Select Orchestrator\n *\n * Coordinates initialization of select enhancement functions in proper sequence.\n * Ensures states populate before custom UI is created.\n *\n * Features:\n * - Sequential initialization (states → custom-select)\n * - Error handling with partial cleanup\n * - Centralized cleanup/destroy management\n * - Passes individual configs to sub-functions\n *\n * Initialization Order:\n * 1. states - Populates native <select> with US states\n * 2. custom-select - Creates custom UI over native select\n *\n * This order is critical: custom-select needs to read the populated\n * options from the native select that states creates.\n */\nimport { init as statesInit } from './functions/states.ts';\nimport { init as customSelectInit } from './functions/custom-select.ts';\n\nexport async function init(selectConfig: any) {\n const cleanup = { destroyFunctions: [] as Array<() => void> };\n\n try {\n // IMPORTANT: Load states FIRST to populate native select,\n // then load custom-select to create custom UI\n const statesResult = statesInit(selectConfig.states);\n if (statesResult?.destroy) cleanup.destroyFunctions.push(statesResult.destroy);\n\n const customSelectResult = customSelectInit(selectConfig['custom-select']);\n if (customSelectResult?.destroy) cleanup.destroyFunctions.push(customSelectResult.destroy);\n\n return {\n result: 'select initialized',\n destroy: () => {\n cleanup.destroyFunctions.forEach((destroyFn) => {\n try {\n destroyFn();\n } catch (error) {\n console.error('[select] Error during cleanup:', error);\n }\n });\n cleanup.destroyFunctions.length = 0;\n },\n };\n } catch (error) {\n console.error('[select] Initialization failed:', error);\n // Cleanup any partial initialization\n cleanup.destroyFunctions.forEach((fn) => {\n try {\n fn();\n } catch (cleanupError) {\n console.error('[select] Error during error cleanup:', cleanupError);\n }\n });\n throw error;\n }\n}\n","/**\n * Form Orchestrator\n *\n * Loads form enhancement modules based on element presence.\n * Static imports ensure all modules bundle into single file.\n *\n * Features:\n * - Conditional initialization based on element presence\n * - Centralized cleanup management\n * - Single bundled output file\n *\n * Modules:\n * - honeypot: Spam prevention for forms\n * - range: Range slider with CSS custom properties\n * - test: Development mode form testing\n * - select: Custom select UI (handles states dependency internally)\n */\n\nimport config from '@config';\nimport { getSelector, type ModuleConfig } from '@utils';\nimport { init as honeypotInit } from './functions/honeypot.ts';\nimport { init as rangeInit } from './functions/range.ts';\nimport { init as testInit } from './functions/test.ts';\nimport { init as selectInit } from './functions/select/select.ts';\n\nexport async function init() {\n const moduleConfig = config.structure.form;\n const cleanup = {\n destroyFunctions: [] as Array<() => void>,\n };\n\n // Initialize honeypot if form-handler exists\n const honeypotSelector = getSelector(moduleConfig.honeypot as ModuleConfig, 'form-handler');\n if (document.querySelector(honeypotSelector)) {\n try {\n const result = honeypotInit(moduleConfig.honeypot);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[form] Error initializing honeypot:', error);\n }\n }\n\n // Initialize range if wrapper exists\n const rangeSelector = getSelector(moduleConfig.range as ModuleConfig, 'wrapper');\n if (document.querySelector(rangeSelector)) {\n try {\n const result = rangeInit(moduleConfig.range as any);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[form] Error initializing range:', error);\n }\n }\n\n // Initialize test if wrapper exists\n const testSelector = getSelector(moduleConfig.test as ModuleConfig, 'wrapper');\n if (document.querySelector(testSelector)) {\n try {\n const result = testInit(moduleConfig.test);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[form] Error initializing test:', error);\n }\n }\n\n // Initialize select if wrapper exists\n const selectSelector = getSelector(moduleConfig.select as ModuleConfig, 'wrapper');\n if (document.querySelector(selectSelector)) {\n try {\n const result = await selectInit(moduleConfig.select);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[form] Error initializing select:', error);\n }\n }\n\n return {\n result: `form initialized (${cleanup.destroyFunctions.length} modules active)`,\n destroy: () => {\n cleanup.destroyFunctions.forEach((destroyFn) => {\n try {\n destroyFn();\n } catch (error) {\n console.error('[form] Error during cleanup:', error);\n }\n });\n cleanup.destroyFunctions.length = 0;\n },\n };\n}\n","/**\n * Honeypot Spam Prevention\n *\n * Simple honeypot field implementation to prevent bot form submissions.\n * Bots auto-fill all fields including hidden ones; legitimate users only fill visible fields.\n *\n * Features:\n * - Listens for all form submissions on the page\n * - Checks if honeypot field (hidden) has been filled\n * - Blocks submission if honeypot contains a value (bot detected)\n * - Uses event capture phase for early interception\n *\n * HTML Structure:\n * <form>\n * <input type=\"text\" name=\"website\" data-hs-form=\"form-handler\" style=\"display:none\">\n * </form>\n *\n * Best Practices:\n * - Hide with CSS (display:none), not type=\"hidden\"\n * - Use realistic field names (\"website\", \"company\")\n * - No visible label or placeholder\n */\n\nimport { querySelector } from '@utils';\n\nexport function init(config) {\n // Centralized cleanup tracking\n const cleanup = {\n honeypotHandler: null,\n };\n\n // Honeypot spam prevention\n const honeypotHandler = (e: Event) => {\n const form = e.target as HTMLElement;\n if (form.tagName !== 'FORM') return;\n\n const honeypot = querySelector(config, 'form-handler', form) as HTMLInputElement;\n if (honeypot && honeypot.value) {\n // Honeypot filled - likely a bot\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n return false;\n }\n };\n\n cleanup.honeypotHandler = honeypotHandler;\n document.addEventListener('submit', honeypotHandler, true);\n\n return {\n result: 'honeypot initialized',\n destroy: () => {\n // Remove honeypot handler\n if (cleanup.honeypotHandler) {\n document.removeEventListener('submit', cleanup.honeypotHandler, true);\n cleanup.honeypotHandler = null;\n }\n },\n };\n}\n","/**\n * Form Test Mode\n *\n * Development tool that prevents form submissions and displays form data in real-time.\n * Useful for testing forms without actually submitting them to servers or triggering actions.\n *\n * Features:\n * - Prevents all form submissions (preventDefault with capture phase)\n * - Displays live form data as JSON on input/change\n * - Shows formatted submit data with timestamp on submit attempt\n * - Logs browser validation failures\n * - Works with native HTML5 form validation\n *\n * HTML Structure:\n * <div data-hs-form-test=\"wrapper\">\n * <form>\n * <input name=\"email\" required>\n * <button type=\"submit\">Submit</button>\n * </form>\n * <div data-hs-form-test=\"info\"></div>\n * </div>\n *\n * Console Output:\n * [form-test] Submit button clicked\n * [form-test] Submission prevented - displaying test results\n */\n\nimport { querySelectorAll, querySelector } from '@utils';\n\nexport function init(config) {\n // Centralized cleanup tracking\n const cleanup = {\n handlers: [],\n };\n\n const addHandler = (\n element: Element,\n event: string,\n handler: EventListener,\n options?: boolean\n ) => {\n element.addEventListener(event, handler, options);\n cleanup.handlers.push({ element, event, handler, options });\n };\n\n // Find all test wrappers\n const testWrappers = querySelectorAll(config, 'wrapper');\n\n testWrappers.forEach((wrapper) => {\n // Find form element within wrapper\n const form = wrapper.querySelector('form') as HTMLFormElement;\n if (!form) {\n console.warn(\n '[form-test] No <form> element found within data-hs-form-test=\"wrapper\"',\n wrapper\n );\n return;\n }\n\n // Find test info element (optional)\n const testInfo = querySelector(config, 'info', wrapper);\n\n // Function to collect and display current form data\n const updateLiveData = () => {\n const formData = new FormData(form);\n const data = {};\n for (const [key, value] of formData.entries()) {\n data[key] = value;\n }\n\n if (testInfo) {\n // Show live form data\n const liveDisplay = document.createElement('pre');\n liveDisplay.textContent = JSON.stringify(data, null, 2);\n\n testInfo.innerHTML = '';\n testInfo.appendChild(document.createTextNode('Test mode active - Live form data:'));\n testInfo.appendChild(liveDisplay);\n }\n };\n\n // Set initial message and data\n if (testInfo) {\n testInfo.textContent = 'Test mode active, preventing native submissions';\n // Show initial form state\n updateLiveData();\n }\n\n // Listen to all form inputs for live updates\n addHandler(form, 'input', updateLiveData);\n addHandler(form, 'change', updateLiveData);\n\n // Find submit button\n const submitButton =\n form.querySelector('button[type=\"submit\"], input[type=\"submit\"]') ||\n form.querySelector('button:not([type])');\n\n // Track button clicks to detect when browser validation blocks submission\n if (submitButton) {\n const clickHandler = () => {\n console.log('[form-test] Submit button clicked');\n\n // Use requestAnimationFrame to check if form will submit\n // If form is invalid, submit event won't fire\n requestAnimationFrame(() => {\n if (!form.checkValidity()) {\n console.log('[form-test] Browser blocked submission - validation failed');\n }\n });\n };\n addHandler(submitButton, 'click', clickHandler);\n }\n\n // Handle form submission\n const submitHandler = (e: Event) => {\n e.preventDefault(); // Prevent actual submission\n e.stopPropagation(); // Stop event from bubbling\n e.stopImmediatePropagation(); // Stop other listeners on same element\n\n console.log('[form-test] Submission prevented - displaying test results');\n\n // Get form data\n const formData = new FormData(form);\n const data = {};\n for (const [key, value] of formData.entries()) {\n data[key] = value;\n }\n\n // Create success message\n const timestamp = new Date().toLocaleTimeString();\n const message = `✅ Form would submit successfully at ${timestamp}`;\n\n // Display in test info element or console\n if (testInfo) {\n // Show form data in a formatted way\n const dataDisplay = document.createElement('pre');\n dataDisplay.textContent = JSON.stringify(data, null, 2);\n\n testInfo.innerHTML = ''; // Clear previous\n testInfo.appendChild(document.createTextNode(message));\n testInfo.appendChild(dataDisplay);\n } else {\n console.log(message);\n console.log('Form data:', data);\n }\n\n return false; // Extra insurance to prevent submission\n };\n\n // Use capture phase to catch submit event before anything else\n addHandler(form, 'submit', submitHandler, true);\n });\n\n return {\n result: `test initialized on ${testWrappers.length} form${testWrappers.length !== 1 ? 's' : ''}`,\n destroy: () => {\n // Remove all event listeners\n cleanup.handlers.forEach(({ element, event, handler, options }) => {\n element.removeEventListener(event, handler, options);\n });\n cleanup.handlers.length = 0;\n },\n };\n}\n"],"names":["init","config","cleanup","handlers","domContentLoadedHandler","addHandler","element","event","handler","addEventListener","push","initRangeComponents","querySelectorAll","forEach","wrapper","htmlWrapper","dataset","hsFormRangeInit","input","querySelector","console","warn","output","update","min","max","val","value","progress","style","setProperty","globalConfig","_global","cssVars","prefix","String","textContent","initSingleRange","document","readyState","result","destroy","removeEventListener","length","US_STATES","name","observers","timeouts","addObserver","observer","options","addTimeout","timeoutId","initCustomSelects","div","select","parentElement","firstChild","appendChild","remove","realSelect","setAttribute","selectName","getAttribute","customList","button","updateDisabledState","disabled","removeAttribute","optionTemplate","firstElementChild","templateClone","cloneNode","option","index","optionElement","textSpan","selected","buttonText","tagName","classList","add","inert","label","id","labelId","heightElement","animationTarget","searchString","searchTimeout","isSelectOpen","contains","updateARIAStates","isCurrentlyOpen","wasOpen","activeElement","focus","opt","openModal","closeModal","animateHeight","duration","ease","setHeight","focusOption","handleTypeahead","key","clearTimeout","indexOf","splice","Array","from","toLowerCase","currentIndex","findIndex","split","every","char","letter","startIndex","i","startsWith","setTimeout","clearSearch","matchIndex","selectOption","text","dispatchEvent","Event","bubbles","buttonClickHandler","e","preventDefault","toggle","buttonKeydownHandler","formElement","closest","submitButton","click","requestAnimationFrame","listKeydownHandler","target","currentIdx","listFocusoutHandler","relatedTarget","documentClickHandler","MutationObserver","observe","attributes","attributeFilter","disabledObserver","selectChangeHandler","selectedOption","selectedIndex","customOption","find","form","initSingleSelect","window","obs","disconnect","async","selectConfig","destroyFunctions","statesResult","stateSelects","selectElement","existingOptions","templateOption","placeholderText","innerHTML","placeholder","createElement","state","statesInit","states","customSelectResult","customSelectInit","destroyFn","error","fn","cleanupError","moduleConfig","structure","honeypotSelector","getSelector","honeypot","honeypotHandler","stopPropagation","stopImmediatePropagation","honeypotInit","rangeSelector","range","rangeInit","testSelector","test","testWrappers","testInfo","updateLiveData","formData","FormData","data","entries","liveDisplay","JSON","stringify","createTextNode","log","checkValidity","message","Date","toLocaleTimeString","dataDisplay","testInit","selectSelector","selectInit"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{g as e}from"./hs-utils-CKm6QhLw.js";import{p as r,g as t,w as s,i as a,b as i,d as n,e as o}from"./hs-modalManager-H_YegPAO.js";import"../main.js";const l='[data-hs-marquee="wrapper"]',c="data-hs-marquee-direction",u="data-hs-marquee-duration",g="data-hs-marquee-scroll",m="data-hs-marquee-type",d=25,p=0;async function h(){if(r())return{result:"marquee skipped - prefers-reduced-motion enabled"};const h=t("marquee");if(!h)return{result:"marquee skipped - GSAP not loaded"};const{gsap:f,ScrollTrigger:q}=h;s("marquee",["ScrollTrigger"],"error"),q&&f.registerPlugin(q),a(),i();const k=Array.from(document.querySelectorAll(l)),A={timelines:[],scrollTriggers:[],tickers:[]};return k.forEach(r=>{const t=r.getAttribute(c),s=Array.from(r.children);if(0===s.length)return void console.warn("[marquee] No children found in marquee wrapper:",r);const a=r.getAttribute(u),i=a?parseFloat(a):d,l=r.getAttribute(g),h=l?parseFloat(l):p,q=r.getAttribute(m);a||r.setAttribute(u,String(d)),l||r.setAttribute(g,String(p)),r.classList.add(e.classes.gsap);const k=f.timeline({repeat:-1});if(s.forEach(e=>{"left"===t?k.to(e,{xPercent:-100,duration:i,ease:"none"},0):"right"===t&&(f.set(e,{xPercent:-100}),k.to(e,{xPercent:0,duration:i,ease:"none"},0))}),A.timelines.push(k),h>0){let e=1;const r=()=>{const r=o(),t=n();let s=1;if("reverse"===q)if(1===t)s=1+r*h;else if(-1===t){const e=r*h;s=e>.5?-e:1}else s=1;else{s=1+r*h}Math.abs(s-e)>.001&&(k.timeScale(s),e=s)};f.ticker.add(r),A.tickers.push({tickerFunc:r,gsap:f})}}),{result:`marquee initialized (${k.length} instances)`,destroy:()=>{A.timelines.forEach(e=>{e&&e.kill()}),A.scrollTriggers.forEach(e=>{e&&e.kill()}),A.tickers.forEach(({tickerFunc:e,gsap:r})=>{r.ticker.remove(e)}),k.forEach(r=>{r.classList.remove(e.classes.gsap)}),A.timelines.length=0,A.scrollTriggers.length=0,A.tickers.length=0}}}export{h as init};
2
- //# sourceMappingURL=hs-marquee-CZ9pmCbT.js.map
@@ -1,2 +0,0 @@
1
- import{g as e}from"./hs-utils-CKm6QhLw.js";import{p as r,g as t,w as s,i as a,b as i,d as n,e as o}from"./hs-modalManager-H_YegPAO.js";import"../main.js";const l='[data-hs-marquee="wrapper"]',c="data-hs-marquee-direction",u="data-hs-marquee-duration",g="data-hs-marquee-scroll",m="data-hs-marquee-type",d=25,p=0;async function h(){if(r())return{result:"marquee skipped - prefers-reduced-motion enabled"};const h=t("marquee");if(!h)return{result:"marquee skipped - GSAP not loaded"};const{gsap:f,ScrollTrigger:q}=h;s("marquee",["ScrollTrigger"],"error"),q&&f.registerPlugin(q),a(),i();const k=Array.from(document.querySelectorAll(l)),A={timelines:[],scrollTriggers:[],tickers:[]};return k.forEach(r=>{const t=r.getAttribute(c),s=Array.from(r.children);if(0===s.length)return void console.warn("[marquee] No children found in marquee wrapper:",r);const a=r.getAttribute(u),i=a?parseFloat(a):d,l=r.getAttribute(g),h=l?parseFloat(l):p,q=r.getAttribute(m);a||r.setAttribute(u,String(d)),l||r.setAttribute(g,String(p)),r.classList.add(e.classes.gsap);const k=f.timeline({repeat:-1});if(s.forEach(e=>{"left"===t?k.to(e,{xPercent:-100,duration:i,ease:"none"},0):"right"===t&&(f.set(e,{xPercent:-100}),k.to(e,{xPercent:0,duration:i,ease:"none"},0))}),A.timelines.push(k),h>0){let e=1;const r=()=>{const r=o(),t=n();let s=1;if("reverse"===q)if(1===t)s=1+r*h;else if(-1===t){const e=r*h;s=e>.5?-e:1}else s=1;else{s=1+r*h}Math.abs(s-e)>.001&&(k.timeScale(s),e=s)};f.ticker.add(r),A.tickers.push({tickerFunc:r,gsap:f})}}),{result:`marquee initialized (${k.length} instances)`,destroy:()=>{A.timelines.forEach(e=>{e&&e.kill()}),A.scrollTriggers.forEach(e=>{e&&e.kill()}),A.tickers.forEach(({tickerFunc:e,gsap:r})=>{r.ticker.remove(e)}),k.forEach(r=>{r.classList.remove(e.classes.gsap)}),A.timelines.length=0,A.scrollTriggers.length=0,A.tickers.length=0}}}export{h as init};
2
- //# sourceMappingURL=hs-marquee-CZ9pmCbT.js.map
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";let t=!1,n=0,o=0,r=!1,a=!1;function i(){if(r||!c())return;const e=window.gsap;let t=window.scrollY,a=performance.now(),i=0,l=0;window.ScrollTrigger.create({onUpdate:()=>{const e=window.scrollY,n=performance.now(),r=e-t,l=n-a;r>0?o=1:r<0&&(o=-1),l>0&&(i=Math.abs(r)/l*1e3),t=e,a=n}}),e.ticker.add(()=>{l+=.08*(i-l),i*=.95,Math.abs(l)<.1&&(l=0),Math.abs(i)<.1&&(i=0),n=l}),r=!0}function l(){return n}function s(){return o}function c(){return void 0!==window.ScrollTrigger}function u(e,n=!0){return void 0===window.gsap?(n&&!t?(console.warn("[gsap] GSAP library not detected. Some animations will be skipped. Add GSAP to your project: https://greensock.com/docs/v3/Installation"),t=!0):e&&!t&&(console.warn(`[${e}] GSAP not available, module will use fallback behavior`),t=!0),null):{gsap:window.gsap,ScrollTrigger:window.ScrollTrigger,Draggable:window.Draggable}}function g(e,t,n="warn"){const o=[];if(t.forEach(e=>{"ScrollTrigger"!==e||c()?"Draggable"===e&&void 0===window.Draggable&&o.push("Draggable"):o.push("ScrollTrigger")}),0===o.length)return;const r=o.join(", "),a="error"===n?`[${e}] Missing required GSAP plugin(s): ${r}. Module will not work correctly. Add to your project: https://greensock.com/docs/v3/Installation`:`[${e}] Missing optional GSAP plugin(s): ${r}. Some features will be disabled. Add for full functionality: https://greensock.com/docs/v3/Installation`;"error"===n?console.error(a):console.warn(a)}function d(){if(a||!c())return;let e=null;document.addEventListener("load",t=>{t.target instanceof HTMLImageElement&&(null!==e&&clearTimeout(e),e=setTimeout(()=>{window.ScrollTrigger.refresh(),e=null},50))},!0),a=!0}function f(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}const h=new class{#e=new Map;async animate(t,n,o={}){const r=u("heightAnimator");if(!r)return;const{gsap:a}=r,i=e._global.attributes.height,l=e._global.attributes.heightValue,s=e._global.attributes.heightDuration,c=e._global.attributes.heightEase,g=t.hasAttribute?.(i)&&t.getAttribute(i)===l?t:t.querySelector?.(`[${i}="${l}"]`)||t,d=this.#e.get(g);d&&(d.kill(),this.#e.delete(g));let h=g.getAttribute(s),p=g.getAttribute(c);!h&&g.parentElement&&(h=g.parentElement.getAttribute(s)),!p&&g.parentElement&&(p=g.parentElement.getAttribute(c));let w=h?parseInt(h,10)/1e3:(o.duration||300)/1e3;f()&&(w=0);const m=p||o.ease||"power2.inOut",b=a.to(g,{height:n?"auto":0,duration:w,ease:m});this.#e.set(g,b);try{await b.then()}finally{this.#e.delete(g)}}setHeight(t,n){const o=u("heightAnimator");if(!o)return;const{gsap:r}=o,a=e._global.attributes.height,i=e._global.attributes.heightValue,l=t.hasAttribute?.(a)&&t.getAttribute(a)===i?t:t.querySelector?.(`[${a}="${i}"]`)||t;r.set(l,{height:n?"auto":0})}cancelAll(){this.#e.forEach(e=>e.kill()),this.#e.clear()}},p=h.animate.bind(h),w=h.setHeight.bind(h);let m=0;const b=[],A=[];let y=!0,v=null;function M(){if(!y)return null;if(v)return v;const e=window;return e.lenis&&"function"==typeof e.lenis.stop&&"function"==typeof e.lenis.start?(v=e.lenis,e.lenis):null}function S(){if(m++,1===m){const n=e._global.classes.modalOpen,o=e._global.classes.overflowHidden;document.body.classList.add(o,n);const r=M();if(r)try{r.stop()}catch(t){console.error("[modalManager] Error stopping Lenis:",t)}b.forEach(e=>{try{e()}catch(t){console.error("[modalManager] Error in open callback:",t)}})}}function E(){if(m--,0===m){const n=e._global.classes.modalOpen,o=e._global.classes.overflowHidden;document.body.classList.remove(o,n);const r=M();if(r)try{r.start()}catch(t){console.error("[modalManager] Error starting Lenis:",t)}A.forEach(e=>{try{e()}catch(t){console.error("[modalManager] Error in close callback:",t)}})}m<0&&(console.warn("[modalManager] Modal count went negative, resetting to 0"),m=0)}if("undefined"!=typeof window){const e=window;e.HS=e.HS||{},e.HS.modal={open:S,close:E,getCount:function(){return m},isOpen:function(){return m>0},onOpen:function(e){return"function"!=typeof e?(console.warn("[modalManager] onModalOpen requires a function"),()=>{}):(b.push(e),()=>{const t=b.indexOf(e);t>-1&&b.splice(t,1)})},onClose:function(e){return"function"!=typeof e?(console.warn("[modalManager] onModalClose requires a function"),()=>{}):(A.push(e),()=>{const t=A.indexOf(e);t>-1&&A.splice(t,1)})},setLenisEnabled:function(e){y=e,e||(v=null)}}}export{p as a,d as b,E as c,s as d,l as e,u as g,i,S as o,f as p,w as s,g as w};
2
- //# sourceMappingURL=hs-modalManager-H_YegPAO.js.map
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";let t=!1,n=0,o=0,r=!1,a=!1;function i(){if(r||!c())return;const e=window.gsap;let t=window.scrollY,a=performance.now(),i=0,l=0;window.ScrollTrigger.create({onUpdate:()=>{const e=window.scrollY,n=performance.now(),r=e-t,l=n-a;r>0?o=1:r<0&&(o=-1),l>0&&(i=Math.abs(r)/l*1e3),t=e,a=n}}),e.ticker.add(()=>{l+=.08*(i-l),i*=.95,Math.abs(l)<.1&&(l=0),Math.abs(i)<.1&&(i=0),n=l}),r=!0}function l(){return n}function s(){return o}function c(){return void 0!==window.ScrollTrigger}function u(e,n=!0){return void 0===window.gsap?(n&&!t?(console.warn("[gsap] GSAP library not detected. Some animations will be skipped. Add GSAP to your project: https://greensock.com/docs/v3/Installation"),t=!0):e&&!t&&(console.warn(`[${e}] GSAP not available, module will use fallback behavior`),t=!0),null):{gsap:window.gsap,ScrollTrigger:window.ScrollTrigger,Draggable:window.Draggable}}function g(e,t,n="warn"){const o=[];if(t.forEach(e=>{"ScrollTrigger"!==e||c()?"Draggable"===e&&void 0===window.Draggable&&o.push("Draggable"):o.push("ScrollTrigger")}),0===o.length)return;const r=o.join(", "),a="error"===n?`[${e}] Missing required GSAP plugin(s): ${r}. Module will not work correctly. Add to your project: https://greensock.com/docs/v3/Installation`:`[${e}] Missing optional GSAP plugin(s): ${r}. Some features will be disabled. Add for full functionality: https://greensock.com/docs/v3/Installation`;"error"===n?console.error(a):console.warn(a)}function d(){if(a||!c())return;let e=null;document.addEventListener("load",t=>{t.target instanceof HTMLImageElement&&(null!==e&&clearTimeout(e),e=setTimeout(()=>{window.ScrollTrigger.refresh(),e=null},50))},!0),a=!0}function f(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}const h=new class{#e=new Map;async animate(t,n,o={}){const r=u("heightAnimator");if(!r)return;const{gsap:a}=r,i=e._global.attributes.height,l=e._global.attributes.heightValue,s=e._global.attributes.heightDuration,c=e._global.attributes.heightEase,g=t.hasAttribute?.(i)&&t.getAttribute(i)===l?t:t.querySelector?.(`[${i}="${l}"]`)||t,d=this.#e.get(g);d&&(d.kill(),this.#e.delete(g));let h=g.getAttribute(s),p=g.getAttribute(c);!h&&g.parentElement&&(h=g.parentElement.getAttribute(s)),!p&&g.parentElement&&(p=g.parentElement.getAttribute(c));let w=h?parseInt(h,10)/1e3:(o.duration||300)/1e3;f()&&(w=0);const m=p||o.ease||"power2.inOut",b=a.to(g,{height:n?"auto":0,duration:w,ease:m});this.#e.set(g,b);try{await b.then()}finally{this.#e.delete(g)}}setHeight(t,n){const o=u("heightAnimator");if(!o)return;const{gsap:r}=o,a=e._global.attributes.height,i=e._global.attributes.heightValue,l=t.hasAttribute?.(a)&&t.getAttribute(a)===i?t:t.querySelector?.(`[${a}="${i}"]`)||t;r.set(l,{height:n?"auto":0})}cancelAll(){this.#e.forEach(e=>e.kill()),this.#e.clear()}},p=h.animate.bind(h),w=h.setHeight.bind(h);let m=0;const b=[],A=[];let y=!0,v=null;function M(){if(!y)return null;if(v)return v;const e=window;return e.lenis&&"function"==typeof e.lenis.stop&&"function"==typeof e.lenis.start?(v=e.lenis,e.lenis):null}function S(){if(m++,1===m){const n=e._global.classes.modalOpen,o=e._global.classes.overflowHidden;document.body.classList.add(o,n);const r=M();if(r)try{r.stop()}catch(t){console.error("[modalManager] Error stopping Lenis:",t)}b.forEach(e=>{try{e()}catch(t){console.error("[modalManager] Error in open callback:",t)}})}}function E(){if(m--,0===m){const n=e._global.classes.modalOpen,o=e._global.classes.overflowHidden;document.body.classList.remove(o,n);const r=M();if(r)try{r.start()}catch(t){console.error("[modalManager] Error starting Lenis:",t)}A.forEach(e=>{try{e()}catch(t){console.error("[modalManager] Error in close callback:",t)}})}m<0&&(console.warn("[modalManager] Modal count went negative, resetting to 0"),m=0)}if("undefined"!=typeof window){const e=window;e.HS=e.HS||{},e.HS.modal={open:S,close:E,getCount:function(){return m},isOpen:function(){return m>0},onOpen:function(e){return"function"!=typeof e?(console.warn("[modalManager] onModalOpen requires a function"),()=>{}):(b.push(e),()=>{const t=b.indexOf(e);t>-1&&b.splice(t,1)})},onClose:function(e){return"function"!=typeof e?(console.warn("[modalManager] onModalClose requires a function"),()=>{}):(A.push(e),()=>{const t=A.indexOf(e);t>-1&&A.splice(t,1)})},setLenisEnabled:function(e){y=e,e||(v=null)}}}export{p as a,d as b,E as c,s as d,l as e,u as g,i,S as o,f as p,w as s,g as w};
2
- //# sourceMappingURL=hs-modalManager-H_YegPAO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hs-modalManager-H_YegPAO.js","sources":["../../src/utils/gsap.ts","../../src/utils/heightAnimator.ts","../../src/utils/modalManager.ts"],"sourcesContent":["/**\n * GSAP Handler\n *\n * Centralized GSAP detection, error handling, and utilities.\n * Provides type-safe access to GSAP, ScrollTrigger, and Draggable.\n *\n * Features:\n * - Global scroll velocity tracking\n * - ScrollTrigger refresh on image load\n * - Prefers-reduced-motion detection\n */\n\n// Type definitions for externally loaded GSAP\nexport interface GsapTween {\n kill: () => void;\n then: () => Promise<void>;\n}\n\nexport interface GsapTimeline {\n to: (target: unknown, vars: Record<string, unknown>, position?: number | string) => GsapTimeline;\n from: (\n target: unknown,\n vars: Record<string, unknown>,\n position?: number | string\n ) => GsapTimeline;\n set: (target: unknown, vars: Record<string, unknown>, position?: number | string) => GsapTimeline;\n call: (callback: () => void, params?: unknown[], position?: number | string) => GsapTimeline;\n play: () => GsapTimeline;\n pause: () => GsapTimeline;\n kill: () => void;\n timeScale: (value: number) => GsapTimeline;\n}\n\ninterface GsapPlugin {\n create: (config: unknown) => void;\n getAll: () => unknown[];\n refresh: () => void;\n}\n\ninterface GsapDraggable {\n create: (target: unknown, vars?: Record<string, unknown>) => unknown[];\n}\n\ninterface GsapInstance {\n to: (target: unknown, vars: Record<string, unknown>) => GsapTween;\n from: (target: unknown, vars: Record<string, unknown>) => GsapTween;\n set: (target: unknown, vars: Record<string, unknown>) => void;\n timeline: (vars?: Record<string, unknown>) => GsapTimeline;\n registerPlugin: (...plugins: unknown[]) => void;\n ticker: {\n add: (callback: () => void) => void;\n remove: (callback: () => void) => void;\n };\n}\n\n// Declare global types for GSAP (loaded externally)\ndeclare global {\n interface Window {\n gsap?: GsapInstance;\n ScrollTrigger?: GsapPlugin;\n Draggable?: GsapDraggable;\n }\n}\n\nlet hasWarned = false;\nlet globalScrollVelocity = 0;\nlet globalScrollDirection = 0; // 1 = down, -1 = up, 0 = not scrolling\nlet scrollVelocityInitialized = false;\nlet scrollTriggerRefreshInitialized = false;\n\n/**\n * Initialize global scroll velocity tracking\n */\nexport function initScrollVelocityTracking(): void {\n if (scrollVelocityInitialized || !hasScrollTrigger()) {\n return;\n }\n\n const gsap = window.gsap!;\n\n // Track scroll position and smooth velocity\n let lastScrollY = window.scrollY;\n let lastTime = performance.now();\n let targetVelocity = 0;\n let currentVelocity = 0;\n\n // Update target velocity and direction on scroll\n window.ScrollTrigger!.create({\n onUpdate: () => {\n const currentScrollY = window.scrollY;\n const currentTime = performance.now();\n const deltaY = currentScrollY - lastScrollY;\n const deltaTime = currentTime - lastTime;\n\n // Update scroll direction\n if (deltaY > 0) {\n globalScrollDirection = 1; // Scrolling down\n } else if (deltaY < 0) {\n globalScrollDirection = -1; // Scrolling up\n }\n\n // Calculate velocity in pixels per second (framerate-independent)\n // Avoid division by zero\n if (deltaTime > 0) {\n targetVelocity = (Math.abs(deltaY) / deltaTime) * 1000; // Convert to pixels/second\n }\n\n lastScrollY = currentScrollY;\n lastTime = currentTime;\n },\n });\n\n // Smoothly lerp current velocity to target velocity every frame\n gsap.ticker.add(() => {\n // Lerp factor: lower = smoother (0.08 for buttery smooth)\n const lerpFactor = 0.08;\n\n // Interpolate current velocity towards target\n currentVelocity += (targetVelocity - currentVelocity) * lerpFactor;\n\n // Decay target velocity (simulates friction) - slower decay for smoothness\n targetVelocity *= 0.95;\n\n // Snap to zero when very small\n if (Math.abs(currentVelocity) < 0.1) {\n currentVelocity = 0;\n }\n if (Math.abs(targetVelocity) < 0.1) {\n targetVelocity = 0;\n }\n\n // Update global velocity\n globalScrollVelocity = currentVelocity;\n });\n\n scrollVelocityInitialized = true;\n}\n\n/**\n * Get current scroll velocity\n * @returns Current scroll velocity (pixels per second)\n */\nexport function getScrollVelocity(): number {\n return globalScrollVelocity;\n}\n\n/**\n * Get current scroll direction\n * @returns 1 for down, -1 for up, 0 for not scrolling\n */\nexport function getScrollDirection(): number {\n return globalScrollDirection;\n}\n\n/**\n * Check if GSAP is available\n */\nexport function hasGsap(): boolean {\n return typeof window.gsap !== 'undefined';\n}\n\n/**\n * Check if ScrollTrigger is available\n */\nexport function hasScrollTrigger(): boolean {\n return typeof window.ScrollTrigger !== 'undefined';\n}\n\n/**\n * Check if Draggable is available\n */\nexport function hasDraggable(): boolean {\n return typeof window.Draggable !== 'undefined';\n}\n\n/**\n * Get GSAP instance with type safety\n */\nexport function getGsap(\n moduleName?: string,\n required: boolean = true\n): { gsap: GsapInstance; ScrollTrigger?: GsapPlugin; Draggable?: GsapDraggable } | null {\n if (!hasGsap()) {\n if (required && !hasWarned) {\n console.warn(\n '[gsap] GSAP library not detected. Some animations will be skipped. ' +\n 'Add GSAP to your project: https://greensock.com/docs/v3/Installation'\n );\n hasWarned = true;\n } else if (moduleName && !hasWarned) {\n console.warn(`[${moduleName}] GSAP not available, module will use fallback behavior`);\n hasWarned = true;\n }\n return null;\n }\n\n return {\n gsap: window.gsap!,\n ScrollTrigger: window.ScrollTrigger,\n Draggable: window.Draggable,\n };\n}\n\n/**\n * Warn about missing GSAP dependencies\n * Call this from modules to alert developers about missing plugins\n *\n * @param moduleName - Name of the module requiring the dependency\n * @param dependencies - Array of dependency names (e.g., ['ScrollTrigger', 'Draggable'])\n * @param severity - 'error' for required dependencies, 'warn' for optional\n *\n * @example\n * // Required dependency (module won't work without it)\n * warnMissingDependencies('marquee', ['ScrollTrigger'], 'error');\n *\n * @example\n * // Optional dependency (module has fallback)\n * warnMissingDependencies('counter', ['ScrollTrigger'], 'warn');\n */\nexport function warnMissingDependencies(\n moduleName: string,\n dependencies: Array<'ScrollTrigger' | 'Draggable'>,\n severity: 'error' | 'warn' = 'warn'\n): void {\n const missing: string[] = [];\n\n dependencies.forEach((dep) => {\n if (dep === 'ScrollTrigger' && !hasScrollTrigger()) {\n missing.push('ScrollTrigger');\n } else if (dep === 'Draggable' && !hasDraggable()) {\n missing.push('Draggable');\n }\n });\n\n if (missing.length === 0) return;\n\n const pluginList = missing.join(', ');\n const message =\n severity === 'error'\n ? `[${moduleName}] Missing required GSAP plugin(s): ${pluginList}. Module will not work correctly. Add to your project: https://greensock.com/docs/v3/Installation`\n : `[${moduleName}] Missing optional GSAP plugin(s): ${pluginList}. Some features will be disabled. Add for full functionality: https://greensock.com/docs/v3/Installation`;\n\n if (severity === 'error') {\n console.error(message);\n } else {\n console.warn(message);\n }\n}\n\n/**\n * Reset warning state (useful for testing)\n */\nexport function resetGsapWarning(): void {\n hasWarned = false;\n}\n\n/**\n * Initialize ScrollTrigger refresh on image load\n */\nexport function initScrollTriggerRefresh(): void {\n if (scrollTriggerRefreshInitialized || !hasScrollTrigger()) {\n return;\n }\n\n let refreshTimeout: ReturnType<typeof setTimeout> | null = null;\n const refreshDelay = 50; // Debounce delay in ms\n\n // Debounced refresh function\n const debouncedRefresh = () => {\n if (refreshTimeout !== null) {\n clearTimeout(refreshTimeout);\n }\n refreshTimeout = setTimeout(() => {\n window.ScrollTrigger!.refresh();\n refreshTimeout = null;\n }, refreshDelay);\n };\n\n // Listen for all image load events using event delegation\n document.addEventListener(\n 'load',\n (e) => {\n if (e.target instanceof HTMLImageElement) {\n debouncedRefresh();\n }\n },\n true\n ); // Use capture phase to catch all image loads\n\n scrollTriggerRefreshInitialized = true;\n}\n\n/**\n * Check if user prefers reduced motion\n * @returns true if user prefers reduced motion\n */\nexport function prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n","/**\n * Height Animator\n *\n * GSAP-based height animations with singleton pattern.\n * Supports customizable duration, easing, and respects prefers-reduced-motion.\n */\nimport config from '@config';\nimport { getGsap, prefersReducedMotion, type GsapTween } from './gsap.ts';\n\ninterface AnimateOptions {\n duration?: number;\n ease?: string;\n}\n\nclass HeightAnimator {\n #activeAnimations = new Map<HTMLElement, GsapTween>();\n\n /**\n * Animate element height to open or closed state\n */\n async animate(\n element: HTMLElement,\n isOpen: boolean,\n options: AnimateOptions = {}\n ): Promise<void> {\n const gsapLib = getGsap('heightAnimator');\n if (!gsapLib) return;\n\n const { gsap } = gsapLib;\n\n const heightAttr = config._global.attributes.height;\n const heightValue = config._global.attributes.heightValue;\n const durationAttr = config._global.attributes.heightDuration;\n const easeAttr = config._global.attributes.heightEase;\n\n // Check for custom height target element\n const heightTarget =\n element.hasAttribute?.(heightAttr) && element.getAttribute(heightAttr) === heightValue\n ? element\n : (element.querySelector?.(`[${heightAttr}=\"${heightValue}\"]`) as HTMLElement) || element;\n\n // Cancel existing animation on this element\n const existingAnim = this.#activeAnimations.get(heightTarget);\n if (existingAnim) {\n existingAnim.kill();\n this.#activeAnimations.delete(heightTarget);\n }\n\n // Get attributes - check both the target AND its parent wrapper\n let durationValue = heightTarget.getAttribute(durationAttr);\n let easeValue = heightTarget.getAttribute(easeAttr);\n\n // If not found on target, check parent wrapper\n if (!durationValue && heightTarget.parentElement) {\n durationValue = heightTarget.parentElement.getAttribute(durationAttr);\n }\n if (!easeValue && heightTarget.parentElement) {\n easeValue = heightTarget.parentElement.getAttribute(easeAttr);\n }\n\n // Fallback chain: attribute > options > default\n let duration = durationValue\n ? parseInt(durationValue, 10) / 1000\n : (options.duration || 300) / 1000;\n\n // Force instant updates if user prefers reduced motion\n if (prefersReducedMotion()) {\n duration = 0;\n }\n\n const ease = easeValue || options.ease || 'power2.inOut';\n\n // Create animation\n const animation = gsap.to(heightTarget, {\n height: isOpen ? 'auto' : 0,\n duration: duration,\n ease: ease,\n });\n\n // Track active animation\n this.#activeAnimations.set(heightTarget, animation);\n\n // Wait for animation to complete\n try {\n await animation.then();\n } finally {\n this.#activeAnimations.delete(heightTarget);\n }\n }\n\n /**\n * Set element height immediately without animation (for initial state)\n */\n setHeight(element: HTMLElement, isOpen: boolean): void {\n const gsapLib = getGsap('heightAnimator');\n if (!gsapLib) return;\n\n const { gsap } = gsapLib;\n\n const heightAttr = config._global.attributes.height;\n const heightValue = config._global.attributes.heightValue;\n\n // Check for custom height target element\n const heightTarget =\n element.hasAttribute?.(heightAttr) && element.getAttribute(heightAttr) === heightValue\n ? element\n : (element.querySelector?.(`[${heightAttr}=\"${heightValue}\"]`) as HTMLElement) || element;\n\n // Set immediately without animation\n gsap.set(heightTarget, {\n height: isOpen ? 'auto' : 0,\n });\n }\n\n /**\n * Cancel all active animations (for cleanup)\n */\n cancelAll(): void {\n this.#activeAnimations.forEach((anim) => anim.kill());\n this.#activeAnimations.clear();\n }\n}\n\n// Export singleton instance\nexport const heightAnimator = new HeightAnimator();\n\n// Export bound methods for convenience\nexport const animateHeight = heightAnimator.animate.bind(heightAnimator);\nexport const setHeight = heightAnimator.setHeight.bind(heightAnimator);\n","/**\n * Modal Manager\n *\n * Reference-counted modal state management with body class handling.\n * Automatically detects and handles Lenis smooth scroll (stop on open, start on close).\n * Supports extensible hooks for custom callbacks.\n *\n * Usage:\n * import { openModal, closeModal } from '@utils/modalManager';\n * openModal(); // Register modal as open, auto-stops Lenis if detected\n * closeModal(); // Register modal as closed, auto-starts Lenis if detected\n *\n * Lenis Integration:\n * - Auto-detects window.lenis and stops/starts automatically\n * - Works whether Lenis loads before or after this module\n * - Disable auto-handling: window.HS.modal.setLenisEnabled(false);\n * - Manual control still available: window.HS.modal.onOpen(() => customLogic());\n *\n * External API:\n * window.HS.modal.open();\n * window.HS.modal.close();\n * window.HS.modal.setLenisEnabled(false); // Disable auto Lenis handling\n * window.HS.modal.onOpen(() => customCallback()); // Additional callbacks\n */\nimport config from '@config';\n\ntype ModalCallback = () => void;\n\nlet activeModalCount = 0;\nconst openCallbacks: ModalCallback[] = [];\nconst closeCallbacks: ModalCallback[] = [];\n\n// Lenis integration settings\nlet lenisEnabled = true; // Auto-detect and handle Lenis by default\nlet lenisInstance: unknown = null; // Cache Lenis instance\n\n/**\n * Detect and get Lenis instance from window\n */\nfunction getLenis(): { stop: () => void; start: () => void } | null {\n if (!lenisEnabled) return null;\n\n // Check cached instance first\n if (lenisInstance) return lenisInstance as { stop: () => void; start: () => void };\n\n // Try to find Lenis on window\n const win = window as Window & { lenis?: { stop: () => void; start: () => void } };\n if (win.lenis && typeof win.lenis.stop === 'function' && typeof win.lenis.start === 'function') {\n lenisInstance = win.lenis;\n return win.lenis;\n }\n\n return null;\n}\n\n/**\n * Enable or disable automatic Lenis integration\n */\nexport function setLenisEnabled(enabled: boolean): void {\n lenisEnabled = enabled;\n if (!enabled) {\n lenisInstance = null; // Clear cache when disabled\n }\n}\n\n/**\n * Register a callback to run when first modal opens\n */\nexport function onModalOpen(callback: ModalCallback): () => void {\n if (typeof callback !== 'function') {\n console.warn('[modalManager] onModalOpen requires a function');\n return () => {};\n }\n\n openCallbacks.push(callback);\n\n // Return unregister function\n return () => {\n const index = openCallbacks.indexOf(callback);\n if (index > -1) openCallbacks.splice(index, 1);\n };\n}\n\n/**\n * Register a callback to run when last modal closes\n */\nexport function onModalClose(callback: ModalCallback): () => void {\n if (typeof callback !== 'function') {\n console.warn('[modalManager] onModalClose requires a function');\n return () => {};\n }\n\n closeCallbacks.push(callback);\n\n // Return unregister function\n return () => {\n const index = closeCallbacks.indexOf(callback);\n if (index > -1) closeCallbacks.splice(index, 1);\n };\n}\n\n/**\n * Register a modal as open\n */\nexport function openModal(): void {\n activeModalCount++;\n\n // Only apply effects when first modal opens\n if (activeModalCount === 1) {\n const modalOpenClass = config._global.classes.modalOpen;\n const overflowHiddenClass = config._global.classes.overflowHidden;\n\n document.body.classList.add(overflowHiddenClass, modalOpenClass);\n\n // Auto-stop Lenis if detected\n const lenis = getLenis();\n if (lenis) {\n try {\n lenis.stop();\n } catch (error) {\n console.error('[modalManager] Error stopping Lenis:', error);\n }\n }\n\n // Run all registered open callbacks\n openCallbacks.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error('[modalManager] Error in open callback:', error);\n }\n });\n }\n}\n\n/**\n * Register a modal as closed\n */\nexport function closeModal(): void {\n activeModalCount--;\n\n // Only remove effects when last modal closes\n if (activeModalCount === 0) {\n const modalOpenClass = config._global.classes.modalOpen;\n const overflowHiddenClass = config._global.classes.overflowHidden;\n\n document.body.classList.remove(overflowHiddenClass, modalOpenClass);\n\n // Auto-start Lenis if detected\n const lenis = getLenis();\n if (lenis) {\n try {\n lenis.start();\n } catch (error) {\n console.error('[modalManager] Error starting Lenis:', error);\n }\n }\n\n // Run all registered close callbacks\n closeCallbacks.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error('[modalManager] Error in close callback:', error);\n }\n });\n }\n\n // Safety: prevent negative count\n if (activeModalCount < 0) {\n console.warn('[modalManager] Modal count went negative, resetting to 0');\n activeModalCount = 0;\n }\n}\n\n/**\n * Get current modal count (for debugging)\n */\nexport function getActiveModalCount(): number {\n return activeModalCount;\n}\n\n/**\n * Check if any modals are currently open\n */\nexport function isModalOpen(): boolean {\n return activeModalCount > 0;\n}\n\n// Expose globally for external scripts\ninterface WindowWithHS extends Window {\n HS?: {\n modal?: {\n open: () => void;\n close: () => void;\n getCount: () => number;\n isOpen: () => boolean;\n onOpen: (callback: ModalCallback) => () => void;\n onClose: (callback: ModalCallback) => () => void;\n setLenisEnabled: (enabled: boolean) => void;\n };\n };\n}\n\nif (typeof window !== 'undefined') {\n const win = window as WindowWithHS;\n win.HS = win.HS || {};\n win.HS.modal = {\n open: openModal,\n close: closeModal,\n getCount: getActiveModalCount,\n isOpen: isModalOpen,\n onOpen: onModalOpen,\n onClose: onModalClose,\n setLenisEnabled: setLenisEnabled,\n };\n}\n"],"names":["hasWarned","globalScrollVelocity","globalScrollDirection","scrollVelocityInitialized","scrollTriggerRefreshInitialized","initScrollVelocityTracking","hasScrollTrigger","gsap","window","lastScrollY","scrollY","lastTime","performance","now","targetVelocity","currentVelocity","ScrollTrigger","create","onUpdate","currentScrollY","currentTime","deltaY","deltaTime","Math","abs","ticker","add","getScrollVelocity","getScrollDirection","getGsap","moduleName","required","console","warn","Draggable","warnMissingDependencies","dependencies","severity","missing","forEach","dep","push","length","pluginList","join","message","error","initScrollTriggerRefresh","refreshTimeout","document","addEventListener","e","target","HTMLImageElement","clearTimeout","setTimeout","refresh","prefersReducedMotion","matchMedia","matches","heightAnimator","activeAnimations","Map","animate","element","isOpen","options","gsapLib","heightAttr","config","_global","attributes","height","heightValue","durationAttr","heightDuration","easeAttr","heightEase","heightTarget","hasAttribute","getAttribute","querySelector","existingAnim","this","get","kill","delete","durationValue","easeValue","parentElement","duration","parseInt","ease","animation","to","set","then","setHeight","cancelAll","anim","clear","animateHeight","bind","activeModalCount","openCallbacks","closeCallbacks","lenisEnabled","lenisInstance","getLenis","win","lenis","stop","start","openModal","modalOpenClass","classes","modalOpen","overflowHiddenClass","overflowHidden","body","classList","callback","closeModal","remove","HS","modal","open","close","getCount","onOpen","index","indexOf","splice","onClose","setLenisEnabled","enabled"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";import{q as t,a as r,g as n}from"./hs-attributeSelector-6pGcDBo-.js";import"./hs-modalManager-H_YegPAO.js";import{g as o}from"./hs-utils-CKm6QhLw.js";function s(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,null);let n;for(;n=r.nextNode();)n.nodeValue?.trim()&&t.push(n);return t}function i(e){const t=[];return e.hasAttribute("href")&&t.push(e),t.push(...Array.from(e.querySelectorAll("[href]"))),t}function c(e){if(e.hasAttribute("src")){if(e.getAttribute("src"))return e}const t=e.querySelector("[src]");if(t){if(t.getAttribute("src"))return t}return null}function a(e,t,r){if(function(e,t){const r=t.attributes.properties.syncField;return null!==e.querySelector(`[${r}]`)}(t,r))return void function(e,t,r){const n=r.attributes.properties.syncField;e.querySelectorAll(`[${n}]`).forEach(e=>{const r=e.getAttribute(n),o=t.querySelector(`[${n}="${r}"]`);if(!o)return;const i=c(e),a=c(o);if(i&&a){const e=i.getAttribute("src");e&&a.setAttribute("src",e)}else if(e.hasAttribute("href")&&o.hasAttribute("href")){const t=e.getAttribute("href");t&&o.setAttribute("href",t)}else{const t=s(e),r=t.length>0?t[0].nodeValue:e.textContent.trim();if(r){const e=s(o);e.length>0?e[0].nodeValue=r:o.textContent=r}}})}(e,t,r);const n=s(e),o=n.length>0?n[0].nodeValue:"",a=i(e),l=a.length>0?a[0].getAttribute("href"):"";if(o){s(t).forEach(e=>{e.nodeValue=o})}if(l){i(t).forEach(e=>{e.setAttribute("href",l)})}}const l="hs-dupe-no-transition";let u=!1;async function d(e){!function(){if(u)return;const e=document.createElement("style");e.textContent=`\n .${l},\n .${l} * {\n transition: none !important;\n animation: none !important;\n }\n `,document.head.appendChild(e),u=!0}();const r={processedElements:[]};return t(e,"wrapper").forEach(e=>{const t=e.getAttribute("data-hs-dupe");if(!t||"child"!==t&&"self"!==t)return void console.warn('[dupe] Invalid mode. Use "child" or "self":',e);const n=e.getAttribute("data-hs-dupe-count");let o=n?parseInt(n,10):1;(isNaN(o)||o<1)&&(console.warn("[dupe] Invalid count, using default of 1:",e),o=1),o>20&&(console.warn(`[dupe] Count of ${o} exceeds maximum of 20. Capping at 20.`),o=20);const s={hidden:e.hasAttribute("data-hs-dupe-hidden"),noSelect:e.hasAttribute("data-hs-dupe-no-select")};"child"===t?function(e,t,r,n){const o=e.children[0];if(!o)return;const s=[];for(let i=0;i<t;i++){const t=o.cloneNode(!0);t.classList.add(l),p(t,r),e.appendChild(t),s.push(t),t.offsetHeight,requestAnimationFrame(()=>{t.classList.remove(l)})}n.processedElements.push({element:e,mode:"child",clones:s})}(e,o,s,r):"self"===t&&function(e,t,r,n){const o=e.parentNode;if(!o)return void console.warn("[dupe] Element has no parent, cannot duplicate self:",e);const s=[];let i=e;for(let c=0;c<t;c++){const t=e.cloneNode(!0);t.classList.add(l),t.removeAttribute("data-hs-dupe"),t.removeAttribute("data-hs-dupe-count"),t.removeAttribute("data-hs-dupe-hidden"),t.removeAttribute("data-hs-dupe-no-select"),p(t,r),i.nextSibling?o.insertBefore(t,i.nextSibling):o.appendChild(t),s.push(t),i=t,t.offsetHeight,requestAnimationFrame(()=>{t.classList.remove(l)})}n.processedElements.push({element:e,mode:"self",clones:s})}(e,o,s,r)}),{result:`dupe processed ${r.processedElements.length} elements`,destroy:()=>{r.processedElements.forEach(({clones:e})=>{e.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)})}),r.processedElements.length=0}}}function p(e,t){if(t.hidden&&e.setAttribute("aria-hidden","true"),t.noSelect){const t=e;t.style.userSelect="none",t.style.webkitUserSelect="none",t.style.msUserSelect="none"}}async function h(){const s={destroyFunctions:[]},i=e.normalize;try{const l=await async function(e){const n=t(e,"source"),o=new Map;n.forEach(t=>{const r=t.getAttribute(e.attributes.properties.syncId);r&&o.set(r,t)});const s=t(e,"target");let i=0,c=0;return s.forEach(n=>{const s=n.getAttribute(e.attributes.properties.syncId);if(!s||!o.has(s))return void c++;const l=o.get(s),u=r(e,"item",n);if(!u)return void console.warn(`[sync] Target list "${s}" missing item template`);const d="child"===u.getAttribute(e.attributes.properties.syncMode),p=r(e,"ignore",n),h=t(e,"item",l);if(0===h.length)return void console.warn(`[sync] Source list "${s}" has no items`);let f;if(d){const e=u.firstElementChild;if(!e)return void console.warn(`[sync] Target list "${s}" has sync-mode="child" but item wrapper has no children`);f=e.cloneNode(!0)}else f=u.cloneNode(!0),f.removeAttribute(e.attributes.elements.item.primary.split("=")[0]);let m=!1;if(p){let e=p.nextElementSibling;for(;e;){if(e===u){m=!0;break}e=e.nextElementSibling}}if(d){for(;u.firstChild;)u.removeChild(u.firstChild);h.forEach(t=>{const r=f.cloneNode(!0);a(t,r,e),u.appendChild(r)}),u.removeAttribute(e.attributes.elements.item.primary.split("=")[0])}else{Array.from(n.children).forEach(e=>{e!==p&&e.remove()});const t=Array.from(h).map(t=>{const r=f.cloneNode(!0);return a(t,r,e),r});p?m?t.forEach(e=>{n.appendChild(e)}):t.forEach(e=>{n.insertBefore(e,p)}):t.forEach(e=>{n.appendChild(e)})}i++}),{result:`sync initialized (${i} synced, ${c} skipped)`}}(i.sync);l&&"destroy"in l&&"function"==typeof l.destroy&&s.destroyFunctions.push(l.destroy);const u=await async function(){const e={processedWrappers:[]};return t(o.clickable,"wrapper").forEach(t=>{const r=t.querySelector(":scope > button"),n=t.querySelector(":scope > a");if(!r||!n)return;const o=n.getAttribute("href");let s,i;o&&""!==o&&"#"!==o?(s=n,i=r):(s=r,i=n);const c="button"===s.getAttribute("data-hs-clickable");c||s.setAttribute("data-hs-clickable","button"),i.remove(),e.processedWrappers.push({wrapper:t,keptElement:s,wasLink:s===n,addedAttribute:!c})}),{result:`clickable processed ${e.processedWrappers.length} wrappers`,destroy:()=>{e.processedWrappers.forEach(({keptElement:e,addedAttribute:t})=>{t&&e.removeAttribute("data-hs-clickable")}),e.processedWrappers.length=0}}}();u&&"destroy"in u&&"function"==typeof u.destroy&&s.destroyFunctions.push(u.destroy);const p=await d(i.dupe);p&&"destroy"in p&&"function"==typeof p.destroy&&s.destroyFunctions.push(p.destroy);const h=(c=e.structure?.["site-settings"],function(){const e=r(c,"wrapper");if(!e)return;const o=t(c,"list",e);if(0===o.length)return;const s={};if(o.forEach(e=>{const t=n(c,"setting");e.querySelectorAll(t).forEach(e=>{const t=e.cloneNode(!0),r=n(c,"hide");t.querySelectorAll(r).forEach(e=>{const t=c.attributes.elements.hide.primary.match(/data-site-settings-hide/)[0],r=e.getAttribute(t);r&&r.split(" ").filter(e=>e.trim()).some(t=>e.classList.contains(t))&&e.remove()});const o=c.attributes.elements.setting.primary.match(/data-site-settings/)[0],i=e.getAttribute(o),a=t.textContent.trim(),l=e.getAttribute("href");i&&(a||l)&&(s[i]={text:a||null,href:l||null})})}),0===Object.keys(s).length)return;const i=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:e=>{const t=e.textContent;for(const r in s)if(t.includes(`{{${r}}}`))return NodeFilter.FILTER_ACCEPT;return NodeFilter.FILTER_SKIP}}),a=[];let l;for(;l=i.nextNode();)a.push(l);a.forEach(e=>{let t=e.textContent,r=!1;for(const n in s){const e=`{{${n}}}`;if(t.includes(e)){const o=s[n],i=o.text||o.href;i&&(t=t.replace(new RegExp(e,"g"),i),r=!0)}}r&&(e.textContent=t)}),document.querySelectorAll("a[href]").forEach(e=>{let t=e.getAttribute("href"),r=!1;for(const n in s){const e=`{{${n}}}`;if(t.includes(e)){const o=s[n];o.href?(t=o.href,r=!0):o.text&&(t=t.replace(new RegExp(e,"g"),o.text),r=!0)}}r&&e.setAttribute("href",t)})}(),{result:"site-settings initialized",destroy:()=>{}});h&&"destroy"in h&&"function"==typeof h.destroy&&s.destroyFunctions.push(h.destroy);const f=function(e){return function(){const t=(new Date).getFullYear().toString(),r=["January","February","March","April","May","June","July","August","September","October","November","December"][(new Date).getMonth()],n=e.attributes.placeholders.year,o=e.attributes.placeholders.month,s=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:e=>e.textContent.includes(n)||e.textContent.includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}),i=[];let c;for(;c=s.nextNode();)i.push(c);const a=new RegExp(n.replace(/[{}]/g,"\\$&"),"gi"),l=new RegExp(o.replace(/[{}]/g,"\\$&"),"gi");i.forEach(e=>{let n=e.textContent.replace(a,t);n=n.replace(l,r),n!==e.textContent&&(e.textContent=n)})}(),{result:"year-replacement initialized",destroy:()=>{}}}(e.structure?.["year-replacement"]);return f&&"destroy"in f&&"function"==typeof f.destroy&&s.destroyFunctions.push(f.destroy),{result:"normalize initialized",destroy:()=>{s.destroyFunctions.reverse().forEach(e=>{try{e()}catch(t){console.error("[normalize] Error during cleanup:",t)}}),s.destroyFunctions.length=0}}}catch(l){throw console.error("[normalize] Initialization failed:",l),s.destroyFunctions.reverse().forEach(e=>{try{e()}catch(t){console.error("[normalize] Error during error cleanup:",t)}}),l}var c}export{h as init};
2
- //# sourceMappingURL=hs-normalize-CTwtG5-a.js.map
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";import{q as t,a as r,g as n}from"./hs-attributeSelector-6pGcDBo-.js";import"./hs-modalManager-H_YegPAO.js";import{g as o}from"./hs-utils-CKm6QhLw.js";function s(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,null);let n;for(;n=r.nextNode();)n.nodeValue?.trim()&&t.push(n);return t}function i(e){const t=[];return e.hasAttribute("href")&&t.push(e),t.push(...Array.from(e.querySelectorAll("[href]"))),t}function c(e){if(e.hasAttribute("src")){if(e.getAttribute("src"))return e}const t=e.querySelector("[src]");if(t){if(t.getAttribute("src"))return t}return null}function a(e,t,r){if(function(e,t){const r=t.attributes.properties.syncField;return null!==e.querySelector(`[${r}]`)}(t,r))return void function(e,t,r){const n=r.attributes.properties.syncField;e.querySelectorAll(`[${n}]`).forEach(e=>{const r=e.getAttribute(n),o=t.querySelector(`[${n}="${r}"]`);if(!o)return;const i=c(e),a=c(o);if(i&&a){const e=i.getAttribute("src");e&&a.setAttribute("src",e)}else if(e.hasAttribute("href")&&o.hasAttribute("href")){const t=e.getAttribute("href");t&&o.setAttribute("href",t)}else{const t=s(e),r=t.length>0?t[0].nodeValue:e.textContent.trim();if(r){const e=s(o);e.length>0?e[0].nodeValue=r:o.textContent=r}}})}(e,t,r);const n=s(e),o=n.length>0?n[0].nodeValue:"",a=i(e),l=a.length>0?a[0].getAttribute("href"):"";if(o){s(t).forEach(e=>{e.nodeValue=o})}if(l){i(t).forEach(e=>{e.setAttribute("href",l)})}}const l="hs-dupe-no-transition";let u=!1;async function d(e){!function(){if(u)return;const e=document.createElement("style");e.textContent=`\n .${l},\n .${l} * {\n transition: none !important;\n animation: none !important;\n }\n `,document.head.appendChild(e),u=!0}();const r={processedElements:[]};return t(e,"wrapper").forEach(e=>{const t=e.getAttribute("data-hs-dupe");if(!t||"child"!==t&&"self"!==t)return void console.warn('[dupe] Invalid mode. Use "child" or "self":',e);const n=e.getAttribute("data-hs-dupe-count");let o=n?parseInt(n,10):1;(isNaN(o)||o<1)&&(console.warn("[dupe] Invalid count, using default of 1:",e),o=1),o>20&&(console.warn(`[dupe] Count of ${o} exceeds maximum of 20. Capping at 20.`),o=20);const s={hidden:e.hasAttribute("data-hs-dupe-hidden"),noSelect:e.hasAttribute("data-hs-dupe-no-select")};"child"===t?function(e,t,r,n){const o=e.children[0];if(!o)return;const s=[];for(let i=0;i<t;i++){const t=o.cloneNode(!0);t.classList.add(l),p(t,r),e.appendChild(t),s.push(t),t.offsetHeight,requestAnimationFrame(()=>{t.classList.remove(l)})}n.processedElements.push({element:e,mode:"child",clones:s})}(e,o,s,r):"self"===t&&function(e,t,r,n){const o=e.parentNode;if(!o)return void console.warn("[dupe] Element has no parent, cannot duplicate self:",e);const s=[];let i=e;for(let c=0;c<t;c++){const t=e.cloneNode(!0);t.classList.add(l),t.removeAttribute("data-hs-dupe"),t.removeAttribute("data-hs-dupe-count"),t.removeAttribute("data-hs-dupe-hidden"),t.removeAttribute("data-hs-dupe-no-select"),p(t,r),i.nextSibling?o.insertBefore(t,i.nextSibling):o.appendChild(t),s.push(t),i=t,t.offsetHeight,requestAnimationFrame(()=>{t.classList.remove(l)})}n.processedElements.push({element:e,mode:"self",clones:s})}(e,o,s,r)}),{result:`dupe processed ${r.processedElements.length} elements`,destroy:()=>{r.processedElements.forEach(({clones:e})=>{e.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)})}),r.processedElements.length=0}}}function p(e,t){if(t.hidden&&e.setAttribute("aria-hidden","true"),t.noSelect){const t=e;t.style.userSelect="none",t.style.webkitUserSelect="none",t.style.msUserSelect="none"}}async function h(){const s={destroyFunctions:[]},i=e.normalize;try{const l=await async function(e){const n=t(e,"source"),o=new Map;n.forEach(t=>{const r=t.getAttribute(e.attributes.properties.syncId);r&&o.set(r,t)});const s=t(e,"target");let i=0,c=0;return s.forEach(n=>{const s=n.getAttribute(e.attributes.properties.syncId);if(!s||!o.has(s))return void c++;const l=o.get(s),u=r(e,"item",n);if(!u)return void console.warn(`[sync] Target list "${s}" missing item template`);const d="child"===u.getAttribute(e.attributes.properties.syncMode),p=r(e,"ignore",n),h=t(e,"item",l);if(0===h.length)return void console.warn(`[sync] Source list "${s}" has no items`);let f;if(d){const e=u.firstElementChild;if(!e)return void console.warn(`[sync] Target list "${s}" has sync-mode="child" but item wrapper has no children`);f=e.cloneNode(!0)}else f=u.cloneNode(!0),f.removeAttribute(e.attributes.elements.item.primary.split("=")[0]);let m=!1;if(p){let e=p.nextElementSibling;for(;e;){if(e===u){m=!0;break}e=e.nextElementSibling}}if(d){for(;u.firstChild;)u.removeChild(u.firstChild);h.forEach(t=>{const r=f.cloneNode(!0);a(t,r,e),u.appendChild(r)}),u.removeAttribute(e.attributes.elements.item.primary.split("=")[0])}else{Array.from(n.children).forEach(e=>{e!==p&&e.remove()});const t=Array.from(h).map(t=>{const r=f.cloneNode(!0);return a(t,r,e),r});p?m?t.forEach(e=>{n.appendChild(e)}):t.forEach(e=>{n.insertBefore(e,p)}):t.forEach(e=>{n.appendChild(e)})}i++}),{result:`sync initialized (${i} synced, ${c} skipped)`}}(i.sync);l&&"destroy"in l&&"function"==typeof l.destroy&&s.destroyFunctions.push(l.destroy);const u=await async function(){const e={processedWrappers:[]};return t(o.clickable,"wrapper").forEach(t=>{const r=t.querySelector(":scope > button"),n=t.querySelector(":scope > a");if(!r||!n)return;const o=n.getAttribute("href");let s,i;o&&""!==o&&"#"!==o?(s=n,i=r):(s=r,i=n);const c="button"===s.getAttribute("data-hs-clickable");c||s.setAttribute("data-hs-clickable","button"),i.remove(),e.processedWrappers.push({wrapper:t,keptElement:s,wasLink:s===n,addedAttribute:!c})}),{result:`clickable processed ${e.processedWrappers.length} wrappers`,destroy:()=>{e.processedWrappers.forEach(({keptElement:e,addedAttribute:t})=>{t&&e.removeAttribute("data-hs-clickable")}),e.processedWrappers.length=0}}}();u&&"destroy"in u&&"function"==typeof u.destroy&&s.destroyFunctions.push(u.destroy);const p=await d(i.dupe);p&&"destroy"in p&&"function"==typeof p.destroy&&s.destroyFunctions.push(p.destroy);const h=(c=e.structure?.["site-settings"],function(){const e=r(c,"wrapper");if(!e)return;const o=t(c,"list",e);if(0===o.length)return;const s={};if(o.forEach(e=>{const t=n(c,"setting");e.querySelectorAll(t).forEach(e=>{const t=e.cloneNode(!0),r=n(c,"hide");t.querySelectorAll(r).forEach(e=>{const t=c.attributes.elements.hide.primary.match(/data-site-settings-hide/)[0],r=e.getAttribute(t);r&&r.split(" ").filter(e=>e.trim()).some(t=>e.classList.contains(t))&&e.remove()});const o=c.attributes.elements.setting.primary.match(/data-site-settings/)[0],i=e.getAttribute(o),a=t.textContent.trim(),l=e.getAttribute("href");i&&(a||l)&&(s[i]={text:a||null,href:l||null})})}),0===Object.keys(s).length)return;const i=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:e=>{const t=e.textContent;for(const r in s)if(t.includes(`{{${r}}}`))return NodeFilter.FILTER_ACCEPT;return NodeFilter.FILTER_SKIP}}),a=[];let l;for(;l=i.nextNode();)a.push(l);a.forEach(e=>{let t=e.textContent,r=!1;for(const n in s){const e=`{{${n}}}`;if(t.includes(e)){const o=s[n],i=o.text||o.href;i&&(t=t.replace(new RegExp(e,"g"),i),r=!0)}}r&&(e.textContent=t)}),document.querySelectorAll("a[href]").forEach(e=>{let t=e.getAttribute("href"),r=!1;for(const n in s){const e=`{{${n}}}`;if(t.includes(e)){const o=s[n];o.href?(t=o.href,r=!0):o.text&&(t=t.replace(new RegExp(e,"g"),o.text),r=!0)}}r&&e.setAttribute("href",t)})}(),{result:"site-settings initialized",destroy:()=>{}});h&&"destroy"in h&&"function"==typeof h.destroy&&s.destroyFunctions.push(h.destroy);const f=function(e){return function(){const t=(new Date).getFullYear().toString(),r=["January","February","March","April","May","June","July","August","September","October","November","December"][(new Date).getMonth()],n=e.attributes.placeholders.year,o=e.attributes.placeholders.month,s=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:e=>e.textContent.includes(n)||e.textContent.includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}),i=[];let c;for(;c=s.nextNode();)i.push(c);const a=new RegExp(n.replace(/[{}]/g,"\\$&"),"gi"),l=new RegExp(o.replace(/[{}]/g,"\\$&"),"gi");i.forEach(e=>{let n=e.textContent.replace(a,t);n=n.replace(l,r),n!==e.textContent&&(e.textContent=n)})}(),{result:"year-replacement initialized",destroy:()=>{}}}(e.structure?.["year-replacement"]);return f&&"destroy"in f&&"function"==typeof f.destroy&&s.destroyFunctions.push(f.destroy),{result:"normalize initialized",destroy:()=>{s.destroyFunctions.reverse().forEach(e=>{try{e()}catch(t){console.error("[normalize] Error during cleanup:",t)}}),s.destroyFunctions.length=0}}}catch(l){throw console.error("[normalize] Initialization failed:",l),s.destroyFunctions.reverse().forEach(e=>{try{e()}catch(t){console.error("[normalize] Error during error cleanup:",t)}}),l}var c}export{h as init};
2
- //# sourceMappingURL=hs-normalize-CTwtG5-a.js.map
@@ -1,2 +0,0 @@
1
- function e(e){const r=new Map;return{scan:async function(){const t=[],s=e.filter(e=>{const s=document.querySelector(e.selector);return s&&r.has(e.name)?(t.push({name:e.name,status:"already-loaded"}),!1):s}).map(e=>e.import().then(r=>({module:e,moduleExports:r,success:!0})).catch(r=>({module:e,error:r,success:!1}))),o=await Promise.allSettled(s);for(const e of o)if("fulfilled"===e.status&&e.value.success){const{module:s,moduleExports:o}=e.value;try{const{init:e}=o,a=void 0!==s.config?await e(s.config):await e();r.set(s.name,a),t.push({name:s.name,status:"loaded"})}catch(c){const e=c instanceof Error?c.message:String(c);console.error(`[orchestrator] Failed to initialize ${s.name}:`,c),t.push({name:s.name,status:"failed",error:e})}}else if("fulfilled"!==e.status||e.value.success)"rejected"===e.status&&console.error("[orchestrator] Unexpected error:",e.reason);else{const r=e.value,{module:s,error:o}=r,a=o instanceof Error?o.message:String(o);console.error(`[orchestrator] Failed to load ${s.name}:`,o),t.push({name:s.name,status:"failed",error:a})}const a=t.filter(e=>"loaded"===e.status),n=t.filter(e=>"failed"===e.status);return{results:t,loaded:a,failed:n}},destroy:function(){r.forEach((e,r)=>{try{e?.destroy&&e.destroy()}catch(t){console.error(`[orchestrator] Error destroying ${r}:`,t)}}),r.clear()}}}export{e as c};
2
- //# sourceMappingURL=hs-orchestrator-J8b7XRk1.js.map
@@ -1,2 +0,0 @@
1
- function e(e){const r=new Map;return{scan:async function(){const t=[],s=e.filter(e=>{const s=document.querySelector(e.selector);return s&&r.has(e.name)?(t.push({name:e.name,status:"already-loaded"}),!1):s}).map(e=>e.import().then(r=>({module:e,moduleExports:r,success:!0})).catch(r=>({module:e,error:r,success:!1}))),o=await Promise.allSettled(s);for(const e of o)if("fulfilled"===e.status&&e.value.success){const{module:s,moduleExports:o}=e.value;try{const{init:e}=o,a=void 0!==s.config?await e(s.config):await e();r.set(s.name,a),t.push({name:s.name,status:"loaded"})}catch(c){const e=c instanceof Error?c.message:String(c);console.error(`[orchestrator] Failed to initialize ${s.name}:`,c),t.push({name:s.name,status:"failed",error:e})}}else if("fulfilled"!==e.status||e.value.success)"rejected"===e.status&&console.error("[orchestrator] Unexpected error:",e.reason);else{const r=e.value,{module:s,error:o}=r,a=o instanceof Error?o.message:String(o);console.error(`[orchestrator] Failed to load ${s.name}:`,o),t.push({name:s.name,status:"failed",error:a})}const a=t.filter(e=>"loaded"===e.status),n=t.filter(e=>"failed"===e.status);return{results:t,loaded:a,failed:n}},destroy:function(){r.forEach((e,r)=>{try{e?.destroy&&e.destroy()}catch(t){console.error(`[orchestrator] Error destroying ${r}:`,t)}}),r.clear()}}}export{e as c};
2
- //# sourceMappingURL=hs-orchestrator-J8b7XRk1.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hs-orchestrator-J8b7XRk1.js","sources":["../../src/utils/orchestrator.ts"],"sourcesContent":["/**\n * Orchestrator Utility\n *\n * Generic orchestrator factory for registry-based module loading.\n * Provides consistent scanning, initialization, and cleanup across all orchestrators.\n *\n * Features:\n * - Registry-based module discovery\n * - Prevents duplicate initialization\n * - SPA-friendly rescan support\n * - Automatic cleanup on destroy\n * - Error handling per module\n *\n * Usage:\n * const REGISTRY = [\n * { name: 'counter', selector: '[data-hs-anim=\"counter\"]', import: () => import('./counter.ts') },\n * ];\n *\n * export async function init() {\n * const orchestrator = createOrchestrator(REGISTRY);\n * const results = await orchestrator.scan();\n *\n * return {\n * result: `initialized (${results.loaded.length} active)`,\n * rescan: orchestrator.scan,\n * destroy: orchestrator.destroy,\n * };\n * }\n */\n\nexport interface ModuleRegistryEntry<TConfig = unknown> {\n name: string;\n selector: string;\n import: () => Promise<{ init: (config?: TConfig) => Promise<ModuleInstance> | ModuleInstance }>;\n config?: TConfig;\n}\n\nexport interface ModuleInstance {\n result?: string;\n destroy?: () => void;\n rescan?: () => Promise<unknown>;\n}\n\nexport interface ScanResult {\n name: string;\n status: 'loaded' | 'failed' | 'already-loaded';\n error?: string;\n}\n\nexport interface OrchestratorReturn {\n scan: () => Promise<{ results: ScanResult[]; loaded: ScanResult[]; failed: ScanResult[] }>;\n destroy: () => void;\n}\n\n/**\n * Create an orchestrator for a module registry\n * @param registry - Array of module definitions with selectors and imports\n */\nexport function createOrchestrator(registry: ModuleRegistryEntry[]): OrchestratorReturn {\n const activeModules = new Map<string, ModuleInstance>();\n\n /**\n * Scan DOM and initialize modules that exist on the page\n */\n async function scan() {\n const results: ScanResult[] = [];\n\n // Step 1: Find which modules are on the page\n const modulesToLoad = registry.filter((module) => {\n const exists = document.querySelector(module.selector);\n if (exists && activeModules.has(module.name)) {\n results.push({ name: module.name, status: 'already-loaded' });\n return false; // Already loaded, skip\n }\n return exists;\n });\n\n // Step 2: Download all needed modules in parallel\n const importPromises = modulesToLoad.map((module) =>\n module\n .import()\n .then(\n (moduleExports) =>\n ({ module, moduleExports, success: true }) as {\n module: ModuleRegistryEntry;\n moduleExports: {\n init: (config?: unknown) => Promise<ModuleInstance> | ModuleInstance;\n };\n success: true;\n }\n )\n .catch(\n (error) =>\n ({ module, error, success: false }) as {\n module: ModuleRegistryEntry;\n error: unknown;\n success: false;\n }\n )\n );\n\n const importResults = await Promise.allSettled(importPromises);\n\n // Step 3: Initialize each successfully downloaded module\n for (const result of importResults) {\n if (result.status === 'fulfilled' && result.value.success) {\n // Success case: module downloaded successfully\n const { module, moduleExports } = result.value;\n try {\n const { init } = moduleExports;\n // Call init with config if provided, otherwise call with no args\n const instance = module.config !== undefined ? await init(module.config) : await init();\n activeModules.set(module.name, instance);\n results.push({ name: module.name, status: 'loaded' });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[orchestrator] Failed to initialize ${module.name}:`, error);\n results.push({ name: module.name, status: 'failed', error: errorMessage });\n }\n } else if (result.status === 'fulfilled' && !result.value.success) {\n // Download failed (caught by import's .catch())\n const value = result.value as {\n module: ModuleRegistryEntry;\n error: unknown;\n success: false;\n };\n const { module, error } = value;\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[orchestrator] Failed to load ${module.name}:`, error);\n results.push({ name: module.name, status: 'failed', error: errorMessage });\n } else if (result.status === 'rejected') {\n // Promise itself rejected (shouldn't happen with our catch handler)\n console.error(`[orchestrator] Unexpected error:`, result.reason);\n }\n }\n\n const loaded = results.filter((r) => r.status === 'loaded');\n const failed = results.filter((r) => r.status === 'failed');\n\n return { results, loaded, failed };\n }\n\n /**\n * Destroy all active modules and clear registry\n */\n function destroy() {\n activeModules.forEach((instance, name) => {\n try {\n if (instance?.destroy) {\n instance.destroy();\n }\n } catch (error) {\n console.error(`[orchestrator] Error destroying ${name}:`, error);\n }\n });\n activeModules.clear();\n }\n\n return {\n scan,\n destroy,\n };\n}\n"],"names":["createOrchestrator","registry","activeModules","Map","scan","async","results","importPromises","filter","module","exists","document","querySelector","selector","has","name","push","status","map","import","then","moduleExports","success","catch","error","importResults","Promise","allSettled","result","value","init","instance","config","set","errorMessage","Error","message","String","console","reason","loaded","r","failed","destroy","forEach","clear"],"mappings":"AA0DO,SAASA,EAAmBC,GACjC,MAAMC,MAAoBC,IAmG1B,MAAO,CACLC,KA/FFC,iBACE,MAAMC,EAAwB,GAaxBC,EAVgBN,EAASO,OAAQC,IACrC,MAAMC,EAASC,SAASC,cAAcH,EAAOI,UAC7C,OAAIH,GAAUR,EAAcY,IAAIL,EAAOM,OACrCT,EAAQU,KAAK,CAAED,KAAMN,EAAOM,KAAME,OAAQ,oBACnC,GAEFP,IAI4BQ,IAAKT,GACxCA,EACGU,SACAC,KACEC,IAAA,CACIZ,SAAQY,gBAAeC,SAAS,KAQtCC,MACEC,IAAA,CACIf,SAAQe,QAAOF,SAAS,MAQ7BG,QAAsBC,QAAQC,WAAWpB,GAG/C,IAAA,MAAWqB,KAAUH,EACnB,GAAsB,cAAlBG,EAAOX,QAA0BW,EAAOC,MAAMP,QAAS,CAEzD,MAAMb,OAAEA,EAAAY,cAAQA,GAAkBO,EAAOC,MACzC,IACE,MAAMC,KAAEA,GAAST,EAEXU,OAA6B,IAAlBtB,EAAOuB,aAA6BF,EAAKrB,EAAOuB,cAAgBF,IACjF5B,EAAc+B,IAAIxB,EAAOM,KAAMgB,GAC/BzB,EAAQU,KAAK,CAAED,KAAMN,EAAOM,KAAME,OAAQ,UAC5C,OAASO,GACP,MAAMU,EAAeV,aAAiBW,MAAQX,EAAMY,QAAUC,OAAOb,GACrEc,QAAQd,MAAM,uCAAuCf,EAAOM,QAASS,GACrElB,EAAQU,KAAK,CAAED,KAAMN,EAAOM,KAAME,OAAQ,SAAUO,MAAOU,GAC7D,CACF,SAA6B,cAAlBN,EAAOX,QAA2BW,EAAOC,MAAMP,QAW7B,aAAlBM,EAAOX,QAEhBqB,QAAQd,MAAM,mCAAoCI,EAAOW,YAbQ,CAEjE,MAAMV,EAAQD,EAAOC,OAKfpB,OAAEA,EAAAe,MAAQA,GAAUK,EACpBK,EAAeV,aAAiBW,MAAQX,EAAMY,QAAUC,OAAOb,GACrEc,QAAQd,MAAM,iCAAiCf,EAAOM,QAASS,GAC/DlB,EAAQU,KAAK,CAAED,KAAMN,EAAOM,KAAME,OAAQ,SAAUO,MAAOU,GAC7D,CAMF,MAAMM,EAASlC,EAAQE,OAAQiC,GAAmB,WAAbA,EAAExB,QACjCyB,EAASpC,EAAQE,OAAQiC,GAAmB,WAAbA,EAAExB,QAEvC,MAAO,CAAEX,UAASkC,SAAQE,SAC5B,EAoBEC,QAfF,WACEzC,EAAc0C,QAAQ,CAACb,EAAUhB,KAC/B,IACMgB,GAAUY,SACZZ,EAASY,SAEb,OAASnB,GACPc,QAAQd,MAAM,mCAAmCT,KAASS,EAC5D,IAEFtB,EAAc2C,OAChB,EAMF"}
@@ -1,2 +0,0 @@
1
- import{g as e}from"./hs-utils-CKm6QhLw.js";import{q as t,a as n,g as r}from"./hs-attributeSelector-6pGcDBo-.js";import{c as o}from"./hs-cssVariables-BjuwJfDJ.js";import"./hs-modalManager-H_YegPAO.js";import"../main.js";function i(i){const a={observers:[],handlers:[],liveRegions:[]};try{t(i,"wrapper").forEach(t=>{try{const s=function(t,i,a){const s=n(a,"list",t);if(!s)return console.warn("[pagination] Missing required element: list"),null;const l=s.parentElement;if(!l)return null;const c={controls:n(a,"controls",t),counter:n(a,"counter",t),dotsWrap:n(a,"dots",t),nextButton:null,prevButton:null};if(!c.controls)return{initialized:!1};const d=n(a,"next",t),u=n(a,"previous",t),g=r(e.clickable,"button"),p=d?.querySelector(g)||d,h=u?.querySelector(g)||u;if(!p||!h)return console.warn("[pagination] Missing required navigation buttons"),null;c.nextButton=p,c.prevButton=h,c.nextButton.setAttribute("aria-label","Go to next page"),c.prevButton.setAttribute("aria-label","Go to previous page"),c.counter&&(c.counter.setAttribute("aria-live","polite"),c.counter.setAttribute("aria-label","Current page"));const m=parseInt(c.controls?.getAttribute(a.attributes.properties.show)||"6")||6,v=parseInt(c.controls?.getAttribute(a.attributes.properties.showMobile)||String(m))||m,f=()=>getComputedStyle(s).getPropertyValue(o.state).trim()===e.cssVars.state.values.active,b=Array.from(s.children),y=b.length;if(!y)return null;const P={totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1,itemsPerPage:m,dotTemplates:{active:null,inactive:null}};let A=[];const x=document.createElement("div");x.className="sr-only",x.setAttribute("aria-live","assertive"),x.setAttribute("aria-atomic","true"),x.style.cssText="position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden;",t.appendChild(x),i.liveRegions.push(x);const E=()=>{c.counter&&(c.counter.textContent=`${P.currentPage} / ${P.totalPages}`)},w=()=>{x.textContent=`Page ${P.currentPage} of ${P.totalPages}`,setTimeout(()=>x.textContent="",1e3)},T=()=>{A.forEach((e,t)=>{const n=e;t===P.currentIndex?n.removeAttribute("inert"):n.setAttribute("inert","")})},C=()=>{const e=A[P.currentIndex];e&&void 0!==e.offsetHeight&&(l.style.height=e.offsetHeight+"px")},I=()=>{if(!c.dotsWrap)return;const e=Array.from(c.dotsWrap.children);if(!e.length)return;const t=e.find(e=>e.classList.contains("is-active")),n=e.find(e=>!e.classList.contains("is-active"));P.dotTemplates.active=t?t.cloneNode(!0):e[0].cloneNode(!0),P.dotTemplates.inactive=n?n.cloneNode(!0):e[0].cloneNode(!0),c.dotsWrap.innerHTML="",c.dotsWrap.setAttribute("role","group"),c.dotsWrap.setAttribute("aria-label","Page navigation");for(let r=1;r<=P.totalPages;r++){const e=(1===r?P.dotTemplates.active:P.dotTemplates.inactive).cloneNode(!0);e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label",`Go to page ${r}`),e.setAttribute("aria-current",1===r?"page":"false"),e.setAttribute("data-page",String(r)),1===r?e.classList.add("is-active"):e.classList.remove("is-active");const t=()=>k(r);e.addEventListener("click",t),i.handlers.push({element:e,event:"click",handler:t});const n=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),k(r))};e.addEventListener("keydown",n),i.handlers.push({element:e,event:"keydown",handler:n}),c.dotsWrap.appendChild(e)}},L=()=>{if(!c.dotsWrap)return;Array.from(c.dotsWrap.children).forEach((e,t)=>{t+1===P.currentPage?(e.classList.add("is-active"),e.setAttribute("aria-current","page")):(e.classList.remove("is-active"),e.setAttribute("aria-current","false"))})},W=(e=null)=>{const t=f();if(P.itemsPerPage=e||(t?v:m),P.totalPages=Math.ceil(y/P.itemsPerPage),c.dotsWrap&&(i.handlers=i.handlers.filter(({element:e})=>!c.dotsWrap.contains(e))),Array.from(l.children).forEach(e=>{e!==s&&l.removeChild(e)}),s.innerHTML="",b.forEach(e=>s.appendChild(e)),P.totalPages<=1)return c.controls&&(c.controls.contains(document.activeElement)&&document.activeElement&&document.activeElement.blur(),c.controls.style.display="none",c.controls.setAttribute("aria-hidden","true")),c.dotsWrap&&(c.dotsWrap.style.display="none",c.dotsWrap.setAttribute("aria-hidden","true")),Object.assign(P,{totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1}),l.style.cssText=`transform: translateX(0%); height: ${s.offsetHeight}px;`,A=[s],1;c.controls&&(c.controls.style.display="",c.controls.removeAttribute("aria-hidden")),c.dotsWrap&&(c.dotsWrap.style.display="",c.dotsWrap.removeAttribute("aria-hidden"));const n=Array.from({length:P.totalPages},(e,t)=>{const n=s.cloneNode(!1),r=t*P.itemsPerPage,o=Math.min(r+P.itemsPerPage,y);return b.slice(r,o).forEach(e=>n.appendChild(e.cloneNode(!0))),n});return l.insertBefore(n[n.length-1].cloneNode(!0),s),n.slice(1).forEach(e=>l.appendChild(e)),l.appendChild(n[0].cloneNode(!0)),s.innerHTML="",Array.from(n[0].children).forEach(e=>s.appendChild(e)),Object.assign(P,{currentIndex:1,currentPage:1,isAnimating:!1}),A=Array.from(l.children),l.style.transform="translateX(-100%)",E(),C(),T(),I(),P.totalPages};let B=f();const N=new ResizeObserver(()=>{if(P.isAnimating)return;const e=f();e!==B?(B=e,W()):C()});N.observe(l),i.observers.push(N),W();const k=e=>{if(P.isAnimating||P.totalPages<=1||e===P.currentPage)return;P.isAnimating=!0,P.currentIndex=e,P.currentPage=e,E(),w(),C(),L(),f()&&c.controls&&setTimeout(()=>{const e=80,t=c.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),l.style.transform=`translateX(${100*-P.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),l.removeEventListener("transitionend",n),E(),w(),C(),T(),L(),P.isAnimating=!1};t=setTimeout(n,1e3),l.addEventListener("transitionend",n)},H=e=>{if(P.isAnimating||P.totalPages<=1)return;P.isAnimating=!0,P.currentIndex+=e,P.currentPage=P.currentIndex>P.totalPages?1:P.currentIndex<1?P.totalPages:P.currentIndex,E(),w(),C(),L(),f()&&c.controls&&setTimeout(()=>{const e=80,t=c.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),l.style.transform=`translateX(${100*-P.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),l.removeEventListener("transitionend",n),P.currentIndex>P.totalPages?(P.currentIndex=1,P.currentPage=1,l.style.transition="none",l.style.transform="translateX(-100%)",l.offsetHeight,l.style.transition=""):P.currentIndex<1&&(P.currentIndex=P.totalPages,P.currentPage=P.totalPages,l.style.transition="none",l.style.transform=`translateX(${100*-P.totalPages}%)`,l.offsetHeight,l.style.transition=""),E(),w(),C(),T(),L(),P.isAnimating=!1};t=setTimeout(n,1e3),l.addEventListener("transitionend",n)},M=()=>H(1),$=()=>H(-1);return c.nextButton.addEventListener("click",M),c.prevButton.addEventListener("click",$),i.handlers.push({element:c.nextButton,event:"click",handler:M},{element:c.prevButton,event:"click",handler:$}),{initialized:!0}}(t,a,i);s||console.warn("[pagination] Failed to initialize container",t)}catch(s){console.error("[pagination] Error initializing container:",s,t)}})}catch(s){console.error("[pagination] Critical error during initialization:",s)}return{result:"pagination initialized",destroy:()=>{try{a.liveRegions.forEach(e=>{try{e.parentNode&&e.parentNode.removeChild(e)}catch(s){console.error("[pagination] Error removing live region:",s)}}),a.liveRegions.length=0,a.observers.forEach(e=>{try{e.disconnect()}catch(s){console.error("[pagination] Error disconnecting observer:",s)}}),a.observers.length=0,a.handlers.forEach(({element:e,event:t,handler:n})=>{try{e.removeEventListener(t,n)}catch(s){console.error("[pagination] Error removing event listener:",s)}}),a.handlers.length=0}catch(s){console.error("[pagination] Critical error during cleanup:",s)}}}}export{i as init};
2
- //# sourceMappingURL=hs-pagination-DcOxmDPJ.js.map
@@ -1,2 +0,0 @@
1
- import{g as e}from"./hs-utils-CKm6QhLw.js";import{q as t,a as n,g as r}from"./hs-attributeSelector-6pGcDBo-.js";import{c as o}from"./hs-cssVariables-BjuwJfDJ.js";import"./hs-modalManager-H_YegPAO.js";import"../main.js";function i(i){const a={observers:[],handlers:[],liveRegions:[]};try{t(i,"wrapper").forEach(t=>{try{const s=function(t,i,a){const s=n(a,"list",t);if(!s)return console.warn("[pagination] Missing required element: list"),null;const l=s.parentElement;if(!l)return null;const c={controls:n(a,"controls",t),counter:n(a,"counter",t),dotsWrap:n(a,"dots",t),nextButton:null,prevButton:null};if(!c.controls)return{initialized:!1};const d=n(a,"next",t),u=n(a,"previous",t),g=r(e.clickable,"button"),p=d?.querySelector(g)||d,h=u?.querySelector(g)||u;if(!p||!h)return console.warn("[pagination] Missing required navigation buttons"),null;c.nextButton=p,c.prevButton=h,c.nextButton.setAttribute("aria-label","Go to next page"),c.prevButton.setAttribute("aria-label","Go to previous page"),c.counter&&(c.counter.setAttribute("aria-live","polite"),c.counter.setAttribute("aria-label","Current page"));const m=parseInt(c.controls?.getAttribute(a.attributes.properties.show)||"6")||6,v=parseInt(c.controls?.getAttribute(a.attributes.properties.showMobile)||String(m))||m,f=()=>getComputedStyle(s).getPropertyValue(o.state).trim()===e.cssVars.state.values.active,b=Array.from(s.children),y=b.length;if(!y)return null;const P={totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1,itemsPerPage:m,dotTemplates:{active:null,inactive:null}};let A=[];const x=document.createElement("div");x.className="sr-only",x.setAttribute("aria-live","assertive"),x.setAttribute("aria-atomic","true"),x.style.cssText="position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden;",t.appendChild(x),i.liveRegions.push(x);const E=()=>{c.counter&&(c.counter.textContent=`${P.currentPage} / ${P.totalPages}`)},w=()=>{x.textContent=`Page ${P.currentPage} of ${P.totalPages}`,setTimeout(()=>x.textContent="",1e3)},T=()=>{A.forEach((e,t)=>{const n=e;t===P.currentIndex?n.removeAttribute("inert"):n.setAttribute("inert","")})},C=()=>{const e=A[P.currentIndex];e&&void 0!==e.offsetHeight&&(l.style.height=e.offsetHeight+"px")},I=()=>{if(!c.dotsWrap)return;const e=Array.from(c.dotsWrap.children);if(!e.length)return;const t=e.find(e=>e.classList.contains("is-active")),n=e.find(e=>!e.classList.contains("is-active"));P.dotTemplates.active=t?t.cloneNode(!0):e[0].cloneNode(!0),P.dotTemplates.inactive=n?n.cloneNode(!0):e[0].cloneNode(!0),c.dotsWrap.innerHTML="",c.dotsWrap.setAttribute("role","group"),c.dotsWrap.setAttribute("aria-label","Page navigation");for(let r=1;r<=P.totalPages;r++){const e=(1===r?P.dotTemplates.active:P.dotTemplates.inactive).cloneNode(!0);e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label",`Go to page ${r}`),e.setAttribute("aria-current",1===r?"page":"false"),e.setAttribute("data-page",String(r)),1===r?e.classList.add("is-active"):e.classList.remove("is-active");const t=()=>k(r);e.addEventListener("click",t),i.handlers.push({element:e,event:"click",handler:t});const n=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),k(r))};e.addEventListener("keydown",n),i.handlers.push({element:e,event:"keydown",handler:n}),c.dotsWrap.appendChild(e)}},L=()=>{if(!c.dotsWrap)return;Array.from(c.dotsWrap.children).forEach((e,t)=>{t+1===P.currentPage?(e.classList.add("is-active"),e.setAttribute("aria-current","page")):(e.classList.remove("is-active"),e.setAttribute("aria-current","false"))})},W=(e=null)=>{const t=f();if(P.itemsPerPage=e||(t?v:m),P.totalPages=Math.ceil(y/P.itemsPerPage),c.dotsWrap&&(i.handlers=i.handlers.filter(({element:e})=>!c.dotsWrap.contains(e))),Array.from(l.children).forEach(e=>{e!==s&&l.removeChild(e)}),s.innerHTML="",b.forEach(e=>s.appendChild(e)),P.totalPages<=1)return c.controls&&(c.controls.contains(document.activeElement)&&document.activeElement&&document.activeElement.blur(),c.controls.style.display="none",c.controls.setAttribute("aria-hidden","true")),c.dotsWrap&&(c.dotsWrap.style.display="none",c.dotsWrap.setAttribute("aria-hidden","true")),Object.assign(P,{totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1}),l.style.cssText=`transform: translateX(0%); height: ${s.offsetHeight}px;`,A=[s],1;c.controls&&(c.controls.style.display="",c.controls.removeAttribute("aria-hidden")),c.dotsWrap&&(c.dotsWrap.style.display="",c.dotsWrap.removeAttribute("aria-hidden"));const n=Array.from({length:P.totalPages},(e,t)=>{const n=s.cloneNode(!1),r=t*P.itemsPerPage,o=Math.min(r+P.itemsPerPage,y);return b.slice(r,o).forEach(e=>n.appendChild(e.cloneNode(!0))),n});return l.insertBefore(n[n.length-1].cloneNode(!0),s),n.slice(1).forEach(e=>l.appendChild(e)),l.appendChild(n[0].cloneNode(!0)),s.innerHTML="",Array.from(n[0].children).forEach(e=>s.appendChild(e)),Object.assign(P,{currentIndex:1,currentPage:1,isAnimating:!1}),A=Array.from(l.children),l.style.transform="translateX(-100%)",E(),C(),T(),I(),P.totalPages};let B=f();const N=new ResizeObserver(()=>{if(P.isAnimating)return;const e=f();e!==B?(B=e,W()):C()});N.observe(l),i.observers.push(N),W();const k=e=>{if(P.isAnimating||P.totalPages<=1||e===P.currentPage)return;P.isAnimating=!0,P.currentIndex=e,P.currentPage=e,E(),w(),C(),L(),f()&&c.controls&&setTimeout(()=>{const e=80,t=c.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),l.style.transform=`translateX(${100*-P.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),l.removeEventListener("transitionend",n),E(),w(),C(),T(),L(),P.isAnimating=!1};t=setTimeout(n,1e3),l.addEventListener("transitionend",n)},H=e=>{if(P.isAnimating||P.totalPages<=1)return;P.isAnimating=!0,P.currentIndex+=e,P.currentPage=P.currentIndex>P.totalPages?1:P.currentIndex<1?P.totalPages:P.currentIndex,E(),w(),C(),L(),f()&&c.controls&&setTimeout(()=>{const e=80,t=c.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),l.style.transform=`translateX(${100*-P.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),l.removeEventListener("transitionend",n),P.currentIndex>P.totalPages?(P.currentIndex=1,P.currentPage=1,l.style.transition="none",l.style.transform="translateX(-100%)",l.offsetHeight,l.style.transition=""):P.currentIndex<1&&(P.currentIndex=P.totalPages,P.currentPage=P.totalPages,l.style.transition="none",l.style.transform=`translateX(${100*-P.totalPages}%)`,l.offsetHeight,l.style.transition=""),E(),w(),C(),T(),L(),P.isAnimating=!1};t=setTimeout(n,1e3),l.addEventListener("transitionend",n)},M=()=>H(1),$=()=>H(-1);return c.nextButton.addEventListener("click",M),c.prevButton.addEventListener("click",$),i.handlers.push({element:c.nextButton,event:"click",handler:M},{element:c.prevButton,event:"click",handler:$}),{initialized:!0}}(t,a,i);s||console.warn("[pagination] Failed to initialize container",t)}catch(s){console.error("[pagination] Error initializing container:",s,t)}})}catch(s){console.error("[pagination] Critical error during initialization:",s)}return{result:"pagination initialized",destroy:()=>{try{a.liveRegions.forEach(e=>{try{e.parentNode&&e.parentNode.removeChild(e)}catch(s){console.error("[pagination] Error removing live region:",s)}}),a.liveRegions.length=0,a.observers.forEach(e=>{try{e.disconnect()}catch(s){console.error("[pagination] Error disconnecting observer:",s)}}),a.observers.length=0,a.handlers.forEach(({element:e,event:t,handler:n})=>{try{e.removeEventListener(t,n)}catch(s){console.error("[pagination] Error removing event listener:",s)}}),a.handlers.length=0}catch(s){console.error("[pagination] Critical error during cleanup:",s)}}}}export{i as init};
2
- //# sourceMappingURL=hs-pagination-DcOxmDPJ.js.map