@hortonstudio/main 1.9.31 → 1.9.33
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.
- package/dist/assets/{hs-animations-B2hXpM0Z.js → hs-animations-DSOzyBn9.js} +3 -3
- package/dist/assets/hs-animations-DSOzyBn9.js.br +0 -0
- package/dist/assets/hs-animations-DSOzyBn9.js.gz +0 -0
- package/dist/assets/{hs-animations-B2hXpM0Z.js.map → hs-animations-DSOzyBn9.js.map} +1 -1
- package/dist/assets/{hs-counter-DxT32FUj.js → hs-counter-J3XivMD4.js} +2 -2
- package/dist/assets/hs-counter-J3XivMD4.js.br +0 -0
- package/dist/assets/hs-counter-J3XivMD4.js.gz +0 -0
- package/dist/assets/{hs-counter-DxT32FUj.js.map → hs-counter-J3XivMD4.js.map} +1 -1
- package/dist/assets/hs-default-J2cvzRiu.js +2 -0
- package/dist/assets/hs-default-J2cvzRiu.js.br +0 -0
- package/dist/assets/hs-default-J2cvzRiu.js.gz +0 -0
- package/dist/assets/hs-default-J2cvzRiu.js.map +1 -0
- package/dist/assets/{hs-marquee-SNfwk82r.js → hs-marquee-Bq_EGDiW.js} +2 -2
- package/dist/assets/hs-marquee-Bq_EGDiW.js.br +0 -0
- package/dist/assets/hs-marquee-Bq_EGDiW.js.gz +0 -0
- package/dist/assets/{hs-marquee-SNfwk82r.js.map → hs-marquee-Bq_EGDiW.js.map} +1 -1
- package/dist/assets/{hs-normalize-B-mB80zY.js → hs-normalize-CW1mxe_R.js} +2 -2
- package/dist/assets/hs-normalize-CW1mxe_R.js.br +0 -0
- package/dist/assets/hs-normalize-CW1mxe_R.js.gz +0 -0
- package/dist/assets/{hs-normalize-B-mB80zY.js.map → hs-normalize-CW1mxe_R.js.map} +1 -1
- package/dist/assets/hs-utils-BfSJf3ld.js +2 -0
- package/dist/assets/hs-utils-BfSJf3ld.js.br +0 -0
- package/dist/assets/hs-utils-BfSJf3ld.js.gz +0 -0
- package/dist/assets/hs-utils-BfSJf3ld.js.map +1 -0
- package/dist/main.js +2 -2
- package/dist/main.js.br +0 -0
- package/dist/main.js.gz +0 -0
- package/dist/main.js.map +1 -1
- package/package.json +4 -1
- package/dist/assets/hs-animations-B2hXpM0Z.js.br +0 -0
- package/dist/assets/hs-animations-B2hXpM0Z.js.gz +0 -0
- package/dist/assets/hs-counter-DxT32FUj.js.br +0 -0
- package/dist/assets/hs-counter-DxT32FUj.js.gz +0 -0
- package/dist/assets/hs-default-BVsQjN21.js +0 -2
- package/dist/assets/hs-default-BVsQjN21.js.br +0 -0
- package/dist/assets/hs-default-BVsQjN21.js.gz +0 -0
- package/dist/assets/hs-default-BVsQjN21.js.map +0 -1
- package/dist/assets/hs-marquee-SNfwk82r.js.br +0 -0
- package/dist/assets/hs-marquee-SNfwk82r.js.gz +0 -0
- package/dist/assets/hs-normalize-B-mB80zY.js.br +0 -0
- package/dist/assets/hs-normalize-B-mB80zY.js.gz +0 -0
- package/dist/assets/hs-utils-BDoLvY4b.js +0 -2
- package/dist/assets/hs-utils-BDoLvY4b.js.br +0 -0
- package/dist/assets/hs-utils-BDoLvY4b.js.gz +0 -0
- package/dist/assets/hs-utils-BDoLvY4b.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const a={_global:{version:"2.0.0",apiName:"hsmain",attributes:{height:"data-hs-height",heightValue:"element",heightDuration:"data-hs-height-duration",heightEase:"data-hs-height-ease",moduleType:"data-hs-module-type",module:"data-hs-module"},classes:{modalOpen:"hs-modal-open",overflowHidden:"u-overflow-hidden",initialized:"hs-main",displayContents:"u-display-contents",active:"is-active",gsap:"hs-gsap",loading:"hs-loading"},cssVars:{prefix:"--_hs---",state:{name:"state",values:{active:"1",inactive:"0"}},clip:{name:"clip"},scrollOffset:{name:"scroll-offset"}},clickable:{module:"global-clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},normalize:{sync:{module:"sync",attributes:{elements:{source:{primary:"data-hs-sync='source'",aliases:[]},target:{primary:"data-hs-sync='target'",aliases:[]},item:{primary:"data-hs-sync='item'",aliases:[]},ignore:{primary:"data-hs-sync='ignore'",aliases:[]}},properties:{syncId:"data-hs-sync-id",syncField:"data-hs-sync-field",syncMode:"data-hs-sync-mode",syncValue:"data-hs-sync-value"}}},clickable:{module:"clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]}}},normalize:{module:"normalize",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},dupe:{module:"dupe",attributes:{elements:{wrapper:{primary:"data-hs-dupe",aliases:[]}},properties:{count:"data-hs-dupe-count",hidden:"data-hs-dupe-hidden",noSelect:"data-hs-dupe-no-select"}},modes:{child:"Duplicates the first direct child element",self:"Duplicates the element itself as a sibling"},modifiers:{hidden:"Adds aria-hidden='true' to clones for accessibility",noSelect:"Adds user-select: none to clones to prevent text selection"},limits:{maxCount:20}},schema:{module:"schema",attributes:{elements:{breadcrumb:{primary:"data-hs-schema='breadcrumb'",aliases:[]},services:{primary:"data-hs-schema='services'",aliases:[]},areas:{primary:"data-hs-schema='areas'",aliases:[]},"list-item":{primary:"data-hs-schema-list='item'",aliases:[]},service:{primary:"data-hs-schema='service'",aliases:[]},"service-name":{primary:"data-hs-schema-service='name'",aliases:[]},"service-description":{primary:"data-hs-schema-service='description'",aliases:[]},"faq-page":{primary:"data-hs-schema='faq-page'",aliases:[]},"faq-question":{primary:"data-hs-schema-faq='question'",aliases:[]},"faq-answer":{primary:"data-hs-schema-faq='answer'",aliases:[]},"faq-published":{primary:"data-hs-schema-faq='published'",aliases:[]},"faq-modified":{primary:"data-hs-schema-faq='modified'",aliases:[]},blog:{primary:"data-hs-schema='blog'",aliases:[]},"blog-name":{primary:"data-hs-schema-blog='name'",aliases:[]},"blog-published":{primary:"data-hs-schema-blog='published'",aliases:[]},"blog-modified":{primary:"data-hs-schema-blog='modified'",aliases:[]},"blog-summary":{primary:"data-hs-schema-blog='summary'",aliases:[]},"blog-author-name":{primary:"data-hs-schema-blog='author-name'",aliases:[]},"blog-author-type":{primary:"data-hs-schema-blog='author-type'",aliases:[]},"blog-author-role":{primary:"data-hs-schema-blog='author-role'",aliases:[]},"blog-author-image":{primary:"data-hs-schema-blog='author-image'",aliases:[]}}}},replace:{module:"replace",attributes:{elements:{element:{primary:"data-hs-replace",aliases:[]},hide:{primary:"data-hs-replace-hide",aliases:[]}}}}},default:{transition:{module:"transition",attributes:{elements:{wrapper:{primary:"data-hs-transition='wrapper'",aliases:["data-hs-transition='element'"]},exitTrigger:{primary:"data-hs-transition-exit-trigger",aliases:[]},enterTrigger:{primary:"data-hs-transition-enter-trigger",aliases:[]},trigger:{primary:"data-hs-transition-trigger",aliases:[]},namespace:{primary:"data-hs-transition-namespace",aliases:[]},exitTime:{primary:"data-hs-transition-exit-time",aliases:["data-hs-exit-time"]},firstDelay:{primary:"data-hs-transition-first-delay",aliases:["data-hs-delay"]}}}},"smooth-scroll":{module:"smooth-scroll",attributes:{elements:{"offset-proxy":{primary:"data-hs-scroll-offset='proxy'",aliases:[]}}}},accordion:{module:"accordion",attributes:{elements:{wrapper:{primary:"data-hs-accordion='wrapper'",aliases:[]},toggle:{primary:"data-hs-accordion='toggle'",aliases:[]},content:{primary:"data-hs-accordion='content'",aliases:[]},state:{primary:"data-hs-accordion-text='state'",aliases:[]}},properties:{default:"data-hs-accordion-default",open:"data-hs-accordion-open",closed:"data-hs-accordion-closed"}}},navbar:{module:"navbar",attributes:{elements:{wrapper:{primary:"data-hs-nav='wrapper'",aliases:[]},"skip-link":{primary:"data-hs-nav='skip-link'",aliases:[]}}},dropdown:{module:"dropdown",attributes:{elements:{wrapper:{primary:"data-hs-nav-dropdown='wrapper'",aliases:[]},list:{primary:"data-hs-nav-dropdown='list'",aliases:[]}},properties:{type:"data-hs-nav-dropdown-type"}},types:{hover:"Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",click:"Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"}},menu:{module:"menu",attributes:{elements:{wrapper:{primary:"data-hs-nav-menu='wrapper'",aliases:[]},button:{primary:"data-hs-nav-menu='button'",aliases:[]}}}},"arrow-navigation":{module:"arrow-navigation"}},toc:{module:"toc",attributes:{elements:{content:{primary:"data-hs-toc='content'",aliases:[]},list:{primary:"data-hs-toc='list'",aliases:[]}}},"progress-bar":{module:"progress-bar",attributes:{elements:{wrapper:{primary:"data-hs-toc-progress='wrapper'",aliases:[]},element:{primary:"data-hs-toc-progress='element'",aliases:[]}}}}},pagination:{module:"pagination",attributes:{elements:{wrapper:{primary:"data-hs-pagination='wrapper'",aliases:[]},list:{primary:"data-hs-pagination='list'",aliases:[]},controls:{primary:"data-hs-pagination='controls'",aliases:[]},previous:{primary:"data-hs-pagination='previous'",aliases:[]},next:{primary:"data-hs-pagination='next'",aliases:[]},counter:{primary:"data-hs-pagination='counter'",aliases:[]},dots:{primary:"data-hs-pagination='dots'",aliases:[]}},properties:{show:"data-hs-pagination-show",showMobile:"data-hs-pagination-show-mobile"}}},comparison:{module:"comparison",attributes:{elements:{wrapper:{primary:"data-hs-comparison='wrapper'",aliases:[]},"template-list":{primary:"data-hs-comparison-template='list'",aliases:[]},"template-item":{primary:"data-hs-comparison-template='item'",aliases:[]},"template-name":{primary:"data-hs-comparison-template='name'",aliases:[]},"template-description":{primary:"data-hs-comparison-template='description'",aliases:[]},"template-before-image":{primary:"data-hs-comparison-template='before-image'",aliases:[]},"template-after-image":{primary:"data-hs-comparison-template='after-image'",aliases:[]},name:{primary:"data-hs-comparison='name'",aliases:[]},description:{primary:"data-hs-comparison='description'",aliases:[]},"image-wrapper":{primary:"data-hs-comparison='image-wrapper'",aliases:[]},"before-image":{primary:"data-hs-comparison-image='before'",aliases:[]},"after-image":{primary:"data-hs-comparison-image='after'",aliases:[]},slider:{primary:"data-hs-comparison='slider'",aliases:[]},pagination:{primary:"data-hs-comparison='pagination'",aliases:[]}},properties:{modeType:"data-hs-comparison-mode",navType:"data-hs-comparison-nav"}}},tabs:{module:"tabs",attributes:{elements:{wrapper:{primary:"data-hs-tab='wrapper'",aliases:[]},links:{primary:"data-hs-tab='links'",aliases:[]},list:{primary:"data-hs-tab='list'",aliases:[]}},properties:{autoplay:"data-hs-tab-autoplay",duration:"data-hs-tab-duration",hover:"data-hs-tab-hover",animation:"data-hs-tab-animation",animationDuration:"data-hs-tab-animation-duration",controls:"data-hs-tab-controls"}},cssVars:{progress:"progress"}},form:{honeypot:{module:"honeypot",attributes:{elements:{"form-handler":{primary:"data-hs-form='form-handler'",aliases:[]}}}},range:{module:"range",attributes:{elements:{wrapper:{primary:"data-hs-form-range='wrapper'",aliases:[]},output:{primary:"data-hs-form-range='output'",aliases:[]}}},cssVars:{progress:"progress"}},test:{module:"form-test",attributes:{elements:{wrapper:{primary:"data-hs-form-test='wrapper'",aliases:[]},info:{primary:"data-hs-form-test='info'",aliases:[]}}}},select:{module:"select",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}},states:{module:"select-states",attributes:{elements:{states:{primary:"data-hs-form-select='states'",aliases:[]}}}},"custom-select":{module:"select-custom",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}}}}}},animations:{}};function e(a,e){const t=a.attributes?.elements?.[e];if(!t)return console.warn(`[attributeSelector] No config for element: ${e}`),"";return[`[${t.primary}]`,...(t.aliases||[]).map(a=>`[${a}]`)].join(", ")}function t(a,t,s=document){const r=e(a,t);return s.querySelectorAll(r)}function s(a,t,s=document){const r=e(a,t);return s.querySelector(r)}function r(){return document.documentElement.getAttributeNames().some(a=>a.startsWith("data-wf-"))}async function i(){return new Promise(a=>{const e=()=>{const t=document.documentElement,s=t.classList.contains("w-mod-ix3"),r=t.hasAttribute("data-wf-ix-ready");s||r?a():setTimeout(e,50)};e()})}let o=!1,n=0,l=0,c=!1,d=!1;function m(){if(c||!g())return;const a=window.gsap;let e=window.scrollY,t=performance.now(),s=0,r=0;window.ScrollTrigger.create({onUpdate:()=>{const a=window.scrollY,r=performance.now(),i=a-e,o=r-t;i>0?l=1:i<0&&(l=-1),o>0&&(s=Math.abs(i)/o*1e3),e=a,t=r}}),a.ticker.add(()=>{r+=.08*(s-r),s*=.95,Math.abs(r)<.1&&(r=0),Math.abs(s)<.1&&(s=0),n=r}),c=!0}function p(){return n}function u(){return l}function h(){return void 0!==window.gsap}function g(){return void 0!==window.ScrollTrigger}function y(){return void 0!==window.Draggable}function f(a,e=!0){return h()?{gsap:window.gsap,ScrollTrigger:window.ScrollTrigger,Draggable:window.Draggable}:(e&&!o?(console.warn("[gsap] GSAP library not detected. Some animations will be skipped. Add GSAP to your project: https://greensock.com/docs/v3/Installation"),o=!0):a&&!o&&(console.warn(`[${a}] GSAP not available, module will use fallback behavior`),o=!0),null)}function b(a,e,t="warn"){const s=[];if(e.forEach(a=>{"ScrollTrigger"!==a||g()?"Draggable"!==a||y()||s.push("Draggable"):s.push("ScrollTrigger")}),0===s.length)return;const r=s.join(", "),i="error"===t?`[${a}] Missing required GSAP plugin(s): ${r}. Module will not work correctly. Add to your project: https://greensock.com/docs/v3/Installation`:`[${a}] Missing optional GSAP plugin(s): ${r}. Some features will be disabled. Add for full functionality: https://greensock.com/docs/v3/Installation`;"error"===t?console.error(i):console.warn(i)}function w(){if(d||!g())return;let a=null;document.addEventListener("load",e=>{e.target instanceof HTMLImageElement&&(null!==a&&clearTimeout(a),a=setTimeout(()=>{window.ScrollTrigger.refresh(),a=null},50))},!0),d=!0}function v(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}const S=Object.freeze(Object.defineProperty({__proto__:null,getGsap:f,getScrollDirection:u,getScrollVelocity:p,hasDraggable:y,hasGsap:h,hasScrollTrigger:g,initScrollAnimations:async function(){if(await i(),h()&&document.body.scrollHeight>window.innerHeight){const a=window.gsap,e=window.scrollY;a.set(window,{scrollTo:e+1}),a.set(window,{scrollTo:e})}},initScrollTriggerRefresh:w,initScrollVelocityTracking:m,prefersReducedMotion:v,warnMissingDependencies:b},Symbol.toStringTag,{value:"Module"}));const k=new class{#a=new Map;async animate(e,t,s={}){const r=f("heightAnimator");if(!r)return;const{gsap:i}=r,o=a._global.attributes.height,n=a._global.attributes.heightValue,l=a._global.attributes.heightDuration,c=a._global.attributes.heightEase,d=e.hasAttribute?.(o)&&e.getAttribute(o)===n?e:e.querySelector?.(`[${o}="${n}"]`)||e,m=this.#a.get(d);m&&(m.kill(),this.#a.delete(d));let p=d.getAttribute(l),u=d.getAttribute(c);!p&&d.parentElement&&(p=d.parentElement.getAttribute(l)),!u&&d.parentElement&&(u=d.parentElement.getAttribute(c));let h=p?parseInt(p,10)/1e3:(s.duration||300)/1e3;v()&&(h=0);const g=u||s.ease||"power2.inOut",y=i.to(d,{height:t?"auto":0,duration:h,ease:g});this.#a.set(d,y);try{await y.then()}finally{this.#a.delete(d)}}setHeight(e,t){const s=f("heightAnimator");if(!s)return;const{gsap:r}=s,i=a._global.attributes.height,o=a._global.attributes.heightValue,n=e.hasAttribute?.(i)&&e.getAttribute(i)===o?e:e.querySelector?.(`[${i}="${o}"]`)||e;r.set(n,{height:t?"auto":0})}cancelAll(){this.#a.forEach(a=>a.kill()),this.#a.clear()}},A=k.animate.bind(k),E=k.setHeight.bind(k);let M=0;const x=[],T=[];let q=!0,_=null;function D(){if(!q)return null;if(_)return _;const a=window;return a.lenis&&"function"==typeof a.lenis.stop&&"function"==typeof a.lenis.start?(_=a.lenis,a.lenis):null}function $(){if(M++,1===M){const t=a._global.classes.modalOpen,s=a._global.classes.overflowHidden;document.body.classList.add(s,t);const r=D();if(r)try{r.stop()}catch(e){console.error("[modalManager] Error stopping Lenis:",e)}x.forEach(a=>{try{a()}catch(e){console.error("[modalManager] Error in open callback:",e)}})}}function O(){if(M--,0===M){const t=a._global.classes.modalOpen,s=a._global.classes.overflowHidden;document.body.classList.remove(s,t);const r=D();if(r)try{r.start()}catch(e){console.error("[modalManager] Error starting Lenis:",e)}T.forEach(a=>{try{a()}catch(e){console.error("[modalManager] Error in close callback:",e)}})}M<0&&(console.warn("[modalManager] Modal count went negative, resetting to 0"),M=0)}if("undefined"!=typeof window){const a=window;a.HS=a.HS||{},a.HS.modal={open:$,close:O,getCount:function(){return M},isOpen:function(){return M>0},onOpen:function(a){return"function"!=typeof a?(console.warn("[modalManager] onModalOpen requires a function"),()=>{}):(x.push(a),()=>{const e=x.indexOf(a);e>-1&&x.splice(e,1)})},onClose:function(a){return"function"!=typeof a?(console.warn("[modalManager] onModalClose requires a function"),()=>{}):(T.push(a),()=>{const e=T.indexOf(a);e>-1&&T.splice(e,1)})},setLenisEnabled:function(a){q=a,a||(_=null)}}}const H=a._global.cssVars,V={state:H.prefix+H.state.name,clip:H.prefix+H.clip?.name};function j(a){const e=new Map;return{scan:async function(){const t=[],s=a.filter(a=>{const s=document.querySelector(a.selector);return s&&e.has(a.name)?(t.push({name:a.name,status:"already-loaded"}),!1):s}).map(a=>a.import().then(e=>({module:a,moduleExports:e,success:!0})).catch(e=>({module:a,error:e,success:!1}))),r=await Promise.allSettled(s);for(const a of r)if("fulfilled"===a.status&&a.value.success){const{module:s,moduleExports:r}=a.value;try{const{init:a}=r,i=void 0!==s.config?await a(s.config):await a();e.set(s.name,i),t.push({name:s.name,status:"loaded"})}catch(n){const a=n instanceof Error?n.message:String(n);console.error(`[orchestrator] Failed to initialize ${s.name}:`,n),t.push({name:s.name,status:"failed",error:a})}}else if("fulfilled"!==a.status||a.value.success)"rejected"===a.status&&console.error("[orchestrator] Unexpected error:",a.reason);else{const e=a.value,{module:s,error:r}=e,i=r instanceof Error?r.message:String(r);console.error(`[orchestrator] Failed to load ${s.name}:`,r),t.push({name:s.name,status:"failed",error:i})}const i=t.filter(a=>"loaded"===a.status),o=t.filter(a=>"failed"===a.status);return{results:t,loaded:i,failed:o}},destroy:function(){e.forEach((a,e)=>{try{a?.destroy&&a.destroy()}catch(t){console.error(`[orchestrator] Error destroying ${e}:`,t)}}),e.clear()}}}const L=a._global;export{s as a,e as b,a as c,f as d,A as e,O as f,L as g,V as h,r as i,b as j,j as k,m as l,w as m,u as n,$ as o,v as p,t as q,p as r,E as s,S as t,i as w};
|
|
2
|
+
//# sourceMappingURL=hs-utils-BfSJf3ld.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hs-utils-BfSJf3ld.js","sources":["../../src/config.ts","../../src/utils/attributeSelector.ts","../../src/utils/webflow.ts","../../src/utils/gsap.ts","../../src/utils/heightAnimator.ts","../../src/utils/modalManager.ts","../../src/utils/cssVariables.ts","../../src/utils/orchestrator.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Master Configuration\n *\n * Single source of truth for all module configs with TypeScript type safety.\n * Provides autocomplete and type checking for all configuration access.\n */\nimport configData from './config.json';\n\n// TypeScript interfaces for autocomplete and type safety\n\nexport interface AttributeConfig {\n primary: string;\n aliases: string[];\n}\n\nexport interface ModuleConfig {\n module: string;\n description?: string;\n attributes?: {\n elements?: Record<string, AttributeConfig>;\n properties?: Record<string, string>;\n placeholders?: Record<string, string>;\n note?: string;\n };\n modes?: Record<string, string>;\n modifiers?: Record<string, string>;\n limits?: Record<string, number>;\n types?: Record<string, string>;\n defaults?: Record<string, string>;\n}\n\nexport interface GlobalConfig {\n version: string;\n apiName: string;\n attributes: {\n height: string;\n heightValue: string;\n heightDuration: string;\n heightEase: string;\n moduleType: string;\n module: string;\n };\n classes: {\n modalOpen: string;\n overflowHidden: string;\n initialized: string;\n displayContents: string;\n active: string;\n gsap: string;\n };\n cssVars: {\n prefix: string;\n state: {\n name: string;\n values: {\n active: string;\n inactive: string;\n };\n };\n clip: {\n name: string;\n };\n };\n clickable: ModuleConfig;\n}\n\nexport interface Config {\n _global: GlobalConfig;\n normalize?: {\n schema?: ModuleConfig;\n sync?: ModuleConfig;\n clickable?: ModuleConfig & {\n normalize?: ModuleConfig;\n };\n dupe?: ModuleConfig;\n replace?: ModuleConfig;\n };\n default?: {\n transition?: ModuleConfig;\n 'smooth-scroll'?: ModuleConfig;\n accordion?: ModuleConfig;\n navbar?: ModuleConfig & {\n dropdown?: ModuleConfig;\n menu?: ModuleConfig;\n 'arrow-navigation'?: ModuleConfig;\n };\n toc?: ModuleConfig & {\n 'progress-bar'?: ModuleConfig;\n };\n pagination?: ModuleConfig;\n comparison?: ModuleConfig;\n tabs?: ModuleConfig & {\n cssVars?: {\n progress?: string;\n };\n };\n form?: {\n honeypot?: ModuleConfig;\n range?: ModuleConfig & {\n cssVars?: {\n progress?: string;\n };\n };\n test?: ModuleConfig;\n select?: ModuleConfig & {\n states?: ModuleConfig;\n 'custom-select'?: ModuleConfig;\n };\n };\n };\n animations?: {};\n [key: string]: unknown;\n}\n\n// Export typed config\nexport const config = configData as Config;\nexport default config;\n","/**\n * Attribute Selector Utility\n *\n * Builds CSS selectors from module config to support primary attributes + aliases.\n * Enables easy rebranding and backward compatibility.\n */\n\ninterface AttributeSelectorConfig {\n module?: string;\n attributes?: {\n elements?: {\n [key: string]: {\n primary: string;\n aliases?: string[];\n };\n };\n };\n}\n\n/**\n * Builds a CSS selector from config attribute patterns\n */\nexport function getSelector(config: AttributeSelectorConfig, elementKey: string): string {\n const element = config.attributes?.elements?.[elementKey];\n if (!element) {\n console.warn(`[attributeSelector] No config for element: ${elementKey}`);\n return '';\n }\n\n const selectors = [\n `[${element.primary}]`,\n ...(element.aliases || []).map((alias: string) => `[${alias}]`),\n ];\n\n return selectors.join(', ');\n}\n\n/**\n * Gets all matching elements for a given element type\n */\nexport function querySelectorAll(\n config: AttributeSelectorConfig,\n elementKey: string,\n root: Document | Element = document\n): NodeListOf<Element> {\n const selector = getSelector(config, elementKey);\n return root.querySelectorAll(selector);\n}\n\n/**\n * Gets first matching element for a given element type\n */\nexport function querySelector(\n config: AttributeSelectorConfig,\n elementKey: string,\n root: Document | Element = document\n): Element | null {\n const selector = getSelector(config, elementKey);\n return root.querySelector(selector);\n}\n\n/**\n * Logs deprecation warning if using non-primary attributes\n */\nexport function checkDeprecated(\n element: Element | null,\n config: AttributeSelectorConfig,\n elementKey: string\n): void {\n if (!element) return;\n\n const elementConfig = config.attributes.elements[elementKey];\n const elementAttrs = element.getAttributeNames();\n\n elementConfig.aliases?.forEach((alias: string) => {\n const attrName = alias.split('=')[0].replace(/[\\[\\]']/g, '');\n if (elementAttrs.includes(attrName)) {\n console.warn(\n `[${config.module}] Using deprecated attribute \"${alias}\". ` +\n `Please use \"${elementConfig.primary}\" instead. ` +\n `Support for deprecated attributes will be removed in v3.0.0`\n );\n }\n });\n}\n","/**\n * Webflow Platform Utility\n *\n * Handles Webflow-specific initialization requirements including IX3 detection.\n * Auto-detects Webflow via data-wf-* attributes on <html> element.\n *\n * Features:\n * - Auto-detects Webflow platform\n * - Waits for IX3 initialization\n * - Manual override with data-hs-wf-off\n */\n\n/**\n * Detect if running on Webflow platform\n * Checks for any data-wf-* attribute on <html> element\n */\nexport function isWebflow(): boolean {\n const html = document.documentElement;\n const attributes = html.getAttributeNames();\n return attributes.some((attr) => attr.startsWith('data-wf-'));\n}\n\n/**\n * Wait for Webflow IX3 to be ready\n * Polls for multiple IX ready signals indefinitely (no timeout)\n * @returns Promise<void> - resolves when IX3 is detected\n */\nexport async function waitForIx3(): Promise<void> {\n return new Promise((resolve) => {\n const checkIx3 = () => {\n const html = document.documentElement;\n\n // Check all known IX ready signals (supports old and new Webflow versions)\n const hasLegacyIx3 = html.classList.contains('w-mod-ix3');\n const hasNewIxSignal = html.hasAttribute('data-wf-ix-ready');\n const hasAnyIxSignal = hasLegacyIx3 || hasNewIxSignal;\n\n if (hasAnyIxSignal) {\n resolve(); // IX3 loaded successfully\n } else {\n setTimeout(checkIx3, 50); // Keep checking indefinitely\n }\n };\n checkIx3();\n });\n}\n\n/**\n * Check if Webflow waiting should be disabled via script attribute\n * Looks for data-hs-wf-off on module script tag\n */\nexport function shouldSkipWebflow(scripts: Element[]): boolean {\n return scripts.some((script) => script.hasAttribute('data-hs-wf-off'));\n}\n","/**\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\nimport { waitForIx3 } from './webflow.ts';\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/**\n * Initialize scroll-based animations after IX3 loads\n * Triggers ScrollTrigger by performing a mock scroll (1px down, then back)\n * Waits indefinitely for IX3 - this runs independently without blocking other initialization\n */\nexport async function initScrollAnimations(): Promise<void> {\n // Wait for IX3 to load (waits indefinitely, no timeout)\n await waitForIx3();\n\n // Trigger scroll-based animations (only if page is scrollable)\n if (hasGsap() && document.body.scrollHeight > window.innerHeight) {\n const gsap = window.gsap!;\n const currentScroll = window.scrollY;\n gsap.set(window, { scrollTo: currentScroll + 1 });\n gsap.set(window, { scrollTo: currentScroll });\n }\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","/**\n * CSS Variables\n *\n * Centralized CSS variable names built from global config.\n * Ensures consistency across all modules.\n *\n * Usage:\n * import cssVariables from '@utils/cssVariables';\n * const value = getComputedStyle(el).getPropertyValue(cssVariables.state);\n */\n\nimport config from '@config';\n\nconst globalCssVars = config._global.cssVars as {\n prefix: string;\n state: { name: string };\n clip?: { name: string };\n};\n\nconst cssVariables = {\n prefix: globalCssVars.prefix,\n state: globalCssVars.prefix + globalCssVars.state.name,\n clip: globalCssVars.prefix + (globalCssVars.clip?.name || 'clip'),\n};\n\nexport default cssVariables;\n","/**\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","/**\n * Utils Barrel Export\n *\n * Centralized export for all utility functions.\n * Enables cleaner imports across modules.\n */\n\n// Attribute selector utilities\nexport {\n getSelector,\n querySelectorAll,\n querySelector,\n checkDeprecated,\n} from './utils/attributeSelector.ts';\n\n// Height animation utilities\nexport { animateHeight, setHeight } from './utils/heightAnimator.ts';\n\n// Modal manager utilities\nexport {\n openModal,\n closeModal,\n onModalOpen,\n onModalClose,\n getActiveModalCount,\n isModalOpen,\n} from './utils/modalManager.ts';\n\n// Import config to extract globalConfig\nimport config from '@config';\n\n// Export globalConfig from master config\nexport const globalConfig = config._global;\n\n// CSS variables utility (default export becomes named export)\nexport { default as cssVariables } from './utils/cssVariables.ts';\n\n// GSAP utilities\nexport {\n getGsap,\n hasGsap,\n hasScrollTrigger,\n hasDraggable,\n resetGsapWarning,\n prefersReducedMotion,\n initScrollVelocityTracking,\n initScrollTriggerRefresh,\n getScrollVelocity,\n getScrollDirection,\n warnMissingDependencies,\n type GsapTimeline,\n type GsapTween,\n} from './utils/gsap.ts';\n\n// Orchestrator utility\nexport {\n createOrchestrator,\n type ModuleRegistryEntry,\n type ModuleInstance,\n type ScanResult,\n type OrchestratorReturn,\n} from './utils/orchestrator.ts';\n\n// Webflow platform utilities\nexport { isWebflow, waitForIx3, shouldSkipWebflow } from './utils/webflow.ts';\n\n// Config types\nexport { type ModuleConfig } from './config.ts';\n"],"names":["config","getSelector","elementKey","element","attributes","elements","console","warn","primary","aliases","map","alias","join","querySelectorAll","root","document","selector","querySelector","isWebflow","documentElement","getAttributeNames","some","attr","startsWith","async","waitForIx3","Promise","resolve","checkIx3","html","hasLegacyIx3","classList","contains","hasNewIxSignal","hasAttribute","setTimeout","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","hasGsap","hasDraggable","Draggable","getGsap","moduleName","required","warnMissingDependencies","dependencies","severity","missing","forEach","dep","push","length","pluginList","message","error","initScrollTriggerRefresh","refreshTimeout","addEventListener","e","target","HTMLImageElement","clearTimeout","refresh","prefersReducedMotion","matchMedia","matches","body","scrollHeight","innerHeight","currentScroll","set","scrollTo","heightAnimator","activeAnimations","Map","animate","isOpen","options","gsapLib","heightAttr","_global","height","heightValue","durationAttr","heightDuration","easeAttr","heightEase","heightTarget","getAttribute","existingAnim","this","get","kill","delete","durationValue","easeValue","parentElement","duration","parseInt","ease","animation","to","then","setHeight","cancelAll","anim","clear","animateHeight","bind","activeModalCount","openCallbacks","closeCallbacks","lenisEnabled","lenisInstance","getLenis","win","lenis","stop","start","openModal","modalOpenClass","classes","modalOpen","overflowHiddenClass","overflowHidden","callback","closeModal","remove","HS","modal","open","close","getCount","onOpen","index","indexOf","splice","onClose","setLenisEnabled","enabled","globalCssVars","cssVars","cssVariables","state","prefix","name","clip","createOrchestrator","registry","activeModules","scan","results","importPromises","filter","module","exists","has","status","import","moduleExports","success","catch","importResults","allSettled","result","value","init","instance","errorMessage","Error","String","reason","loaded","r","failed","destroy","globalConfig"],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-normalize-
|
|
2
|
-
import{c as e}from"./assets/hs-utils-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-normalize-CW1mxe_R.js","assets/hs-utils-BfSJf3ld.js","assets/hs-default-J2cvzRiu.js","assets/hs-animations-DSOzyBn9.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as e}from"./assets/hs-utils-BfSJf3ld.js";const t={},s=function(e,s,o){let a=Promise.resolve();if(s&&s.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),n=o?.nonce||o?.getAttribute("nonce");a=e(s.map(e=>{if((e=function(e){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.33/dist/"+e}(e))in t)return;t[e]=!0;const s=e.endsWith(".css"),o=s?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${o}`))return;const a=document.createElement("link");return a.rel=s?"stylesheet":"modulepreload",s||(a.as="script"),a.crossOrigin="",a.href=e,n&&a.setAttribute("nonce",n),document.head.appendChild(a),s?new Promise((t,s)=>{a.addEventListener("load",t),a.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function n(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return a.then(t=>{for(const e of t||[])"rejected"===e.status&&n(e.reason);return e().catch(n)})},o=e._global.apiName;(async()=>{if(window[o]&&!Array.isArray(window[o])&&window[o].loaded)return;document.documentElement.classList.add(e._global.classes.initialized);const t=Array.isArray(window[o])?window[o]:[],a={normalize:()=>s(()=>import("./assets/hs-normalize-CW1mxe_R.js"),__vite__mapDeps([0,1])),default:()=>s(()=>import("./assets/hs-default-J2cvzRiu.js"),__vite__mapDeps([2,1])),animations:()=>s(()=>import("./assets/hs-animations-DSOzyBn9.js"),__vite__mapDeps([3,1]))};let n=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===n.length&&(n=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(e=>{const t=e.src,s=import.meta.url,o=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],a=s.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return o&&a&&o.split("@")[0]===a.split("@")[0]}));const r={isSPA:n.some(e=>"true"===e.getAttribute("data-hs-spa"))},i={normalize:{modules:["normalize"],parallel:!1},default:{modules:["default","animations"],parallel:!0}},l=async e=>{const t=window[o];if(t.process.has(e))return t.modules[e]?.loading;t.process.add(e);const s=t.modules[e]||{};let n;t.modules[e]=s,s.loading=new Promise((e,t)=>{s.resolve=e,s.reject=t});try{const{init:o}=await a[e](),r=await o()||{};n=r.destroy;const i=r.result;return s.destroy=()=>{n?.(),t.process.delete(e)},s.restart=()=>{s.destroy?.(),t.load(e)},s.resolve?.(i),delete s.resolve,delete s.reject,i}catch(r){throw n?.(),s.reject?.(r),t.process.delete(e),r}},d=async e=>{const t=i[e];if(t.parallel){const e=t.modules.map(e=>l(e));await Promise.allSettled(e)}else for(const s of t.modules)await l(s)},c=async()=>{await Promise.allSettled([a.normalize(),a.default(),a.animations()]),await d("normalize"),await d("default"),(()=>{const e=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(e)})();const{initScrollAnimations:e}=await s(async()=>{const{initScrollAnimations:e}=await import("./assets/hs-utils-BfSJf3ld.js").then(e=>e.t);return{initScrollAnimations:e}},[]);e().catch(e=>{console.error("[hsmain] Scroll animations failed to initialize:",e)})},u=[];window[o]={scripts:n,settings:r,modules:{},process:new Set,load:l,loaded:!1,push(...e){for(const[t,s]of e)"function"==typeof s?this.modules[t]?.loading?.then(s):this.load(t)},destroy(){for(const e in this.modules)this.modules[e]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await c(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(e=>{e.querySelectorAll("script[data-hs-module]").forEach(e=>{const t=e.getAttribute("data-hs-module-type"),s=e.getAttribute("data-hs-module");if(t&&s){const e=`data-hs-${t}-${s}`;a[e]&&this.load(e)}})})},afterReady(e){"function"==typeof e&&(this.loaded?e():u.push(e))},status(e){return e?{loaded:!!this.modules[e],loading:this.process.has(e)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:i}}};(async()=>{window[o].push(...t),await c(),window[o].loaded=!0,u.forEach(e=>{try{e()}catch{}}),u.length=0})().catch(()=>{})})();export{s as _};
|
|
3
3
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.br
CHANGED
|
Binary file
|
package/dist/main.js.gz
CHANGED
|
Binary file
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["API_NAME","config","_global","apiName","async","window","Array","isArray","loaded","document","documentElement","classList","add","classes","initialized","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","initPromises","map","name","allSettled","initializeInPhases","initScrollAnimations","then","n","t","event","CustomEvent","dispatchEvent","triggerDomReady","readyCallbacks","Set","push","items","callback","this","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","catch","initializeHsMain"],"ignoreList":[],"sources":["../index.ts"],"sourcesContent":["/**\n * Main Entry Point\n *\n * 2-phase initialization system: Normalize → Default + Animations.\n * Handles module loading, lifecycle management, and SPA coordination.\n */\nimport config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async (): Promise<void> => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n // Add initialized class to HTML element immediately\n document.documentElement.classList.add(config._global.classes.initialized);\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = (script as HTMLScriptElement).src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 2-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations in parallel\n },\n };\n\n const loadModule = async (moduleName: string): Promise<unknown> => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy: (() => void) | undefined;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy as (() => void) | undefined;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to execute a phase (modules already downloaded)\n const executePhase = async (phaseName: string): Promise<void> => {\n const phase = PHASES[phaseName];\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name: string) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Initialize all modules in 2 phases\n const initializeInPhases = async (): Promise<void> => {\n // Step 1: Download ALL modules in parallel (before any init)\n await Promise.allSettled([\n moduleMap['normalize'](),\n moduleMap['default'](),\n moduleMap['animations'](),\n ]);\n\n // Step 2: Init in phases\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Default + Animations (parallel)\n await executePhase('default');\n\n // Phase 3: Initialize scroll animations after IX3 loads\n const { initScrollAnimations } = await import('./src/utils/gsap.ts');\n await initScrollAnimations();\n\n // Trigger DOM ready after everything initialized\n triggerDomReady();\n };\n\n const readyCallbacks: (() => void)[] = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items: [string, ((result: unknown) => void)?][]) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback: () => void) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName?: string) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async (): Promise<void> => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
|
|
1
|
+
{"version":3,"mappings":";8qCAQMA,EAAWC,EAAOC,QAAQC,QAEPC,WACvB,GAAIC,OAAOL,KAAcM,MAAMC,QAAQF,OAAOL,KAAcK,OAAOL,GAAUQ,OAC3E,OAIFC,SAASC,gBAAgBC,UAAUC,IAAIX,EAAOC,QAAQW,QAAQC,aAE9D,MAAMC,EAAgBT,MAAMC,QAAQF,OAAOL,IAAaK,OAAOL,GAAY,GAErEgB,EAAY,CAChBC,UAAW,IAAAC,EAAA,IAAMC,OAAO,qCAAsCC,wBAC9DC,QAAS,IAAAH,EAAA,IAAMC,OAAO,mCAAkCC,wBACxDE,WAAY,IAAAJ,EAAA,IAAMC,OAAO,sCAAgCC,yBAG3D,IAAIG,EAAU,IAAId,SAASe,iBAAiB,0CAA0CC,UAE/D,IAAnBF,EAAQG,SACVH,EAAU,IACLd,SAASe,iBAAiB,qDAC7BG,OAAQC,IACR,MAAMC,EAAaD,EAA6BE,IAC1CC,cAAyBN,IACzBO,EAAgBH,EAAUI,MAAM,mCAAmC,GACnEC,EAAiBH,EAAWE,MAAM,mCAAmC,GAC3E,OACED,GACAE,GACAF,EAAcG,MAAM,KAAK,KAAOD,EAAeC,MAAM,KAAK,MAMhE,MAAMC,EAAW,CACfC,MAAOd,EAAQe,KAAMV,GAAkD,SAAvCA,EAAOW,aAAa,iBAIhDC,EAAS,CACbvB,UAAW,CACTwB,QAAS,CAAC,aACVC,UAAU,GAEZrB,QAAS,CACPoB,QAAS,CAAC,UAAW,cACrBC,UAAU,IAIRC,EAAavC,MAAOwC,IACxB,MAAMC,EAAWxC,OAAOL,GACxB,GAAI6C,EAASC,QAAQC,IAAIH,GACvB,OAAOC,EAASJ,QAAQG,IAAaI,QAGvCH,EAASC,QAAQlC,IAAIgC,GAErB,MAAMK,EAAaJ,EAASJ,QAAQG,IAAe,GAQnD,IAAIM,EAPJL,EAASJ,QAAQG,GAAcK,EAE/BA,EAAWD,QAAU,IAAIG,QAAQ,CAACC,EAASC,KACzCJ,EAAWG,QAAUA,EACrBH,EAAWI,OAASA,IAItB,IACE,MAAMC,KAAEA,SAAetC,EAAU4B,KAE3BW,QADeD,KACQ,GAC7BJ,EAAUK,EAAWL,QACrB,MAAMM,EAAaD,EAAWE,OAe9B,OAbAR,EAAWC,QAAU,KACnBA,MACAL,EAASC,QAAQY,OAAOd,IAE1BK,EAAWU,QAAU,KACnBV,EAAWC,YACXL,EAASe,KAAKhB,IAGhBK,EAAWG,UAAUI,UACdP,EAAWG,eACXH,EAAWI,OAEXG,CACT,OAASK,GAIP,MAHAX,MACAD,EAAWI,SAASQ,GACpBhB,EAASC,QAAQY,OAAOd,GAClBiB,CACR,GAIIC,EAAe1D,MAAO2D,IAC1B,MAAMC,EAAQxB,EAAOuB,GAGrB,GAAIC,EAAMtB,SAAU,CAClB,MAAMuB,EAAeD,EAAMvB,QAAQyB,IAAKC,GAAiBxB,EAAWwB,UAC9DhB,QAAQiB,WAAWH,EAC3B,MAEE,UAAWE,KAAQH,EAAMvB,cACjBE,EAAWwB,IAYjBE,EAAqBjE,gBAEnB+C,QAAQiB,WAAW,CACvBpD,EAAqB,YACrBA,EAAmB,UACnBA,EAAsB,qBAKlB8C,EAAa,mBAGbA,EAAa,WAnBG,MACtB,MAAMQ,EAAQ,IAAIC,YAAY,oBAC9BlE,OAAOmE,cAAcF,IAoBrBG,GAIA,MAAMC,qBAAEA,SAAyBxD,EAAAd,UAAA,MAAAsE,8BAAMvD,OAAO,iCAAqBwD,KAAAC,KAAAC,GAAA,OAAAH,yBAAAtD,IACnEsD,IAAuBI,MAAOjB,IAC5BkB,QAAQlB,MAAM,mDAAoDA,MAIhEmB,EAAiC,GAEvC3E,OAAOL,GAAY,CACjBuB,UACAa,WACAK,QAAS,GACTK,YAAamC,IACbrB,KAAMjB,EACNnC,QAAQ,EACR,IAAA0E,IAAQC,GACN,UAAYvC,EAAYwC,KAAaD,EACX,mBAAbC,EACTC,KAAK5C,QAAQG,IAAaI,SAAS2B,KAAKS,GAExCC,KAAKzB,KAAKhB,EAGhB,EACA,OAAAM,GACE,UAAWN,KAAcyC,KAAK5C,QAC5B4C,KAAK5C,QAAQG,IAAaM,WAE9B,EACA,kBAAMoC,GAEJD,KAAK7E,QAAS,EACd6E,KAAKnC,UACLmC,KAAK5C,QAAU,GACf4C,KAAKvC,YAAcmC,UAGbI,KAAKE,4BAGLlB,IAENgB,KAAK7E,QAAS,CAChB,EACA,yBAAM+E,GACW9E,SAASe,iBAAiB,YAClCgE,QAASC,IACEA,EAAMjE,iBAAiB,0BAC/BgE,QAAS5D,IAEf,MAAM8D,EAAa9D,EAAOW,aAAa,uBACjCK,EAAahB,EAAOW,aAAa,kBAEvC,GAAImD,GAAc9C,EAAY,CAC5B,MAAM+C,EAAY,WAAWD,KAAc9C,IACvC5B,EAAU2E,IACZN,KAAKzB,KAAK+B,EAEd,KAGN,EACA,UAAAC,CAAWR,GACe,mBAAbA,IACLC,KAAK7E,OACP4E,IAEAJ,EAAeE,KAAKE,GAG1B,EACA,MAAAS,CAAOjD,GACL,OAAIA,EACK,CACLpC,SAAU6E,KAAK5C,QAAQG,GACvBI,QAASqC,KAAKvC,QAAQC,IAAIH,IAGvB,CACLpC,OAAQsF,OAAOC,KAAKV,KAAK5C,SACzBO,QAAS,IAAIqC,KAAKvC,SAClBkD,OAAQxD,EAEZ,GAGepC,WACfC,OAAOL,GAAUkF,QAAQnE,SAGnBsD,IAENhE,OAAOL,GAAUQ,QAAS,EAC1BwE,EAAeQ,QAASJ,IACtB,IACEA,GACF,OAEA,IAEFJ,EAAetD,OAAS,GAG1BuE,GAAWnB,MAAM,SAGnBoB","names":["API_NAME","config","_global","apiName","async","window","Array","isArray","loaded","document","documentElement","classList","add","classes","initialized","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","initPromises","map","name","allSettled","initializeInPhases","event","CustomEvent","dispatchEvent","triggerDomReady","initScrollAnimations","then","n","t","catch","console","readyCallbacks","Set","push","items","callback","this","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","initializeHsMain"],"ignoreList":[],"sources":["../index.ts"],"sourcesContent":["/**\n * Main Entry Point\n *\n * 2-phase initialization system: Normalize → Default + Animations.\n * Handles module loading, lifecycle management, and SPA coordination.\n */\nimport config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async (): Promise<void> => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n // Add initialized class to HTML element immediately\n document.documentElement.classList.add(config._global.classes.initialized);\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = (script as HTMLScriptElement).src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 2-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations in parallel\n },\n };\n\n const loadModule = async (moduleName: string): Promise<unknown> => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy: (() => void) | undefined;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy as (() => void) | undefined;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to execute a phase (modules already downloaded)\n const executePhase = async (phaseName: string): Promise<void> => {\n const phase = PHASES[phaseName];\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name: string) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Initialize all modules in 2 phases\n const initializeInPhases = async (): Promise<void> => {\n // Step 1: Download ALL modules in parallel (before any init)\n await Promise.allSettled([\n moduleMap['normalize'](),\n moduleMap['default'](),\n moduleMap['animations'](),\n ]);\n\n // Step 2: Init in phases\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Default + Animations (parallel)\n await executePhase('default');\n\n // Trigger DOM ready immediately after phase 2\n triggerDomReady();\n\n // Phase 3: Initialize scroll animations (independent, non-blocking)\n // Waits for IX3 indefinitely, triggers scroll when ready\n const { initScrollAnimations } = await import('./src/utils/gsap.ts');\n initScrollAnimations().catch((error) => {\n console.error('[hsmain] Scroll animations failed to initialize:', error);\n });\n };\n\n const readyCallbacks: (() => void)[] = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items: [string, ((result: unknown) => void)?][]) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback: () => void) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName?: string) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async (): Promise<void> => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hortonstudio/main",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.33",
|
|
4
4
|
"description": "Animation and utility library for client websites",
|
|
5
5
|
"main": "dist/main.js",
|
|
6
6
|
"type": "module",
|
|
@@ -34,5 +34,8 @@
|
|
|
34
34
|
"typescript": "^5.9.3",
|
|
35
35
|
"vite": "^7.2.2",
|
|
36
36
|
"vite-plugin-compression2": "^2.3.1"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"quicklink": "^3.0.1"
|
|
37
40
|
}
|
|
38
41
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{g as e,i as t,w as n,a as r,d as o,p as s,q as a,b as i,s as l,e as c,o as u,f as d,h as p,c as m,j as f}from"./hs-utils-BDoLvY4b.js";const h=e.apiName,v='[data-hs-transition="wrapper"]',g="data-hs-transition-exit-trigger",y="data-hs-transition-enter-trigger",b="data-hs-transition-trigger",w="data-hs-transition-namespace",A="data-hs-transition-exit-time",E="data-hs-transition-first-delay",L="data-hs-transition-initialized",k="data-hs-exit-time",x="data-hs-delay";async function S(){const e=document.querySelector(v);if(!e)return{result:"transition skipped - no wrapper found",destroy:()=>{}};if(e.hasAttribute(L))return{result:"transition already initialized",destroy:()=>{}};e.setAttribute(L,"true");const r=window[h]?.settings?.isSPA||!1,o=new Map;let s=null;const a=(t,n=null,r=e)=>{const o=r.querySelectorAll(`[${b}="${t}"]`);if(o.length>0){if(n){const e=r.querySelector(`[${w}="${n}"]`);if(e){const n=e.querySelector(`[${b}="${t}"]`);if(n)return n}}const e=Array.from(o).find(e=>{let t=e.parentElement;for(;t&&t!==r;){if(t.hasAttribute(w))return!1;t=t.parentElement}return!0});if(e)return e}const s="exit"===t?g:y,a=r.querySelectorAll(`[${s}]`);if(a.length>0){if(n){const e=r.querySelector(`[${w}="${n}"]`);if(e){const t=e.querySelector(`[${s}]`);if(t)return t}}const e=Array.from(a).find(e=>{let t=e.parentElement;for(;t&&t!==r;){if(t.hasAttribute(w))return!1;t=t.parentElement}return!0});if(e)return e}return null},i=(t=null)=>new Promise(n=>{const r=a("exit",t);if(!r)return void n();const o=(()=>{const t=e.getAttribute(A);if(t)return 1e3*parseFloat(t);const n=e.getAttribute(k);return n?1e3*parseFloat(n):0})();r.click(),setTimeout(()=>n(),o)}),l=(t=null)=>new Promise(n=>{const r=a("enter",t);if(!r)return void n();const o=!sessionStorage.getItem("transition-loaded"),i=(()=>{const t=e.getAttribute(E);if(t)return 1e3*parseFloat(t);const n=e.getAttribute(x);return n?1e3*parseFloat(n):0})(),l=()=>{r.click(),o&&sessionStorage.setItem("transition-loaded","true"),n()};o&&i>0?s=setTimeout(l,i):l()}),c=e=>{i(e?.detail?.namespace||null)},u=e=>{l(e?.detail?.namespace||null)};if(o.set("hsmain:transition-exit",c),o.set("hsmain:transition-enter",u),window.addEventListener("hsmain:transition-exit",c),window.addEventListener("hsmain:transition-enter",u),!r){const e=e=>{const t=e.target.closest("a[href]");if(t&&t.hostname===window.location.hostname&&t.getAttribute("href")&&-1===t.getAttribute("href").indexOf("#")&&"_blank"!==t.getAttribute("target")){e.preventDefault();const n=t.href;i().then(()=>{window.location.href=n})}};o.set("click",e),document.addEventListener("click",e);const t=e=>{e.persisted&&window.location.reload()};o.set("pageshow",t),window.addEventListener("pageshow",t)}const d=()=>{e&&(e.style.display="none")};if(o.set("resize",d),window.addEventListener("resize",d),!r){const r=async()=>{if(t()){if(!(await n(3e3)))return e.remove(),void console.error("[transition] Removed wrapper due to IX3 timeout")}l()};o.set(`${h}:dom-ready`,r),window.addEventListener(`${h}:dom-ready`,r,{once:!0})}return{result:"transition initialized",destroy:()=>{s&&clearTimeout(s),o.forEach((e,t)=>{if("click"===t||"pageshow"===t||"resize"===t){("click"===t?document:window).removeEventListener(t,e)}else window.removeEventListener(t,e)}),o.clear(),e.removeAttribute(L)}}}async function C(e){let t=null,n=null;function a(t){const n=t.target.closest('a[href^="#"]');if(!n)return;const a=n.getAttribute("href");if(!a||"#"===a)return;const i=a.substring(1),l=document.getElementById(i);if(l){t.preventDefault(),history.replaceState&&history.replaceState(null,null,`#${l.id}`);!function(e,t=0){if(!e)return;const n=o("smooth-scroll",!1);if(s()||!n){const n=e.getBoundingClientRect().top+window.scrollY-t;return window.scrollTo(0,n),e.setAttribute("tabindex","-1"),void e.focus({preventScroll:!0})}n.gsap.to(window,{duration:1,scrollTo:{y:e,offsetY:t},ease:"power2.out",onComplete:function(){e.setAttribute("tabindex","-1"),e.focus({preventScroll:!0})}})}(l,function(){const t=r(e,"offset-proxy");if(console.log("[smooth-scroll] Proxy element:",t),t&&t instanceof HTMLElement){const e=getComputedStyle(t).top,n=parseFloat(e)||0;return console.log("[smooth-scroll] Computed top:",e,"-> offset:",n),n}return console.log("[smooth-scroll] No proxy element found, using offset: 0"),0}())}}return"undefined"!=typeof $&&$(document).off("click.wf-scroll"),document.documentElement.style.scrollBehavior="auto",document.body.style.scrollBehavior="auto",t=a,n=e=>{"Enter"!==e.key&&" "!==e.key||a(e)},document.addEventListener("click",t),document.addEventListener("keydown",n),{result:"autoInit-smooth-scroll initialized",destroy:()=>{t&&(document.removeEventListener("click",t),t=null),n&&(document.removeEventListener("keydown",n),n=null),document.documentElement.style.scrollBehavior="",document.body.style.scrollBehavior=""}}}let q=null;function T(t){q=t;const n={observers:[],handlers:[]};return function(t,n){const o=a(q,"wrapper"),s=[];o.forEach(o=>{const a=i(e.clickable,"button"),u=o.querySelector(a),d=r(q,"list",o);if(!u||!d)return void console.warn("[dropdown] Dropdown wrapper missing required elements:",o);const p=o.getAttribute("data-hs-nav-dropdown-type")||"hover",m=o.querySelector('[data-hs-height="element"]'),f=m?m.parentElement:null,h=u.textContent?.trim()||"dropdown",v=h.toLowerCase().replace(/[^a-z0-9\s]/g,"").replace(/\s+/g,"-").replace(/^-+|-+$/g,"").substring(0,50);const g=`navbar-dropdown-${v}-toggle`,y=`navbar-dropdown-${v}-list`;u.id=g,u.setAttribute("aria-haspopup","menu"),u.setAttribute("aria-expanded","false"),u.setAttribute("aria-controls",y),d.id=y,d.setAttribute("role","menu"),d.inert=!0;const b=Array.from(d.querySelectorAll(a));b.forEach((e,t)=>{if(e.setAttribute("role","menuitem"),e.setAttribute("tabindex","-1"),0===t){const t=u.textContent?.trim()||"menu";e.getAttribute("aria-label")||e.setAttribute("aria-label",`${e.textContent?.trim()}, ${t} submenu`)}});let w=-1;function A(){return o.classList.contains(e.classes.active)}function E(){const e=A();"true"===u.getAttribute("aria-expanded")&&!e&&d.contains(document.activeElement)&&u.focus(),u.setAttribute("aria-expanded",e?"true":"false"),d.inert=!e,b.forEach(t=>{t.setAttribute("tabindex",e?"0":"-1")}),e||(w=-1),c(f,e,{duration:"hover"===p?200:300,ease:"power2.inOut"})}l(f,A()),E();const L=new MutationObserver(()=>{E()});if(L.observe(o,{attributes:!0,attributeFilter:["class"]}),t(L),"hover"===p){s.push(o);const t=()=>{o.classList.add("is-active")},r=()=>{o.classList.remove("is-active")};n(o,"mouseenter",t),n(o,"mouseleave",r);n(u,"keydown",t=>{"ArrowDown"===t.key?(t.preventDefault(),A()||(o.classList.add(e.classes.active),b.length>0&&setTimeout(()=>{w=0,b[0].focus()},100))):" "===t.key||"Enter"===t.key?(t.preventDefault(),A()?o.classList.remove(e.classes.active):(o.classList.add(e.classes.active),b.length>0&&setTimeout(()=>{w=0,b[0].focus()},100))):"ArrowUp"===t.key?(t.preventDefault(),A()||(o.classList.add(e.classes.active),b.length>0&&setTimeout(()=>{w=b.length-1,b[w].focus()},100))):"Escape"===t.key&&(t.preventDefault(),A()&&o.classList.remove(e.classes.active))});const a=t=>{A()&&o.contains(document.activeElement)&&("ArrowDown"===t.key?(t.preventDefault(),w<b.length-1&&(w++,b[w].focus())):"ArrowUp"===t.key?(t.preventDefault(),0===w?(o.classList.remove(e.classes.active),u.focus(),w=-1):w>0?(w--,b[w].focus()):(u.focus(),w=-1)):"Escape"===t.key&&(t.preventDefault(),o.classList.remove("is-active")))};n(o,"keydown",a)}else if("click"===p){n(u,"click",t=>{t.preventDefault(),o.classList.toggle(e.classes.active)});n(u,"keydown",t=>{" "===t.key||"Enter"===t.key?(t.preventDefault(),o.classList.toggle(e.classes.active)):"Escape"===t.key&&(t.preventDefault(),A()&&o.classList.remove(e.classes.active))})}});const u=e=>{s.forEach(t=>{t.classList.contains("is-active")&&!t.contains(e.target)&&t.classList.remove("is-active")})};s.length>0&&n(document.body,"focusin",u)}(e=>{n.observers.push(e)},(e,t,r,o)=>{e.addEventListener(t,r,o),n.handlers.push({element:e,event:t,handler:r,options:o})}),{result:"dropdown initialized",destroy:()=>{n.observers.forEach(e=>e.disconnect()),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),n.handlers.length=0,q=null}}}function P(t,n){const o={observers:[],handlers:[],state:{focusTrapHandler:null}},s=e=>{o.observers.push(e)};return function(s,p){const m=a(t,"button"),f=r(t,"wrapper");if(!m.length||!f)return;const h=n?r(n,"wrapper"):null,v=`menu-${Date.now()}`;f.id=v,f.setAttribute("role","dialog"),f.setAttribute("aria-modal","true"),f.inert=!0;const g=f.querySelector('[data-hs-height="element"]'),y=g?g.parentElement:null;m.forEach(t=>{t.setAttribute("aria-expanded","false"),t.setAttribute("aria-controls",v),t.setAttribute("aria-label","Open navigation menu");let a=null,g=!1;function b(){return t.classList.contains(e.classes.active)}function w(){const o=b(),s="true"===t.getAttribute("aria-expanded");o&&!s?(u(),f.classList.add(e.classes.active),f.inert=!1,h&&h.classList.add("hs-menu-open"),m.forEach(e=>{e.setAttribute("aria-expanded","true"),e.setAttribute("aria-label","Close navigation menu")}),y&&c(y,!0,{duration:300,ease:"power2.inOut"}),a=function(){const t=n?r(n,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!t)return;const o=n=>{if("Tab"===n.key){const r=i(e.clickable,"button"),o=Array.from(t.querySelectorAll(r)),s=t.querySelectorAll('input, select, textarea, [tabindex]:not([tabindex="-1"])'),a=[...o,...Array.from(s)],l=a[0],c=a[a.length-1];n.shiftKey?document.activeElement===l&&(n.preventDefault(),c.focus()):document.activeElement===c&&(n.preventDefault(),l.focus())}};return document.addEventListener("keydown",o),o}(),g&&(setTimeout(()=>{const t=i(e.clickable,"button"),n=Array.from(f.querySelectorAll(t));if("last"===g){const e=n[n.length-1];e&&e.focus()}else{const e=n[0];e&&e.focus()}},100),g=!1)):!o&&s&&(f.contains(document.activeElement)&&t.focus(),d(),f.classList.remove(e.classes.active),f.inert=!0,h&&h.classList.remove("hs-menu-open"),m.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-label","Open navigation menu")}),y&&c(y,!1,{duration:300,ease:"power2.inOut"}),function(e){e&&document.removeEventListener("keydown",e)}(a),a=null)}y&&l(y,b()),w();const A=new MutationObserver(()=>{w()});A.observe(t,{attributes:!0,attributeFilter:["class"]}),s(A);p(t,"click",function(e){e.preventDefault(),t.classList.toggle("is-active")});p(t,"keydown",function(n){" "===n.key||"Enter"===n.key?(n.preventDefault(),g=!0,t.classList.toggle(e.classes.active)):"ArrowDown"===n.key?(n.preventDefault(),b()||(g=!0,t.classList.add(e.classes.active))):"ArrowUp"===n.key?(n.preventDefault(),b()||(g="last",t.classList.add(e.classes.active))):"Escape"===n.key&&(n.preventDefault(),b()&&t.classList.remove(e.classes.active))}),o.state.focusTrapHandler=a})}(s,(e,t,n,r)=>{e.addEventListener(t,n,r),o.handlers.push({element:e,event:t,handler:n,options:r})}),function(n){const o=r(t,"wrapper");if(!o)return;let s=null;function a(){const t=window.getComputedStyle(o).getPropertyValue(p.state).trim();if(s===e.cssVars.state.values.active&&t===e.cssVars.state.values.inactive){const e=document.querySelector('[data-hs-nav-menu="button"]');e&&"true"===e.getAttribute("aria-expanded")&&e&&e.classList.remove("is-active")}s=t}const i=new ResizeObserver(a);i.observe(o),n(i),a()}(s),{result:"menu initialized",destroy:()=>{o.state.focusTrapHandler&&(document.removeEventListener("keydown",o.state.focusTrapHandler),o.state.focusTrapHandler=null),o.observers.forEach(e=>e.disconnect()),o.observers.length=0,o.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),o.handlers.length=0,document.body.classList.remove("u-overflow-hidden")}}}function D(t,n){const o={handlers:[]},s=(e,t,n,r)=>{e.addEventListener(t,n,r),o.handlers.push({element:e,event:t,handler:n,options:r})};return s(document,"keydown",t=>{if("ArrowLeft"!==t.key&&"ArrowRight"!==t.key)return;const o=n?r(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(o&&o.contains(document.activeElement))return;const s=n?r(n,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!s||!s.contains(document.activeElement))return;const a=s.querySelector(`.${e.classes.active}[data-hs-nav-dropdown]`);if(a&&a.contains(document.activeElement))return;t.preventDefault();const l=i(e.clickable,"button"),c=Array.from(s.querySelectorAll(l)),u=Array.from(c).filter(e=>{if("-1"===e.getAttribute("tabindex"))return!1;if(e.closest('[role="menu"]'))return!1;const t=n?n.menu.attributes.elements.wrapper.primary.split("=")[0]:"data-hs-nav-menu";if(e.closest(`[${t}="wrapper"]`))return!1;const r=n?n.attributes.elements["skip-link"].primary.split("=")[0]:"data-hs-nav";if(e.closest(`[${r}="skip-link"]`))return!1;const o=window.getComputedStyle(e),a=e;if("none"===o.display||"hidden"===o.visibility||"0"===o.opacity||0===a.offsetWidth||0===a.offsetHeight)return!1;let i=e.parentElement;for(;i&&i!==s;){const e=window.getComputedStyle(i),t=i;if("none"===e.display||"hidden"===e.visibility||0===t.offsetWidth||0===t.offsetHeight)return!1;i=i.parentElement}return!0}),d=u.indexOf(document.activeElement);-1!==d&&("ArrowRight"===t.key?d<u.length-1&&u[d+1].focus():d>0&&u[d-1].focus())}),function(t){const o=n?r(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(!o)return;let s=-1;t(o,"keydown",t=>{const a=function(){const t=i(e.clickable,"button"),n=Array.from(o.querySelectorAll(t));return Array.from(n).filter(e=>{let t=e;for(;t&&t!==o;){if(t.inert)return!1;t=t.parentElement}return!0})}();if(0===a.length)return;const l=document.activeElement;if(s=a.indexOf(l),"ArrowDown"===t.key)t.preventDefault(),s<a.length-1&&(s+=1,a[s].focus());else if("ArrowUp"===t.key)t.preventDefault(),s>0&&(s-=1,a[s].focus());else if("ArrowRight"===t.key){if(t.preventDefault(),l&&"BUTTON"===l.tagName&&l.hasAttribute("aria-controls")){return void("true"===l.getAttribute("aria-expanded")||l.click())}}else if("ArrowLeft"===t.key){if(t.preventDefault(),l&&"BUTTON"===l.tagName&&l.hasAttribute("aria-controls")){return void("true"===l.getAttribute("aria-expanded")&&l.click())}}else if("Home"===t.key)t.preventDefault(),s=0,a[0].focus();else if("End"===t.key)t.preventDefault(),s=a.length-1,a[a.length-1].focus();else if(" "===t.key&&l&&"A"===l.tagName)t.preventDefault();else if("Escape"===t.key){const e=n?r(n.menu,"button"):document.querySelector('[data-hs-nav-menu="button"]');e&&(e.click(),e.focus())}})}(s),{result:"arrow-navigation initialized",destroy:()=>{o.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),o.handlers.length=0}}}async function F(e){const t={destroyFunctions:[]},n=await Promise.allSettled([T(e.dropdown),P(e.menu,e),D(e["arrow-navigation"],e)]);n.forEach(e=>{"fulfilled"===e.status&&e.value?.destroy&&t.destroyFunctions.push(e.value.destroy)});const r=n.filter(e=>"fulfilled"===e.status).length,o=n.length-r;return o>0&&console.warn(`[navbar] ${r}/${n.length} functions loaded successfully. ${o} failed but won't affect other functions.`),{result:"navbar initialized",destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[navbar] Error during cleanup:",t)}}),t.destroyFunctions.length=0}}}function I(t){const n={observers:[],handlers:[]};return function(n,o){const s=a(t,"wrapper");if(0===s.length)return 0;let u=0;s.forEach((s,a)=>{const d=r(t,"toggle",s),p=r(t,"content",s);if(!d||!p)return;u++;const m=`[${e.attributes.height}="${e.attributes.heightValue}"]`,f=s.querySelector(m),h=f?f.parentElement:p,v=`hs-accordion-btn-${a}`,g=`hs-accordion-content-${a}`,y=s.getAttribute(t.attributes.properties.open),b=s.getAttribute(t.attributes.properties.closed),w=y&&b;let A=[];if(w){const e=i(t,"state");A=Array.from(d.querySelectorAll(e))}function E(){return s.classList.contains(e.classes.active)}function L(){const e=E();if("true"===d.getAttribute("aria-expanded")&&!e&&p.contains(document.activeElement)){d.focus()}d.setAttribute("aria-expanded",e?"true":"false");var t;p.inert=!e,w&&A.length>0&&(t=e?y:b,w&&A.forEach(e=>{e.textContent=t})),c(h,e,{duration:300,ease:"power2.inOut"})}d.setAttribute("id",v),p.setAttribute("id",g),p.setAttribute("role","region"),p.setAttribute("aria-labelledby",v),d.setAttribute("aria-controls",g);const k=s.getAttribute(t.attributes.properties.default);k&&"open"===k.toLowerCase()&&s.classList.add(e.classes.active),l(h,E()),L();o(d,"click",t=>{t.preventDefault(),s.classList.toggle(e.classes.active)});const x=new MutationObserver(()=>{L()});x.observe(s,{attributes:!0,attributeFilter:["class"]}),n(x)})}(e=>n.observers.push(e),(e,t,r,o)=>{e.addEventListener(t,r,o),n.handlers.push({element:e,event:t,handler:r,options:o})}),{result:"accordion initialized",destroy:()=>{n.observers.forEach(e=>e.disconnect()),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),n.handlers.length=0}}}function N(e){const t=m._global.classes.active,n={observers:[],handlers:[],scrollTimeout:null,headings:[]},r=a(e,"content"),o=a(e,"list");return r.forEach(e=>{const r=o[0];if(!r||0===r.children.length)return;const s=r.children[0].cloneNode(!0),a=s.querySelector("a");a&&a.classList.remove(t),r.innerHTML="";const i=e.querySelectorAll("h2");i.forEach(e=>{const t=e.textContent.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");e.id=t,n.headings.push(e)}),i.forEach((e,t)=>{const n=s.cloneNode(!0),o=n.querySelector("a"),a=e.id;o.href=`#${a}`;const i=document.createElement("strong");i.textContent=`${t+1}. `,o.innerHTML="",o.appendChild(i),o.appendChild(document.createTextNode(e.textContent)),r.appendChild(n)});const l=r.querySelectorAll("a");let c=null;const u=()=>{const e=.25*window.innerHeight;let n=null;for(let t=i.length-1;t>=0;t--){if(i[t].getBoundingClientRect().top<=e){n=i[t].id;break}}if(n!==c&&(c=n,l.forEach(e=>e.classList.remove(t)),c)){const e=Array.from(l).find(e=>e.getAttribute("href")===`#${c}`);e&&e.classList.add(t)}},d=new IntersectionObserver(()=>{u()},{rootMargin:"-25% 0px -75% 0px",threshold:0});i.forEach(e=>d.observe(e)),(e=>{n.observers.push(e)})(d);var p,m,f;p=window,m="scroll",f=()=>{n.scrollTimeout&&clearTimeout(n.scrollTimeout),n.scrollTimeout=setTimeout(u,50)},p.addEventListener(m,f),n.handlers.push({element:p,event:m,handler:f})}),{result:"toc initialized",destroy:()=>{n.headings.forEach(e=>{e.removeAttribute("id")}),n.headings.length=0,n.observers.forEach(e=>e.disconnect()),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),n.handlers.length=0,n.scrollTimeout&&(clearTimeout(n.scrollTimeout),n.scrollTimeout=null)}}}async function M(){const e=m.default.toc,t={destroyFunctions:[]},n=i(e,"list");if(document.querySelector(n))try{const n=await N(e);n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[toc] Error initializing heading-links:",c)}const l=i(e["progress-bar"],"wrapper");if(document.querySelector(l))try{const n=await async function(e){const{progressConfig:t,tocConfig:n}=e;if(s())return{result:"progress-bar skipped - prefers-reduced-motion enabled"};const i=o("progress-bar");if(!i)return{result:"progress-bar skipped - GSAP not loaded"};const{gsap:l,ScrollTrigger:c}=i;if(!c)return console.warn("[progress-bar] GSAP ScrollTrigger plugin not loaded"),{result:"progress-bar skipped - ScrollTrigger not loaded"};l.registerPlugin(c);const u={scrollTriggers:[]},d=r(n,"content");if(!d)return{result:"progress-bar skipped - no content element found"};const p=a(t,"wrapper");return 0===p.length?{result:"progress-bar skipped - no wrapper elements found"}:(p.forEach(e=>{l.set(e,{display:"block"}),Array.from(e.querySelectorAll("*")).filter(e=>{const n=t.attributes.elements.element.primary,[r,o]=n.split("="),s=o?.replace(/['"]/g,"");return e.getAttribute(r)===s}).forEach(e=>{l.set(e,{width:"0%"}),l.to(e,{width:"100%",ease:"none",scrollTrigger:{trigger:d,start:"top bottom",end:"bottom 75%",scrub:!0,invalidateOnRefresh:!0,onUpdate:e=>{u.scrollTriggers.includes(e)||u.scrollTriggers.push(e)}}})})}),{result:`progress-bar initialized (${p.length} instances)`,destroy:()=>{u.scrollTriggers.forEach(e=>{e&&"object"==typeof e&&"kill"in e&&"function"==typeof e.kill&&e.kill()}),u.scrollTriggers.length=0}})}({progressConfig:e["progress-bar"],tocConfig:e});n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[toc] Error initializing progress-bar:",c)}return{result:`toc initialized (${t.destroyFunctions.length} modules active)`,destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(c){console.error("[toc] Error during cleanup:",c)}}),t.destroyFunctions.length=0}}}function H(t){const n={observers:[],handlers:[],liveRegions:[]};try{a(t,"wrapper").forEach(o=>{try{const s=function(t,n,o){const s=r(o,"list",t);if(!s)return console.warn("[pagination] Missing required element: list"),null;const a=s.parentElement;if(!a)return null;const l={controls:r(o,"controls",t),counter:r(o,"counter",t),dotsWrap:r(o,"dots",t),nextButton:null,prevButton:null};if(!l.controls)return{initialized:!1};const c=r(o,"next",t),u=r(o,"previous",t),d=i(e.clickable,"button"),m=c?.querySelector(d)||c,f=u?.querySelector(d)||u;if(!m||!f)return console.warn("[pagination] Missing required navigation buttons"),null;l.nextButton=m,l.prevButton=f,l.nextButton.setAttribute("aria-label","Go to next page"),l.prevButton.setAttribute("aria-label","Go to previous page"),l.counter&&(l.counter.setAttribute("aria-live","polite"),l.counter.setAttribute("aria-label","Current page"));const h=parseInt(l.controls?.getAttribute(o.attributes.properties.show)||"6")||6,v=parseInt(l.controls?.getAttribute(o.attributes.properties.showMobile)||String(h))||h,g=()=>getComputedStyle(s).getPropertyValue(p.state).trim()===e.cssVars.state.values.active,y=Array.from(s.children),b=y.length;if(!b)return null;const w={totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1,itemsPerPage:h,dotTemplates:{active:null,inactive:null}};let A=[];const E=document.createElement("div");E.className="sr-only",E.setAttribute("aria-live","assertive"),E.setAttribute("aria-atomic","true"),E.style.cssText="position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden;",t.appendChild(E),n.liveRegions.push(E);const L=()=>{l.counter&&(l.counter.textContent=`${w.currentPage} / ${w.totalPages}`)},k=()=>{E.textContent=`Page ${w.currentPage} of ${w.totalPages}`,setTimeout(()=>E.textContent="",1e3)},x=()=>{A.forEach((e,t)=>{const n=e;t===w.currentIndex?n.removeAttribute("inert"):n.setAttribute("inert","")})},S=()=>{const e=A[w.currentIndex];e&&void 0!==e.offsetHeight&&(a.style.height=e.offsetHeight+"px")},C=()=>{if(!l.dotsWrap)return;const e=Array.from(l.dotsWrap.children);if(!e.length)return;const t=e.find(e=>e.classList.contains("is-active")),r=e.find(e=>!e.classList.contains("is-active"));w.dotTemplates.active=t?t.cloneNode(!0):e[0].cloneNode(!0),w.dotTemplates.inactive=r?r.cloneNode(!0):e[0].cloneNode(!0),l.dotsWrap.innerHTML="",l.dotsWrap.setAttribute("role","group"),l.dotsWrap.setAttribute("aria-label","Page navigation");for(let o=1;o<=w.totalPages;o++){const e=(1===o?w.dotTemplates.active:w.dotTemplates.inactive).cloneNode(!0);e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label",`Go to page ${o}`),e.setAttribute("aria-current",1===o?"page":"false"),e.setAttribute("data-page",String(o)),1===o?e.classList.add("is-active"):e.classList.remove("is-active");const t=()=>$(o);e.addEventListener("click",t),n.handlers.push({element:e,event:"click",handler:t});const r=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),$(o))};e.addEventListener("keydown",r),n.handlers.push({element:e,event:"keydown",handler:r}),l.dotsWrap.appendChild(e)}},q=()=>{if(!l.dotsWrap)return;Array.from(l.dotsWrap.children).forEach((e,t)=>{t+1===w.currentPage?(e.classList.add("is-active"),e.setAttribute("aria-current","page")):(e.classList.remove("is-active"),e.setAttribute("aria-current","false"))})},T=(e=null)=>{const t=g();if(w.itemsPerPage=e||(t?v:h),w.totalPages=Math.ceil(b/w.itemsPerPage),l.dotsWrap&&(n.handlers=n.handlers.filter(({element:e})=>!l.dotsWrap.contains(e))),Array.from(a.children).forEach(e=>{e!==s&&a.removeChild(e)}),s.innerHTML="",y.forEach(e=>s.appendChild(e)),w.totalPages<=1)return l.controls&&(l.controls.contains(document.activeElement)&&document.activeElement&&document.activeElement.blur(),l.controls.style.display="none",l.controls.setAttribute("aria-hidden","true")),l.dotsWrap&&(l.dotsWrap.style.display="none",l.dotsWrap.setAttribute("aria-hidden","true")),Object.assign(w,{totalPages:1,currentIndex:1,currentPage:1,isAnimating:!1}),a.style.cssText=`transform: translateX(0%); height: ${s.offsetHeight}px;`,A=[s],1;l.controls&&(l.controls.style.display="",l.controls.removeAttribute("aria-hidden")),l.dotsWrap&&(l.dotsWrap.style.display="",l.dotsWrap.removeAttribute("aria-hidden"));const r=Array.from({length:w.totalPages},(e,t)=>{const n=s.cloneNode(!1),r=t*w.itemsPerPage,o=Math.min(r+w.itemsPerPage,b);return y.slice(r,o).forEach(e=>n.appendChild(e.cloneNode(!0))),n});return a.insertBefore(r[r.length-1].cloneNode(!0),s),r.slice(1).forEach(e=>a.appendChild(e)),a.appendChild(r[0].cloneNode(!0)),s.innerHTML="",Array.from(r[0].children).forEach(e=>s.appendChild(e)),Object.assign(w,{currentIndex:1,currentPage:1,isAnimating:!1}),A=Array.from(a.children),a.style.transform="translateX(-100%)",L(),S(),x(),C(),w.totalPages};let P=g();const D=new ResizeObserver(()=>{if(w.isAnimating)return;const e=g();e!==P?(P=e,T()):S()});D.observe(a),n.observers.push(D),T();const $=e=>{if(w.isAnimating||w.totalPages<=1||e===w.currentPage)return;w.isAnimating=!0,w.currentIndex=e,w.currentPage=e,L(),k(),S(),q(),g()&&l.controls&&setTimeout(()=>{const e=80,t=l.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),a.style.transform=`translateX(${100*-w.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),a.removeEventListener("transitionend",n),L(),k(),S(),x(),q(),w.isAnimating=!1};t=setTimeout(n,1e3),a.addEventListener("transitionend",n)},F=e=>{if(w.isAnimating||w.totalPages<=1)return;w.isAnimating=!0,w.currentIndex+=e,w.currentPage=w.currentIndex>w.totalPages?1:w.currentIndex<1?w.totalPages:w.currentIndex,L(),k(),S(),q(),g()&&l.controls&&setTimeout(()=>{const e=80,t=l.controls.getBoundingClientRect().bottom+window.pageYOffset-window.innerHeight+e;window.scrollTo({top:t,behavior:"smooth"})},50),a.style.transform=`translateX(${100*-w.currentIndex}%)`;let t=null;const n=()=>{clearTimeout(t),a.removeEventListener("transitionend",n),w.currentIndex>w.totalPages?(w.currentIndex=1,w.currentPage=1,a.style.transition="none",a.style.transform="translateX(-100%)",a.offsetHeight,a.style.transition=""):w.currentIndex<1&&(w.currentIndex=w.totalPages,w.currentPage=w.totalPages,a.style.transition="none",a.style.transform=`translateX(${100*-w.totalPages}%)`,a.offsetHeight,a.style.transition=""),L(),k(),S(),x(),q(),w.isAnimating=!1};t=setTimeout(n,1e3),a.addEventListener("transitionend",n)},I=()=>F(1),N=()=>F(-1);return l.nextButton.addEventListener("click",I),l.prevButton.addEventListener("click",N),n.handlers.push({element:l.nextButton,event:"click",handler:I},{element:l.prevButton,event:"click",handler:N}),{initialized:!0}}(o,n,t);s||console.warn("[pagination] Failed to initialize container",o)}catch(s){console.error("[pagination] Error initializing container:",s,o)}})}catch(o){console.error("[pagination] Critical error during initialization:",o)}return{result:"pagination initialized",destroy:()=>{try{n.liveRegions.forEach(e=>{try{e.parentNode&&e.parentNode.removeChild(e)}catch(o){console.error("[pagination] Error removing live region:",o)}}),n.liveRegions.length=0,n.observers.forEach(e=>{try{e.disconnect()}catch(o){console.error("[pagination] Error disconnecting observer:",o)}}),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n})=>{try{e.removeEventListener(t,n)}catch(o){console.error("[pagination] Error removing event listener:",o)}}),n.handlers.length=0}catch(o){console.error("[pagination] Critical error during cleanup:",o)}}}}async function O(t){const n=o("comparison");if(!n)return{result:"comparison skipped - GSAP not loaded"};const{gsap:s,Draggable:l}=n;f("comparison",["Draggable"],"error");const c=a(t,"wrapper"),u={draggables:[],handlers:[]},d=i(t,"template-name"),m=i(t,"template-description"),h=i(t,"template-before-image"),v=i(t,"template-after-image");function g(e,t){e.style.setProperty(p.clip,`${t}%`)}function y(n,o){const s=n.templateItems[o];if(!s)return;const a=s.querySelector(d);n.nameElement&&a&&(n.nameElement.textContent=a.textContent);const i=s.querySelector(m);n.descElement&&i&&(n.descElement.textContent=i.textContent);const l=s.querySelector(h);n.beforeImage&&l&&(n.beforeImage.src=l.src,n.beforeImage.alt=l.alt||"");const c=s.querySelector(v);n.afterImage&&c&&(n.afterImage.src=c.src,n.afterImage.alt=c.alt||"",b(n)),n.currentIndex=o,function(n,o){const s=r(t,"pagination",n);if(!s)return;const a=e.classes.active;Array.from(s.children).forEach((e,t)=>{t===o?e.classList.add(a):e.classList.remove(a)})}(n.wrapper,o)}function b(e){const t=e.slider,n=e.wrapper;switch(e.mode){case"before":n.style.setProperty(p.clip,"100%"),t.style.display="none";break;case"after":n.style.setProperty(p.clip,"0%"),t.style.display="none";break;case"split":g(n,e.sliderPosition),t.style.display="flex"}}function w(e,t){const n=e.currentIndex+t,r=e.templateItems.length-1;let o;o=n>r?0:n<0?r:n,y(e,o)}return c.forEach(n=>{const o=r(t,"template-list",n);if(!o)return void console.warn("[comparison] No template list found in wrapper");const a=i(t,"template-item"),c=Array.from(o.querySelectorAll(a));if(0===c.length)return void console.warn("[comparison] No template items found");n.setAttribute("aria-live","polite"),n.setAttribute("aria-label","Before and after image comparison");const d=r(t,"image-wrapper",n),p=r(t,"slider",n),m=r(t,"before-image",n),f=r(t,"after-image",n),h=r(t,"name",n),v=r(t,"description",n);if(!d||!p||!f){const e=[];return d||e.push('image-wrapper (data-hs-comparison="image-wrapper")'),p||e.push('slider (data-hs-comparison="slider")'),f||e.push('after-image (data-hs-comparison-image="after")'),void console.warn(`[comparison] Missing required elements: ${e.join(", ")}`)}const A={wrapper:n,templateItems:c,currentIndex:0,mode:"split",sliderPosition:50,slider:p,beforeImage:m?.querySelector("img"),afterImage:f?.querySelector("img"),nameElement:h,descElement:v,draggable:null};if(y(A,0),g(n,50),l){const e=l.create(p,{type:"x",bounds:d,onDrag:function(){const e=d.getBoundingClientRect(),t=p.getBoundingClientRect().left-e.left,r=Math.max(0,Math.min(100,t/e.width*100));g(n,r),A.sliderPosition=r}});u.draggables.push(e),A.draggable=e[0];const t=e=>{if("split"!==A.mode)return;const t=d.getBoundingClientRect(),r=e.clientX-t.left,o=Math.max(0,Math.min(100,r/t.width*100)),a=r-t.width/2;A.draggable&&(s.set(p,{x:a}),A.draggable.update()),g(n,o),A.sliderPosition=o};d.addEventListener("click",t),u.handlers.push({element:d,event:"click",handler:t})}n.querySelectorAll(`[${t.attributes.properties.modeType}]`).forEach(n=>{const r=n.getAttribute(t.attributes.properties.modeType),o=i(e.clickable,"button"),s=n.querySelector(o)||n;r===A.mode&&n.classList.add(e.classes.active);const a=n=>{n.preventDefault(),function(n,r){const o=n.wrapper.querySelectorAll(`[${t.attributes.properties.modeType}]`),s=e.classes.active;o.forEach(e=>{e.getAttribute(t.attributes.properties.modeType)===r?e.classList.add(s):e.classList.remove(s)}),n.mode=r,b(n)}(A,r)};s.addEventListener("click",a),u.handlers.push({element:s,event:"click",handler:a})}),function(n,r){const o=r.querySelector(`[${t.attributes.properties.navType}="previous"]`),s=r.querySelector(`[${t.attributes.properties.navType}="next"]`);if(o){const t=i(e.clickable,"button"),r=o.querySelector(t)||o;r.setAttribute("aria-label","Previous image");const s=e=>{e.preventDefault(),w(n,-1)};r.addEventListener("click",s),u.handlers.push({element:r,event:"click",handler:s})}if(s){const t=i(e.clickable,"button"),r=s.querySelector(t)||s;r.setAttribute("aria-label","Next image");const o=e=>{e.preventDefault(),w(n,1)};r.addEventListener("click",o),u.handlers.push({element:r,event:"click",handler:o})}}(A,n);const E=r(t,"pagination",n);E&&c.length>1&&function(t,n){const r=n.children[0];if(!r)return;const o=e.classes.active;n.innerHTML="",t.templateItems.forEach((e,s)=>{const a=r.cloneNode(!0);a.classList.remove(o),0===s&&a.classList.add(o);const i=()=>{y(t,s)};a.addEventListener("click",i),u.handlers.push({element:a,event:"click",handler:i}),n.appendChild(a)})}(A,E),function(e){const t=t=>{"ArrowLeft"===t.key||"ArrowUp"===t.key?(t.preventDefault(),w(e,-1)):"ArrowRight"!==t.key&&"ArrowDown"!==t.key||(t.preventDefault(),w(e,1))};e.wrapper.addEventListener("keydown",t),e.wrapper.setAttribute("tabindex","0"),u.handlers.push({element:e.wrapper,event:"keydown",handler:t})}(A)}),{result:`comparison initialized (${c.length} instances)`,destroy:()=>{u.draggables.forEach(e=>{e&&e[0]&&e[0].kill&&e[0].kill()}),u.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),u.draggables.length=0,u.handlers.length=0}}}function z(t){const n={handlers:[],timers:[],animationFrames:[],observers:[]},l=(e,t,r,o)=>{e.addEventListener(t,r,o),n.handlers.push({element:e,event:t,handler:r,options:o})},c=e=>n.animationFrames.push(e),u=()=>`${e.cssVars.prefix}${t.cssVars?.progress||"progress"}`,d=(e,t)=>e.style.setProperty(u(),String(t));function p(a){const p=r(t,"links",a),m=r(t,"list",a);if(!p||!m)return;const f=Array.from(p.children),h=Array.from(m.children),v=i(e.clickable,"button"),g=f.map(e=>e.querySelector(v)).filter(e=>null!==e);if(0===g.length)return;const y=a.getAttribute(t.attributes.properties?.autoplay||"data-hs-tab-autoplay"),b=a.getAttribute(t.attributes.properties?.duration||"data-hs-tab-duration"),w=a.getAttribute(t.attributes.properties?.hover||"data-hs-tab-hover"),A=a.getAttribute(t.attributes.properties?.animation||"data-hs-tab-animation"),E=a.getAttribute(t.attributes.properties?.animationDuration||"data-hs-tab-animation-duration"),L="true"===y,k=b?parseFloat(b):6,x="pause"===w,S=A,C=E?parseFloat(E):.3,q=`${"hs-tab"}-${Math.random().toString(36).substring(2,9)}`;h.forEach((e,t)=>{const n=e.id||`${q}-panel-${t}`,r=`${q}-tab-${t}`;e.id=n,g[t]&&(g[t].id=r,g[t].setAttribute("aria-controls",n))});let T=0,P=null,D=null,$=null,F=!1,I=!1,N=!1;async function M(t,n=!1){if(I)return;if(t<0||t>=h.length)return;if(t===T&&!n)return;I=!0;const r=T;if(T=t,g.forEach((e,n)=>{e.setAttribute("aria-selected",n===t?"true":"false"),e.setAttribute("tabindex",n===t?"0":"-1")}),f.forEach((n,r)=>{n.classList.toggle(e.classes.active,r===t)}),L)if(F){const e=f[r]?parseFloat(getComputedStyle(f[r]).getPropertyValue(u())||"0"):0;f.forEach((n,r)=>d(n,r===t?e:0))}else O();const a=h[r],i=h[t];"fade"!==S||n?"clip"!==S||n?h.forEach((n,r)=>{r===t?("fade"===S||"clip"===S?(n.style.position="",n.style.display="block","fade"===S?n.style.opacity="1":n.style.clipPath=""):n.style.display="block",n.inert=!1,n.style.pointerEvents="",n.classList.add(e.classes.active)):("fade"===S||"clip"===S?(n.style.display="none","fade"===S?n.style.opacity="0":n.style.clipPath=""):n.style.display="none",n.inert=!0,n.style.pointerEvents="none",n.classList.remove(e.classes.active))}):await async function(e,t,n){s()&&(n=0);const r=o("tabs",!1);if(!r)return e.style.display="none",e.style.position="",e.style.clipPath="",e.inert=!0,e.style.pointerEvents="none",t.style.display="block",t.style.position="",t.style.clipPath="",t.inert=!1,void(t.style.pointerEvents="");const{gsap:a}=r;return new Promise(r=>{const o=a.timeline({onComplete:()=>{e.style.display="none",e.style.position="",e.style.clipPath="",e.inert=!0,e.style.pointerEvents="none",t.style.position="",t.style.clipPath="",t.inert=!1,t.style.pointerEvents="",r()},defaults:{duration:n,ease:"power1.inOut"}});o.set(e,{position:"absolute",top:0,left:0,width:"100%",clipPath:"inset(0% 0% 0% 0%)"}),o.set(t,{display:"block",position:"relative",clipPath:"inset(0% 0% 100% 0%)"}),o.to(e,{clipPath:"inset(100% 0% 0% 0%)"}),o.to(t,{clipPath:"inset(0% 0% 0% 0%)"},"<40%")})}(a,i,C):await async function(e,t,n){s()&&(n=0);const r=o("tabs",!1);if(!r)return e.style.display="none",e.style.position="",e.inert=!0,e.style.pointerEvents="none",t.style.display="block",t.style.position="",t.inert=!1,void(t.style.pointerEvents="");const{gsap:a}=r;return new Promise(r=>{const o=a.timeline({onComplete:()=>{e.style.display="none",e.style.position="",e.style.opacity="",e.inert=!0,e.style.pointerEvents="none",t.style.position="",t.style.opacity="",t.inert=!1,t.style.pointerEvents="",r()},defaults:{duration:n,ease:"power1.out"}});o.set(e,{position:"absolute",top:0,left:0,width:"100%"}),o.set(t,{display:"block",position:"relative",opacity:0}),o.to(e,{opacity:0}),o.to(t,{opacity:1},"<50%")})}(a,i,C),I=!1}function H(e){if(L){$||($=e);const t=Math.min((e-$)/(1e3*k),1);f.forEach((e,n)=>d(e,n===T?t:0)),t<1&&!F&&(D=requestAnimationFrame(H),D&&c(D))}else f.forEach((e,t)=>d(e,t===T?1:0))}function O(){if(z(),!L)return H(0);if(F||!N)return;const e=f[T]?parseFloat(getComputedStyle(f[T]).getPropertyValue(u())||"0"):0,t=e*k*1e3,r=Math.max(0,1e3*k-t);$=null;const o=e,s=performance.now(),a=e=>{const t=Math.min(o+(e-s)/(1e3*k),1);f.forEach((e,n)=>d(e,n===T?t:0)),t<1&&!F&&(D=requestAnimationFrame(a),D&&c(D))};var i;D=requestAnimationFrame(a),D&&c(D),P=window.setTimeout(()=>M((T+1)%h.length),r),i=P,n.timers.push(i)}function z(){null!==P&&(clearTimeout(P),P=null),null!==D&&(cancelAnimationFrame(D),D=null),$=null}const W=()=>{F=!0,z()},R=()=>{F=!1,O()};g.forEach((e,t)=>{l(e,"click",e=>{e.preventDefault(),M(t)})});const B=e=>{const t=g.indexOf(e.target);if(-1===t)return;let n=t;switch(e.key){case"ArrowLeft":case"ArrowUp":e.preventDefault(),n=0===t?g.length-1:t-1;break;case"ArrowRight":case"ArrowDown":e.preventDefault(),n=t===g.length-1?0:t+1;break;case"Home":e.preventDefault(),n=0;break;case"End":e.preventDefault(),n=g.length-1;break;default:return}I||(M(n),g[n].focus())};g.forEach(e=>l(e,"keydown",B)),x&&L&&(l(a,"mouseenter",W),l(a,"mouseleave",R));let V=!1;l(document,"keydown",()=>V=!0),l(document,"mousedown",()=>V=!1),L&&(l(a,"focusin",()=>{V&&(W(),K())}),l(a,"focusout",()=>{V&&F&&(R(),K())}));const U=`[${t.attributes.properties?.controls||"data-hs-tab-controls"}]`,X=a.querySelectorAll(U);let G=null,Y=null;X.forEach(n=>{const r=n.getAttribute(t.attributes.properties?.controls||"data-hs-tab-controls"),o=n.querySelector(v);if(o)if("previous"===r)o.setAttribute("aria-label","Previous tab"),l(o,"click",e=>{e.preventDefault(),M(0===T?h.length-1:T-1)});else if("next"===r)o.setAttribute("aria-label","Next tab"),l(o,"click",e=>{e.preventDefault(),M((T+1)%h.length)});else if("toggle"===r){if(!L)return void(n.style.display="none");G=n,Y=o,Y.setAttribute("aria-label",F?"Play":"Pause"),G.classList.toggle(e.classes.active,!F),l(o,"click",e=>{e.preventDefault(),F?R():W(),K()})}});const K=()=>{G&&Y&&(G.classList.toggle(e.classes.active,!F),Y.setAttribute("aria-label",F?"Play":"Pause"))};if(M(0,!0),L){const e=new IntersectionObserver(e=>{e.forEach(e=>{N=e.isIntersecting,e.isIntersecting&&!F?O():z()})},{threshold:.1});e.observe(a),j=e,n.observers.push(j)}var j}const m=a(t,"wrapper");return m.forEach(e=>{p(e)}),{result:`tabs initialized (${m.length} systems)`,destroy:()=>{n.timers.forEach(e=>clearTimeout(e)),n.timers.length=0,n.animationFrames.forEach(e=>cancelAnimationFrame(e)),n.animationFrames.length=0,n.observers.forEach(e=>e.disconnect()),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),n.handlers.length=0}}}function W(e){const t={handlers:[],domContentLoadedHandler:null},n=(e,n,r)=>{e.addEventListener(n,r),t.handlers.push({element:e,event:n,handler:r})};function o(){a(e,"wrapper").forEach(t=>{const o=t;o.dataset.hsFormRangeInit||(o.dataset.hsFormRangeInit="true",function(t,n){const o=t.querySelector("input[type='range']");if(!o)return void console.warn('[range] Missing <input type="range"> element in wrapper',t);const s=r(e,"output",t),a=()=>{const n=o.min?+o.min:0,r=o.max?+o.max:100,a=+o.value||n,i=(a-n)/(r-n);t.style.setProperty(`${m._global.cssVars.prefix}${e.cssVars?.progress||"progress"}`,String(i)),s&&(s.textContent=String(a))};n(o,"input",a),a()}(o,n))})}return"loading"===document.readyState?(t.domContentLoadedHandler=o,document.addEventListener("DOMContentLoaded",t.domContentLoadedHandler)):o(),{result:"range initialized",destroy:()=>{t.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",t.domContentLoadedHandler),t.domContentLoadedHandler=null),t.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),t.handlers.length=0;a(e,"wrapper").forEach(e=>{delete e.dataset.hsFormRangeInit})}}}const R=[{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 B(e){const t={observers:[],handlers:[],timeouts:[],domContentLoadedHandler:null},n=e=>t.observers.push(e),o=(e,n,r,o)=>{e.addEventListener(n,r,o),t.handlers.push({element:e,event:n,handler:r,options:o})},s=e=>t.timeouts.push(e);function i(){document.querySelectorAll("select > div").forEach(e=>{const t=e.parentElement;for(;e.firstChild;)t.appendChild(e.firstChild);e.remove()});a(e,"wrapper").forEach(a=>{!function(n,o,s,a){const i=n.querySelector("select");if(!i)return void console.warn("[select] Missing <select> element in custom select wrapper",n);i.setAttribute("aria-hidden","true"),i.setAttribute("tabindex","-1");const p=i.getAttribute("name")||"custom-select",m=r(e,"list",n),f=r(e,"button",n);if(!m||!f)return void console.warn("[select] Missing required elements (list or button) in custom select wrapper",n);function h(){i.disabled?(f.disabled=!0,f.setAttribute("aria-disabled","true")):(f.disabled=!1,f.removeAttribute("aria-disabled"))}h();const v=m.firstElementChild;if(!v)return void console.warn("[select] Missing option template in custom select list",n);const g=v.cloneNode(!0);v.remove();i.querySelectorAll("option").forEach((e,t)=>{const n=g.cloneNode(!0),r=n.querySelector("span");if(r&&(r.textContent=e.textContent),n.setAttribute("data-value",e.value),n.setAttribute("role","option"),n.setAttribute("id",`${p}-option-${t}`),n.setAttribute("tabindex","-1"),e.selected){n.setAttribute("aria-selected","true");const t=f.querySelector("span")||f;"SPAN"===t.tagName&&(t.textContent=e.textContent),e.value?f.classList.add("is-filled"):f.classList.remove("is-filled")}else n.setAttribute("aria-selected","false");m.appendChild(n)}),m.setAttribute("role","listbox"),m.setAttribute("id",`${p}-listbox`),m.setAttribute("tabindex","-1"),m.setAttribute("aria-hidden","true"),m.inert=!0,f.setAttribute("role","combobox"),f.setAttribute("aria-haspopup","listbox"),f.setAttribute("aria-controls",`${p}-listbox`),f.setAttribute("aria-expanded","false"),f.setAttribute("id",`${p}-button`);const y=n.querySelector("label")||document.querySelector(`label[for="${i.id}"]`);if(y){const e=y.id||`${p}-label`;y.id=e,i.id||(i.id=`${p}-select`),y.setAttribute("for",i.id),f.setAttribute("aria-labelledby",e)}const b=n.querySelector('[data-hs-height="element"]'),w=b||null;let A="",E=null;function L(){return n.classList.contains("is-active")}function k(){const e=L(),t="true"===f.getAttribute("aria-expanded");if(t&&!e&&m.contains(document.activeElement)&&f.focus(),f.setAttribute("aria-expanded",e?"true":"false"),m.setAttribute("aria-hidden",e?"false":"true"),m.inert=!e,e){m.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","0")}),t||u()}else{f.removeAttribute("aria-activedescendant");m.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("tabindex","-1")}),t&&d()}w&&c(w,e,{duration:300,ease:"power2.inOut"})}w&&l(w,L());function x(e){const t=m.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(),f.setAttribute("aria-activedescendant",t[e].id))}function S(e){if(1!==e.length)return!1;if(null!==E){clearTimeout(E);const e=t.timeouts.indexOf(E);e>-1&&t.timeouts.splice(e,1)}const r=Array.from(m.querySelectorAll('[role="option"]'));if(0===r.length)return!1;A+=e.toLowerCase();const o=r.findIndex(e=>e.classList.contains("focused"));if(1===A.length||A.split("").every(e=>e===A[0])){const e=A[0];let t=o+1;for(let o=0;o<r.length;o++){const s=(t+o)%r.length;if((r[s].querySelector("span")?.textContent||r[s].textContent).toLowerCase().startsWith(e))return x(s),L()||n.classList.add("is-active"),E=setTimeout(C,500),a(E),!0}}else{const e=r.findIndex(e=>(e.querySelector("span")?.textContent||e.textContent).toLowerCase().startsWith(A));if(-1!==e)return x(e),L()||n.classList.add("is-active"),E=setTimeout(C,500),a(E),!0}return E=setTimeout(C,500),a(E),!1}function C(){A="",E=null}function q(e){const t=e.getAttribute("data-value")||"",r=e.querySelector("span")?.textContent||e.textContent;i.value=t,i.dispatchEvent(new Event("change",{bubbles:!0}));const o=f.querySelector("span")||f;"SPAN"===o.tagName&&(o.textContent=r),t?f.classList.add("is-filled"):f.classList.remove("is-filled"),m.querySelectorAll('[role="option"]').forEach(e=>{e.setAttribute("aria-selected","false")}),e.setAttribute("aria-selected","true"),n.classList.remove("is-active")}k();const T=e=>{e.preventDefault(),n.classList.toggle("is-active")};o(f,"click",T);const P=e=>{switch(e.key){case"Enter":e.preventDefault();const t=f.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(),L()?x(0):(n.classList.add("is-active"),requestAnimationFrame(()=>{x(0)}));break;case"ArrowUp":if(e.preventDefault(),L()){x(m.querySelectorAll('[role="option"]').length-1)}else n.classList.add("is-active"),requestAnimationFrame(()=>{x(0)});break;case"Escape":L()&&(e.preventDefault(),n.classList.remove("is-active"));break;case"Home":e.preventDefault(),L()||n.classList.add("is-active"),x(0);break;case"End":e.preventDefault(),L()||n.classList.add("is-active");x(m.querySelectorAll('[role="option"]').length-1);break;default:S(e.key)&&e.preventDefault()}};o(f,"keydown",P);const D=e=>{const t=e.target.closest('[role="option"]');if(!t)return;const r=Array.from(m.querySelectorAll('[role="option"]')),o=r.indexOf(t);switch(e.key){case"ArrowDown":e.preventDefault(),o<r.length-1&&x(o+1);break;case"ArrowUp":e.preventDefault(),o>0&&x(o-1);break;case"Enter":e.preventDefault(),q(t);break;case"Escape":e.preventDefault(),n.classList.remove("is-active"),f.focus();break;case"Home":e.preventDefault(),x(0);break;case"End":e.preventDefault(),x(r.length-1);break;default:S(e.key)&&e.preventDefault()}};o(m,"keydown",D);o(m,"click",e=>{const t=e.target.closest('[role="option"]');t&&q(t)});const $=e=>{e.relatedTarget&&n.contains(e.relatedTarget)||!n.classList.contains("is-active")||n.classList.remove("is-active")};o(m,"focusout",$);const F=e=>{n.classList.contains("is-active")&&!n.contains(e.target)&&n.classList.remove("is-active")};o(document,"click",F);const I=new MutationObserver(()=>{k()});I.observe(n,{attributes:!0,attributeFilter:["class"]}),s(I);const N=new MutationObserver(()=>{h()});N.observe(i,{attributes:!0,attributeFilter:["disabled"]}),s(N);const M=()=>{const e=i.options[i.selectedIndex];if(e){const t=m.querySelectorAll('[role="option"]'),n=Array.from(t).find(t=>t.getAttribute("data-value")===e.value);if(n){const r=n.querySelector("span")?.textContent||n.textContent,o=f.querySelector("span")||f;"SPAN"===o.tagName&&(o.textContent=r),e.value?f.classList.add("is-filled"):f.classList.remove("is-filled"),t.forEach(e=>{e.setAttribute("aria-selected","false")}),n.setAttribute("aria-selected","true")}}};o(i,"change",M),o(i,"input",M);const H=i.closest("form");if(H){o(H,"reset",()=>{setTimeout(()=>{M()},0)})}}(a,o,n,s)})}return"loading"===document.readyState?(t.domContentLoadedHandler=i,document.addEventListener("DOMContentLoaded",t.domContentLoadedHandler)):i(),window.initCustomSelects=i,{result:"select initialized",destroy:()=>{t.domContentLoadedHandler&&(document.removeEventListener("DOMContentLoaded",t.domContentLoadedHandler),t.domContentLoadedHandler=null),t.observers.forEach(e=>e.disconnect()),t.observers.length=0,t.timeouts.forEach(e=>clearTimeout(e)),t.timeouts.length=0,t.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),t.handlers.length=0,window.initCustomSelects&&delete window.initCustomSelects}}}async function V(e){const t={destroyFunctions:[]};try{const n=function(e){const t=a(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 r=n[0];if(""!==r.value)return void console.warn("[select-states] Template option must have empty value for placeholder. Found value:",r.value,t);const o=r.textContent;t.innerHTML="";const s=document.createElement("option");s.value="",s.textContent=o,t.appendChild(s),R.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);n?.destroy&&t.destroyFunctions.push(n.destroy);const r=B(e["custom-select"]);return r?.destroy&&t.destroyFunctions.push(r.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(n){throw console.error("[select] Initialization failed:",n),t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[select] Error during error cleanup:",t)}}),n}}async function U(){const e=m.default.form,t={destroyFunctions:[]},n=i(e.honeypot,"form-handler");if(document.querySelector(n))try{const n=function(e){const t={honeypotHandler:null},n=t=>{const n=t.target;if("FORM"!==n.tagName)return;const o=r(e,"form-handler",n);return o&&o.value?(t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation(),!1):void 0};return t.honeypotHandler=n,document.addEventListener("submit",n,!0),{result:"honeypot initialized",destroy:()=>{t.honeypotHandler&&(document.removeEventListener("submit",t.honeypotHandler,!0),t.honeypotHandler=null)}}}(e.honeypot);n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[form] Error initializing honeypot:",c)}const o=i(e.range,"wrapper");if(document.querySelector(o))try{const n=W(e.range);n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[form] Error initializing range:",c)}const s=i(e.test,"wrapper");if(document.querySelector(s))try{const n=function(e){const t={handlers:[]},n=(e,n,r,o)=>{e.addEventListener(n,r,o),t.handlers.push({element:e,event:n,handler:r,options:o})},o=a(e,"wrapper");return o.forEach(t=>{const o=t.querySelector("form");if(!o)return void console.warn('[form-test] No <form> element found within data-hs-form-test="wrapper"',t);const s=r(e,"info",t),a=()=>{const e=new FormData(o),t={};for(const[n,r]of e.entries())t[n]=r;if(s){const e=document.createElement("pre");e.textContent=JSON.stringify(t,null,2),s.innerHTML="",s.appendChild(document.createTextNode("Test mode active - Live form data:")),s.appendChild(e)}};s&&(s.textContent="Test mode active, preventing native submissions",a()),n(o,"input",a),n(o,"change",a);const i=o.querySelector('button[type="submit"], input[type="submit"]')||o.querySelector("button:not([type])");i&&n(i,"click",()=>{console.log("[form-test] Submit button clicked"),requestAnimationFrame(()=>{o.checkValidity()||console.log("[form-test] Browser blocked submission - validation failed")})}),n(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,s]of t.entries())n[o]=s;const r=`✅ Form would submit successfully at ${(new Date).toLocaleTimeString()}`;if(s){const e=document.createElement("pre");e.textContent=JSON.stringify(n,null,2),s.innerHTML="",s.appendChild(document.createTextNode(r)),s.appendChild(e)}else console.log(r),console.log("Form data:",n);return!1},!0)}),{result:`test initialized on ${o.length} form${1!==o.length?"s":""}`,destroy:()=>{t.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),t.handlers.length=0}}}(e.test);n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[form] Error initializing test:",c)}const l=i(e.select,"wrapper");if(document.querySelector(l))try{const n=await V(e.select);n?.destroy&&t.destroyFunctions.push(n.destroy)}catch(c){console.error("[form] Error initializing select:",c)}return{result:`form initialized (${t.destroyFunctions.length} modules active)`,destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(c){console.error("[form] Error during cleanup:",c)}}),t.destroyFunctions.length=0}}}async function X(){const e={destroyFunctions:[]},t=m.default;try{const t=await S();t?.destroy&&e.destroyFunctions.push(t.destroy)}catch(a){console.error("[default] Error initializing transition:",a)}const n=[C(t["smooth-scroll"]),F(t.navbar),I(t.accordion),M(),H(t.pagination),O(t.comparison),z(t.tabs),U()],r=await Promise.allSettled(n);r.forEach(t=>{"fulfilled"===t.status&&t.value?.destroy&&e.destroyFunctions.push(t.value.destroy)});const o=r.filter(e=>"fulfilled"===e.status).length,s=r.length-o;return s>0&&console.warn(`[default] ${o+1}/${r.length+1} modules loaded successfully. ${s} failed but won't affect other modules.`),{result:"default initialized",destroy:()=>{e.destroyFunctions.forEach(e=>{try{e()}catch(a){console.error("[default] Error during cleanup:",a)}}),e.destroyFunctions.length=0}}}export{X as init};
|
|
2
|
-
//# sourceMappingURL=hs-default-BVsQjN21.js.map
|
|
Binary file
|
|
Binary file
|