@hortonstudio/main 1.9.22 → 1.9.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +62 -64
  2. package/dist/assets/hs-animations-BDMqlbof.js +3 -0
  3. package/dist/assets/hs-animations-BDMqlbof.js. +3 -0
  4. package/dist/assets/hs-animations-BDMqlbof.js.gz +0 -0
  5. package/dist/assets/hs-animations-BDMqlbof.js.map +1 -0
  6. package/dist/assets/hs-attributeSelector-6pGcDBo-.js +2 -0
  7. package/dist/assets/hs-attributeSelector-6pGcDBo-.js.map +1 -0
  8. package/dist/assets/hs-comparison-Ja8EiSGD.js +2 -0
  9. package/dist/assets/hs-comparison-Ja8EiSGD.js. +2 -0
  10. package/dist/assets/hs-comparison-Ja8EiSGD.js.gz +0 -0
  11. package/dist/assets/hs-comparison-Ja8EiSGD.js.map +1 -0
  12. package/dist/assets/hs-counter-Bfh7_P60.js +2 -0
  13. package/dist/assets/hs-counter-Bfh7_P60.js. +2 -0
  14. package/dist/assets/hs-counter-Bfh7_P60.js.gz +0 -0
  15. package/dist/assets/hs-counter-Bfh7_P60.js.map +1 -0
  16. package/dist/assets/hs-cssVariables-BjuwJfDJ.js +2 -0
  17. package/dist/assets/hs-cssVariables-BjuwJfDJ.js.map +1 -0
  18. package/dist/assets/hs-default-CLmDRb9d.js +2 -0
  19. package/dist/assets/hs-default-CLmDRb9d.js. +2 -0
  20. package/dist/assets/hs-default-CLmDRb9d.js.gz +0 -0
  21. package/dist/assets/hs-default-CLmDRb9d.js.map +1 -0
  22. package/dist/assets/hs-form-COFGgawz.js +2 -0
  23. package/dist/assets/hs-form-COFGgawz.js. +2 -0
  24. package/dist/assets/hs-form-COFGgawz.js.gz +0 -0
  25. package/dist/assets/hs-form-COFGgawz.js.map +1 -0
  26. package/dist/assets/hs-marquee-CZ9pmCbT.js +2 -0
  27. package/dist/assets/hs-marquee-CZ9pmCbT.js. +2 -0
  28. package/dist/assets/hs-marquee-CZ9pmCbT.js.gz +0 -0
  29. package/dist/assets/hs-marquee-CZ9pmCbT.js.map +1 -0
  30. package/dist/assets/hs-modalManager-H_YegPAO.js +2 -0
  31. package/dist/assets/hs-modalManager-H_YegPAO.js. +2 -0
  32. package/dist/assets/hs-modalManager-H_YegPAO.js.gz +0 -0
  33. package/dist/assets/hs-modalManager-H_YegPAO.js.map +1 -0
  34. package/dist/assets/hs-normalize-CTwtG5-a.js +2 -0
  35. package/dist/assets/hs-normalize-CTwtG5-a.js. +2 -0
  36. package/dist/assets/hs-normalize-CTwtG5-a.js.gz +0 -0
  37. package/dist/assets/hs-normalize-CTwtG5-a.js.map +1 -0
  38. package/dist/assets/hs-orchestrator-J8b7XRk1.js +2 -0
  39. package/dist/assets/hs-orchestrator-J8b7XRk1.js. +2 -0
  40. package/dist/assets/hs-orchestrator-J8b7XRk1.js.gz +0 -0
  41. package/dist/assets/hs-orchestrator-J8b7XRk1.js.map +1 -0
  42. package/dist/assets/hs-pagination-DcOxmDPJ.js +2 -0
  43. package/dist/assets/hs-pagination-DcOxmDPJ.js. +2 -0
  44. package/dist/assets/hs-pagination-DcOxmDPJ.js.gz +0 -0
  45. package/dist/assets/hs-pagination-DcOxmDPJ.js.map +1 -0
  46. package/dist/assets/hs-structure-DhNix64P.js +3 -0
  47. package/dist/assets/hs-structure-DhNix64P.js. +3 -0
  48. package/dist/assets/hs-structure-DhNix64P.js.gz +0 -0
  49. package/dist/assets/hs-structure-DhNix64P.js.map +1 -0
  50. package/dist/assets/hs-tabs-CaxqHoGW.js +2 -0
  51. package/dist/assets/hs-tabs-CaxqHoGW.js. +2 -0
  52. package/dist/assets/hs-tabs-CaxqHoGW.js.gz +0 -0
  53. package/dist/assets/hs-tabs-CaxqHoGW.js.map +1 -0
  54. package/dist/assets/hs-toc-fxIQS7tz.js +2 -0
  55. package/dist/assets/hs-toc-fxIQS7tz.js. +2 -0
  56. package/dist/assets/hs-toc-fxIQS7tz.js.gz +0 -0
  57. package/dist/assets/hs-toc-fxIQS7tz.js.map +1 -0
  58. package/dist/assets/hs-transition-CDNuGJNq.js +2 -0
  59. package/dist/assets/hs-transition-CDNuGJNq.js. +2 -0
  60. package/dist/assets/hs-transition-CDNuGJNq.js.gz +0 -0
  61. package/dist/assets/hs-transition-CDNuGJNq.js.map +1 -0
  62. package/dist/assets/hs-utils-CKm6QhLw.js +2 -0
  63. package/dist/assets/hs-utils-CKm6QhLw.js.map +1 -0
  64. package/dist/main.js +2 -2
  65. package/dist/main.js. +2 -2
  66. package/dist/main.js.gz +0 -0
  67. package/dist/main.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/assets/animations-igIF6V0K.js +0 -3
  70. package/dist/assets/animations-igIF6V0K.js. +0 -3
  71. package/dist/assets/animations-igIF6V0K.js.gz +0 -0
  72. package/dist/assets/animations-igIF6V0K.js.map +0 -1
  73. package/dist/assets/counter-B9xmgh8V.js +0 -2
  74. package/dist/assets/counter-B9xmgh8V.js. +0 -2
  75. package/dist/assets/counter-B9xmgh8V.js.gz +0 -0
  76. package/dist/assets/counter-B9xmgh8V.js.map +0 -1
  77. package/dist/assets/cssVariables-n9wQSSYb.js +0 -2
  78. package/dist/assets/cssVariables-n9wQSSYb.js.map +0 -1
  79. package/dist/assets/default-CZ6vle49.js +0 -2
  80. package/dist/assets/default-CZ6vle49.js. +0 -2
  81. package/dist/assets/default-CZ6vle49.js.gz +0 -0
  82. package/dist/assets/default-CZ6vle49.js.map +0 -1
  83. package/dist/assets/modalManager-LtDi9OJz.js +0 -2
  84. package/dist/assets/modalManager-LtDi9OJz.js. +0 -2
  85. package/dist/assets/modalManager-LtDi9OJz.js.gz +0 -0
  86. package/dist/assets/modalManager-LtDi9OJz.js.map +0 -1
  87. package/dist/assets/normalize-DWI4olFS.js +0 -2
  88. package/dist/assets/normalize-DWI4olFS.js. +0 -2
  89. package/dist/assets/normalize-DWI4olFS.js.gz +0 -0
  90. package/dist/assets/normalize-DWI4olFS.js.map +0 -1
  91. package/dist/assets/structure--7b3v7AH.js +0 -2
  92. package/dist/assets/structure--7b3v7AH.js. +0 -2
  93. package/dist/assets/structure--7b3v7AH.js.gz +0 -0
  94. package/dist/assets/structure--7b3v7AH.js.map +0 -1
  95. package/dist/assets/utils-DA-PANmk.js +0 -2
  96. package/dist/assets/utils-DA-PANmk.js.map +0 -1
  97. package/dist/bootstrap.js +0 -2
  98. package/dist/bootstrap.js.map +0 -1
package/README.md CHANGED
@@ -8,36 +8,28 @@ Auto-initializing JavaScript library for Webflow sites with animations, accessib
8
8
 
9
9
  ## Installation
10
10
 
11
+ ### Standard Installation
12
+
11
13
  ```html
12
- <script src="https://cdn.jsdelivr.net/npm/@hortonstudio/main@2/dist/bootstrap.js"></script>
13
14
  <script type="module" src="https://cdn.jsdelivr.net/npm/@hortonstudio/main@2/dist/main.js"></script>
15
+ <script>(function(){function w(){if(window.hsmain?.afterReady){window.hsmain.afterReady(function(){window.hsmainReady=true;window.dispatchEvent(new Event('hsmain:ready'))});}else{setTimeout(w,50);}}w();})();</script>
14
16
  ```
15
17
 
16
18
  **Local Development:**
17
19
 
18
20
  ```html
19
- <!-- Local dev with HMR (run: npm run dev) -->
20
- <script src="http://localhost:5173/public/bootstrap.js"></script>
21
+ <!-- Local testing (run: npm run dev) -->
21
22
  <script type="module" src="http://localhost:5173/index.ts"></script>
23
+ <script>(function(){function w(){if(window.hsmain?.afterReady){window.hsmain.afterReady(function(){window.hsmainReady=true;window.dispatchEvent(new Event('hsmain:ready'))});}else{setTimeout(w,50);}}w();})();</script>
22
24
  ```
23
-
24
- ---
25
-
26
- ## Configuration
27
-
28
- ### SPA Mode (Barba.js, Swup, etc.)
29
-
30
- For single-page applications, add `data-hs-spa="true"` to disable automatic link interception:
25
+ **SPA Mode (Barba.js, Swup, etc.): Add data-hs-spa="true" to the module loader**
31
26
 
32
27
  ```html
33
- <script
34
- type="module"
35
- src="https://cdn.jsdelivr.net/npm/@hortonstudio/main@2/dist/main.js"
36
- data-hs-spa="true"
37
- ></script>
28
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@hortonstudio/main@2/dist/main.js" data-hs-spa="true"></script>
29
+ <script>(function(){function w(){if(window.hsmain?.afterReady){window.hsmain.afterReady(function(){window.hsmainReady=true;window.dispatchEvent(new Event('hsmain:ready'))});}else{setTimeout(w,50);}}w();})();</script>
38
30
  ```
39
31
 
40
- Then dispatch events from your router:
32
+ ## Configuration
41
33
 
42
34
  ```javascript
43
35
  // Example: Barba.js integration
@@ -54,6 +46,39 @@ barba.hooks.after(() => {
54
46
 
55
47
  ## API Usage
56
48
 
49
+ ### External Script Integration
50
+
51
+ When using external scripts & libraries (Barba.js, GSAP ScrollTrigger, etc.) that need to wait for hsmain to be ready, the inline helper script (included with standard installation) ensures `window.hsmain` is available.
52
+
53
+ **External scripts should use the callback pattern:**
54
+
55
+ ```html
56
+ <script>
57
+ window.hsmain?.afterReady(() => {
58
+ // Your code here
59
+ });
60
+ </script>
61
+ ```
62
+
63
+ </script>
64
+ ```
65
+
66
+ **Why this works:**
67
+
68
+ The inline helper script (included in standard installation) polls for `window.hsmain` to exist and calls `afterReady()` once initialization completes. This guarantees that by the time your external script runs, `window.hsmain` exists and `afterReady()` will fire either immediately (if already ready) or when initialization completes.
69
+
70
+ ### Cleanup
71
+
72
+ ```javascript
73
+ // Destroy all modules (useful for SPA navigation)
74
+ window.hsmain.destroy();
75
+
76
+ // Reinitialize everything
77
+ await window.hsmain.reinitialize();
78
+ ```
79
+
80
+ ---
81
+
57
82
  ### Manual Module Loading
58
83
 
59
84
  ```javascript
@@ -82,14 +107,29 @@ const status = window.hsmain.status('counter');
82
107
  console.log(status); // { loaded: true, loading: false }
83
108
  ```
84
109
 
85
- ### Cleanup
110
+ ### Modal Manager & Lenis Integration
111
+
112
+ Modal manager automatically detects and handles Lenis smooth scroll (stops on modal open, starts on close).
86
113
 
87
114
  ```javascript
88
- // Destroy all modules (useful for SPA navigation)
89
- window.hsmain.destroy();
115
+ // Auto-detection works with zero config
116
+ // Just use modals normally - Lenis is handled automatically
90
117
 
91
- // Reinitialize everything
92
- await window.hsmain.reinitialize();
118
+ // Disable auto Lenis handling if needed
119
+ window.HS.modal.setLenisEnabled(false);
120
+
121
+ // Manual modal control
122
+ window.HS.modal.open();
123
+ window.HS.modal.close();
124
+
125
+ // Custom callbacks (run in addition to auto Lenis handling)
126
+ window.HS.modal.onOpen(() => {
127
+ console.log('Modal opened');
128
+ });
129
+
130
+ window.HS.modal.onClose(() => {
131
+ console.log('Modal closed');
132
+ });
93
133
  ```
94
134
 
95
135
  ---
@@ -102,45 +142,3 @@ await window.hsmain.reinitialize();
102
142
  - **SPA Compatible:** Works with Barba.js, Swup, and other routers
103
143
  - **Memory Safe:** Proper cleanup tracking for observers and event handlers
104
144
  - **Phase-based Loading:** Optimized initialization sequence
105
-
106
- ---
107
-
108
- ## Module Documentation
109
-
110
- Each module has its own README with detailed usage instructions:
111
-
112
- - **Animations:** `src/modules/default/` - Counter, comparison sliders, marquee
113
- - **Navigation:** `src/modules/default/navbar/` - Dropdowns and mobile menus
114
- - **Transitions:** `src/modules/transition/` - Page transitions with namespace support
115
- - **Forms:** `src/modules/structure/functions/form/` - Custom selects and form enhancements
116
- - **Accessibility:** `src/modules/default/functions/accordion/` - ARIA attributes
117
- - **Utilities:** `src/modules/structure/` - Year replacement, TOC, pagination, site settings
118
-
119
- ---
120
-
121
- ## Development
122
-
123
- ### Build
124
-
125
- ```bash
126
- npm run build
127
- ```
128
-
129
- ### Type Checking
130
-
131
- ```bash
132
- npm run type-check
133
- ```
134
-
135
- ### Linting
136
-
137
- ```bash
138
- npm run lint
139
- npm run format
140
- ```
141
-
142
- ---
143
-
144
- ## License
145
-
146
- ISC
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-counter-Bfh7_P60.js","assets/hs-modalManager-H_YegPAO.js","main.js","assets/hs-marquee-CZ9pmCbT.js","assets/hs-utils-CKm6QhLw.js","assets/hs-transition-CDNuGJNq.js"])))=>i.map(i=>d[i]);
2
+ import{_ as t}from"../main.js";import"./hs-modalManager-H_YegPAO.js";import{c as e}from"./hs-orchestrator-J8b7XRk1.js";const o=[{name:"counter",selector:'[data-hs-anim="counter"]',import:()=>t(()=>import("./hs-counter-Bfh7_P60.js"),__vite__mapDeps([0,1,2]))},{name:"marquee",selector:'[data-hs-marquee="wrapper"]',import:()=>t(()=>import("./hs-marquee-CZ9pmCbT.js"),__vite__mapDeps([3,4,1,2]))},{name:"transition",selector:'[data-hs-transition="wrapper"]',import:()=>t(()=>import("./hs-transition-CDNuGJNq.js"),__vite__mapDeps([5,4,1,2]))}],a=(()=>{const t=o.filter(t=>document.querySelector(t.selector)).map(t=>t.import().catch(e=>(console.error(`[animations] Failed to preload ${t.name}:`,e),null)));return Promise.allSettled(t)})();async function r(){if(document.documentElement.getAttributeNames().some(t=>t.startsWith("data-wf-"))){if(!(await async function(t=3e3){return console.log("[Webflow] Waiting for IX3, timeout:",t,"ms"),new Promise(e=>{const o=Date.now(),a=()=>{const r=document.documentElement,n=r.classList.contains("w-mod-ix3"),s=r.hasAttribute("data-wf-ix-ready"),i=n||s,m=Date.now()-o;i?(console.log("[Webflow] IX3 detected after",m,"ms"),e(!0)):m>t?(console.warn(`[Webflow] IX3 timeout after ${m}ms - proceeding without IX3 coordination`),e(!1)):setTimeout(a,50)};a()})}(3e3))){const t=document.querySelector('[data-hs-transition="wrapper"]');t&&(console.warn("[animations] Webflow IX3 timeout - removing transition wrapper to prevent FOUC"),t.remove())}}await a;const t=e(o),{loaded:r}=await t.scan();return{result:`animations initialized (${r.length} active)`,rescan:t.scan,destroy:t.destroy}}export{r as init};
3
+ //# sourceMappingURL=hs-animations-BDMqlbof.js.map
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-counter-Bfh7_P60.js","assets/hs-modalManager-H_YegPAO.js","main.js","assets/hs-marquee-CZ9pmCbT.js","assets/hs-utils-CKm6QhLw.js","assets/hs-transition-CDNuGJNq.js"])))=>i.map(i=>d[i]);
2
+ import{_ as t}from"../main.js";import"./hs-modalManager-H_YegPAO.js";import{c as e}from"./hs-orchestrator-J8b7XRk1.js";const o=[{name:"counter",selector:'[data-hs-anim="counter"]',import:()=>t(()=>import("./hs-counter-Bfh7_P60.js"),__vite__mapDeps([0,1,2]))},{name:"marquee",selector:'[data-hs-marquee="wrapper"]',import:()=>t(()=>import("./hs-marquee-CZ9pmCbT.js"),__vite__mapDeps([3,4,1,2]))},{name:"transition",selector:'[data-hs-transition="wrapper"]',import:()=>t(()=>import("./hs-transition-CDNuGJNq.js"),__vite__mapDeps([5,4,1,2]))}],a=(()=>{const t=o.filter(t=>document.querySelector(t.selector)).map(t=>t.import().catch(e=>(console.error(`[animations] Failed to preload ${t.name}:`,e),null)));return Promise.allSettled(t)})();async function r(){if(document.documentElement.getAttributeNames().some(t=>t.startsWith("data-wf-"))){if(!(await async function(t=3e3){return console.log("[Webflow] Waiting for IX3, timeout:",t,"ms"),new Promise(e=>{const o=Date.now(),a=()=>{const r=document.documentElement,n=r.classList.contains("w-mod-ix3"),s=r.hasAttribute("data-wf-ix-ready"),i=n||s,m=Date.now()-o;i?(console.log("[Webflow] IX3 detected after",m,"ms"),e(!0)):m>t?(console.warn(`[Webflow] IX3 timeout after ${m}ms - proceeding without IX3 coordination`),e(!1)):setTimeout(a,50)};a()})}(3e3))){const t=document.querySelector('[data-hs-transition="wrapper"]');t&&(console.warn("[animations] Webflow IX3 timeout - removing transition wrapper to prevent FOUC"),t.remove())}}await a;const t=e(o),{loaded:r}=await t.scan();return{result:`animations initialized (${r.length} active)`,rescan:t.scan,destroy:t.destroy}}export{r as init};
3
+ //# sourceMappingURL=hs-animations-BDMqlbof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";uHAiCA,MAAMA,EAA4C,CAChD,CACEC,KAAM,UACNC,SAAU,2BACVC,OAAQ,UAAMA,OAAO,4BAAwBC,2BAE/C,CACEH,KAAM,UACNC,SAAU,8BACVC,OAAQ,UAAMA,OAAO,4BAAwBC,6BAE/C,CACEH,KAAM,aACNC,SAAU,iCACVC,OAAQ,UAAMA,OAAO,+BAA2BC,8BAQ9CC,QACJ,MAKMC,EALmBN,EAAmBO,OAAQC,GAClDC,SAASC,cAAcF,EAAON,WAISS,IAAKH,GAC5CA,EAAOL,SAASS,MAAOC,IACrBC,QAAQD,MAAM,kCAAkCL,EAAOP,QAASY,GACzD,QAIX,OAAOE,QAAQC,WAAWV,EAC5B,KAEAW,eAAsBC,IAIpB,GC1DaT,SAASU,gBACEC,oBACNC,KAAMC,GAASA,EAAKC,WAAW,aDwDvC,CAGR,WClDJN,eAAiCO,EAAkB,KAEjD,OADAV,QAAQW,IAAI,sCAAuCD,EAAS,MACrD,IAAIT,QAASW,IAClB,MAAMC,EAAYC,KAAKC,MAEjBC,EAAW,KACf,MAAMC,EAAOtB,SAASU,gBAGhBa,EAAeD,EAAKE,UAAUC,SAAS,aACvCC,EAAiBJ,EAAKK,aAAa,oBACnCC,EAAiBL,GAAgBG,EAEjCG,EAAUV,KAAKC,MAAQF,EAEzBU,GACFvB,QAAQW,IAAI,+BAAgCa,EAAS,MACrDZ,GAAQ,IACCY,EAAUd,GAEnBV,QAAQyB,KACN,+BAA+BD,6CAEjCZ,GAAQ,IAERc,WAAWV,EAAU,KAGzBA,KAEJ,CDkB2BW,CAAW,MAEnB,CAEb,MAAMC,EAAoBjC,SAASC,cAAc,kCAC7CgC,IACF5B,QAAQyB,KACN,kFAEFG,EAAkBC,SAEtB,CACF,OAGMtC,EAGN,MAAMuC,EAAeC,EAAmB7C,IAClC8C,OAAEA,SAAiBF,EAAaG,OAEtC,MAAO,CACLC,OAAQ,2BAA2BF,EAAOG,iBAC1CC,OAAQN,EAAaG,KACrBI,QAASP,EAAaO,QAE1B","names":["ANIMATION_REGISTRY","name","selector","import","__VITE_PRELOAD__","preloadAnimations","preloadPromises","filter","module","document","querySelector","map","catch","error","console","Promise","allSettled","async","init","documentElement","getAttributeNames","some","attr","startsWith","timeout","log","resolve","startTime","Date","now","checkIx3","html","hasLegacyIx3","classList","contains","hasNewIxSignal","hasAttribute","hasAnyIxSignal","elapsed","warn","setTimeout","waitForIx3","transitionWrapper","remove","orchestrator","createOrchestrator","loaded","scan","result","length","rescan","destroy"],"ignoreList":[],"sources":["../../src/animations/animations.ts","../../src/utils/webflow.ts"],"sourcesContent":["/**\n * Animations Orchestrator\n *\n * Conditionally loads animation modules based on DOM presence.\n * Uses registry pattern for scalable animation management.\n *\n * Features:\n * - Self-registering animation system (add new animations in one line)\n * - Dynamic imports for code-splitting\n * - Prevents duplicate initialization\n * - SPA-friendly rescan() method\n * - Centralized destroy cleanup\n * - Webflow IX3 coordination with timeout fallback\n *\n * Architecture:\n * - Registry-based discovery (scales to 100s of animations)\n * - Scans DOM for registered selectors\n * - Dynamically imports only the animations found\n * - Waits for Webflow IX3 before initializing (prevents FOUC)\n * - Removes transition wrapper on IX3 timeout (graceful degradation)\n * - Exposes rescan() for SPA page transitions\n *\n * Adding new animations:\n * 1. Add entry to ANIMATION_REGISTRY below\n * 2. That's it - orchestrator handles the rest\n */\n\nimport { createOrchestrator, type ModuleRegistryEntry, isWebflow, waitForIx3 } from '@utils';\n\n/**\n * Animation Registry\n * Add new animations here - one line per animation\n */\nconst ANIMATION_REGISTRY: ModuleRegistryEntry[] = [\n {\n name: 'counter',\n selector: '[data-hs-anim=\"counter\"]',\n import: () => import('./functions/counter.ts'),\n },\n {\n name: 'marquee',\n selector: '[data-hs-marquee=\"wrapper\"]',\n import: () => import('./functions/marquee.ts'),\n },\n {\n name: 'transition',\n selector: '[data-hs-transition=\"wrapper\"]',\n import: () => import('./functions/transition.ts'),\n },\n // Add more animations here:\n // { name: 'hamburger', selector: '[data-hs-hamburger=\"squeeze\"]', import: () => import('./functions/hamburger.ts') },\n];\n\n// Pre-download animation modules as soon as this file loads (before init is called)\n// This allows parallel downloads while still respecting IX3 timing for initialization\nconst preloadAnimations = (() => {\n const modulesToPreload = ANIMATION_REGISTRY.filter((module) =>\n document.querySelector(module.selector)\n );\n\n // Download all found modules in parallel\n const preloadPromises = modulesToPreload.map((module) =>\n module.import().catch((error) => {\n console.error(`[animations] Failed to preload ${module.name}:`, error);\n return null;\n })\n );\n\n return Promise.allSettled(preloadPromises);\n})();\n\nexport async function init() {\n // Wait for Webflow IX3 before initializing animations (prevents FOUC and conflicts)\n const isWf = isWebflow();\n\n if (isWf) {\n const ix3Ready = await waitForIx3(3000); // 3 second timeout\n\n if (!ix3Ready) {\n // IX3 didn't load in time - remove transition wrapper to prevent FOUC\n const transitionWrapper = document.querySelector('[data-hs-transition=\"wrapper\"]');\n if (transitionWrapper) {\n console.warn(\n '[animations] Webflow IX3 timeout - removing transition wrapper to prevent FOUC'\n );\n transitionWrapper.remove();\n }\n }\n }\n\n // Wait for preloading to complete (modules are already downloaded)\n await preloadAnimations;\n\n // Initialize all animations (transition will skip if wrapper was removed)\n const orchestrator = createOrchestrator(ANIMATION_REGISTRY);\n const { loaded } = await orchestrator.scan();\n\n return {\n result: `animations initialized (${loaded.length} active)`,\n rescan: orchestrator.scan,\n destroy: orchestrator.destroy,\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 with timeout fallback\n * @param timeout - Maximum time to wait in milliseconds (default: 3000ms)\n * @returns Promise<boolean> - true if IX3 loaded, false if timeout\n */\nexport async function waitForIx3(timeout: number = 3000): Promise<boolean> {\n console.log('[Webflow] Waiting for IX3, timeout:', timeout, 'ms');\n return new Promise((resolve) => {\n const startTime = Date.now();\n\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 const elapsed = Date.now() - startTime;\n\n if (hasAnyIxSignal) {\n console.log('[Webflow] IX3 detected after', elapsed, 'ms');\n resolve(true); // IX3 loaded successfully\n } else if (elapsed > timeout) {\n // Timeout reached - proceed without IX3\n console.warn(\n `[Webflow] IX3 timeout after ${elapsed}ms - proceeding without IX3 coordination`\n );\n resolve(false);\n } else {\n setTimeout(checkIx3, 50);\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"],"file":"hs-animations-BDMqlbof.js"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){const n=e.attributes?.elements?.[t];if(!n)return console.warn(`[attributeSelector] No config for element: ${t}`),"";return[`[${n.primary}]`,...(n.aliases||[]).map(e=>`[${e}]`)].join(", ")}function t(t,n,r=document){const o=e(t,n);return r.querySelectorAll(o)}function n(t,n,r=document){const o=e(t,n);return r.querySelector(o)}export{n as a,e as g,t as q};
2
+ //# sourceMappingURL=hs-attributeSelector-6pGcDBo-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-attributeSelector-6pGcDBo-.js","sources":["../../src/utils/attributeSelector.ts"],"sourcesContent":["/**\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"],"names":["getSelector","config","elementKey","element","attributes","elements","console","warn","primary","aliases","map","alias","join","querySelectorAll","root","document","selector","querySelector"],"mappings":"AAsBO,SAASA,EAAYC,EAAiCC,GAC3D,MAAMC,EAAUF,EAAOG,YAAYC,WAAWH,GAC9C,IAAKC,EAEH,OADAG,QAAQC,KAAK,8CAA8CL,KACpD,GAQT,MALkB,CAChB,IAAIC,EAAQK,eACRL,EAAQM,SAAW,IAAIC,IAAKC,GAAkB,IAAIA,OAGvCC,KAAK,KACxB,CAKO,SAASC,EACdZ,EACAC,EACAY,EAA2BC,UAE3B,MAAMC,EAAWhB,EAAYC,EAAQC,GACrC,OAAOY,EAAKD,iBAAiBG,EAC/B,CAKO,SAASC,EACdhB,EACAC,EACAY,EAA2BC,UAE3B,MAAMC,EAAWhB,EAAYC,EAAQC,GACrC,OAAOY,EAAKG,cAAcD,EAC5B"}
@@ -0,0 +1,2 @@
1
+ import{g as e}from"./hs-utils-CKm6QhLw.js";import{g as t,w as r}from"./hs-modalManager-H_YegPAO.js";import{q as a,g as n,a as s}from"./hs-attributeSelector-6pGcDBo-.js";import{c as o}from"./hs-cssVariables-BjuwJfDJ.js";import"../main.js";async function i(i){const l=t("comparison");if(!l)return{result:"comparison skipped - GSAP not loaded"};const{gsap:c,Draggable:p}=l;r("comparison",["Draggable"],"error");const d=a(i,"wrapper"),m={draggables:[],handlers:[]},u=n(i,"template-name"),g=n(i,"template-description"),f=n(i,"template-before-image"),h=n(i,"template-after-image");function b(e,t){e.style.setProperty(o.clip,`${t}%`)}function y(t,r){const a=t.templateItems[r];if(!a)return;const n=a.querySelector(u);t.nameElement&&n&&(t.nameElement.textContent=n.textContent);const o=a.querySelector(g);t.descElement&&o&&(t.descElement.textContent=o.textContent);const l=a.querySelector(f);t.beforeImage&&l&&(t.beforeImage.src=l.src,t.beforeImage.alt=l.alt||"");const c=a.querySelector(h);t.afterImage&&c&&(t.afterImage.src=c.src,t.afterImage.alt=c.alt||"",v(t)),t.currentIndex=r,function(t,r){const a=s(i,"pagination",t);if(!a)return;const n=e.classes.active;Array.from(a.children).forEach((e,t)=>{t===r?e.classList.add(n):e.classList.remove(n)})}(t.wrapper,r)}function v(e){const t=e.slider,r=e.wrapper;switch(e.mode){case"before":r.style.setProperty(o.clip,"100%"),t.style.display="none";break;case"after":r.style.setProperty(o.clip,"0%"),t.style.display="none";break;case"split":b(r,e.sliderPosition),t.style.display="flex"}}function w(e,t){const r=e.currentIndex+t,a=e.templateItems.length-1;let n;n=r>a?0:r<0?a:r,y(e,n)}return d.forEach(t=>{const r=s(i,"template-list",t);if(!r)return void console.warn("[comparison] No template list found in wrapper");const a=n(i,"template-item"),o=Array.from(r.querySelectorAll(a));if(0===o.length)return void console.warn("[comparison] No template items found");t.setAttribute("aria-live","polite"),t.setAttribute("aria-label","Before and after image comparison");const l=s(i,"image-wrapper",t),d=s(i,"slider",t),u=s(i,"before-image",t),g=s(i,"after-image",t),f=s(i,"name",t),h=s(i,"description",t);if(!l||!d||!g){const e=[];return l||e.push('image-wrapper (data-hs-comparison="image-wrapper")'),d||e.push('slider (data-hs-comparison="slider")'),g||e.push('after-image (data-hs-comparison-image="after")'),void console.warn(`[comparison] Missing required elements: ${e.join(", ")}`)}const k={wrapper:t,templateItems:o,currentIndex:0,mode:"split",sliderPosition:50,slider:d,beforeImage:u?.querySelector("img"),afterImage:g?.querySelector("img"),nameElement:f,descElement:h,draggable:null};if(y(k,0),b(t,50),p){const e=p.create(d,{type:"x",bounds:l,onDrag:function(){const e=l.getBoundingClientRect(),r=d.getBoundingClientRect().left-e.left,a=Math.max(0,Math.min(100,r/e.width*100));b(t,a),k.sliderPosition=a}});m.draggables.push(e),k.draggable=e[0];const r=e=>{if("split"!==k.mode)return;const r=l.getBoundingClientRect(),a=e.clientX-r.left,n=Math.max(0,Math.min(100,a/r.width*100)),s=a-r.width/2;k.draggable&&(c.set(d,{x:s}),k.draggable.update()),b(t,n),k.sliderPosition=n};l.addEventListener("click",r),m.handlers.push({element:l,event:"click",handler:r})}t.querySelectorAll(`[${i.attributes.properties.modeType}]`).forEach(t=>{const r=t.getAttribute(i.attributes.properties.modeType),a=n(e.clickable,"button"),s=t.querySelector(a)||t;r===k.mode&&t.classList.add(e.classes.active);const o=t=>{t.preventDefault(),function(t,r){const a=t.wrapper.querySelectorAll(`[${i.attributes.properties.modeType}]`),n=e.classes.active;a.forEach(e=>{e.getAttribute(i.attributes.properties.modeType)===r?e.classList.add(n):e.classList.remove(n)}),t.mode=r,v(t)}(k,r)};s.addEventListener("click",o),m.handlers.push({element:s,event:"click",handler:o})}),function(t,r){const a=r.querySelector(`[${i.attributes.properties.navType}="previous"]`),s=r.querySelector(`[${i.attributes.properties.navType}="next"]`);if(a){const r=n(e.clickable,"button"),s=a.querySelector(r)||a;s.setAttribute("aria-label","Previous image");const o=e=>{e.preventDefault(),w(t,-1)};s.addEventListener("click",o),m.handlers.push({element:s,event:"click",handler:o})}if(s){const r=n(e.clickable,"button"),a=s.querySelector(r)||s;a.setAttribute("aria-label","Next image");const o=e=>{e.preventDefault(),w(t,1)};a.addEventListener("click",o),m.handlers.push({element:a,event:"click",handler:o})}}(k,t);const E=s(i,"pagination",t);E&&o.length>1&&function(t,r){const a=r.children[0];if(!a)return;const n=e.classes.active;r.innerHTML="",t.templateItems.forEach((e,s)=>{const o=a.cloneNode(!0);o.classList.remove(n),0===s&&o.classList.add(n);const i=()=>{y(t,s)};o.addEventListener("click",i),m.handlers.push({element:o,event:"click",handler:i}),r.appendChild(o)})}(k,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"),m.handlers.push({element:e.wrapper,event:"keydown",handler:t})}(k)}),{result:`comparison initialized (${d.length} instances)`,destroy:()=>{m.draggables.forEach(e=>{e&&e[0]&&e[0].kill&&e[0].kill()}),m.handlers.forEach(({element:e,event:t,handler:r})=>{e.removeEventListener(t,r)}),m.draggables.length=0,m.handlers.length=0}}}export{i as init};
2
+ //# sourceMappingURL=hs-comparison-Ja8EiSGD.js.map
@@ -0,0 +1,2 @@
1
+ import{g as e}from"./hs-utils-CKm6QhLw.js";import{g as t,w as r}from"./hs-modalManager-H_YegPAO.js";import{q as a,g as n,a as s}from"./hs-attributeSelector-6pGcDBo-.js";import{c as o}from"./hs-cssVariables-BjuwJfDJ.js";import"../main.js";async function i(i){const l=t("comparison");if(!l)return{result:"comparison skipped - GSAP not loaded"};const{gsap:c,Draggable:p}=l;r("comparison",["Draggable"],"error");const d=a(i,"wrapper"),m={draggables:[],handlers:[]},u=n(i,"template-name"),g=n(i,"template-description"),f=n(i,"template-before-image"),h=n(i,"template-after-image");function b(e,t){e.style.setProperty(o.clip,`${t}%`)}function y(t,r){const a=t.templateItems[r];if(!a)return;const n=a.querySelector(u);t.nameElement&&n&&(t.nameElement.textContent=n.textContent);const o=a.querySelector(g);t.descElement&&o&&(t.descElement.textContent=o.textContent);const l=a.querySelector(f);t.beforeImage&&l&&(t.beforeImage.src=l.src,t.beforeImage.alt=l.alt||"");const c=a.querySelector(h);t.afterImage&&c&&(t.afterImage.src=c.src,t.afterImage.alt=c.alt||"",v(t)),t.currentIndex=r,function(t,r){const a=s(i,"pagination",t);if(!a)return;const n=e.classes.active;Array.from(a.children).forEach((e,t)=>{t===r?e.classList.add(n):e.classList.remove(n)})}(t.wrapper,r)}function v(e){const t=e.slider,r=e.wrapper;switch(e.mode){case"before":r.style.setProperty(o.clip,"100%"),t.style.display="none";break;case"after":r.style.setProperty(o.clip,"0%"),t.style.display="none";break;case"split":b(r,e.sliderPosition),t.style.display="flex"}}function w(e,t){const r=e.currentIndex+t,a=e.templateItems.length-1;let n;n=r>a?0:r<0?a:r,y(e,n)}return d.forEach(t=>{const r=s(i,"template-list",t);if(!r)return void console.warn("[comparison] No template list found in wrapper");const a=n(i,"template-item"),o=Array.from(r.querySelectorAll(a));if(0===o.length)return void console.warn("[comparison] No template items found");t.setAttribute("aria-live","polite"),t.setAttribute("aria-label","Before and after image comparison");const l=s(i,"image-wrapper",t),d=s(i,"slider",t),u=s(i,"before-image",t),g=s(i,"after-image",t),f=s(i,"name",t),h=s(i,"description",t);if(!l||!d||!g){const e=[];return l||e.push('image-wrapper (data-hs-comparison="image-wrapper")'),d||e.push('slider (data-hs-comparison="slider")'),g||e.push('after-image (data-hs-comparison-image="after")'),void console.warn(`[comparison] Missing required elements: ${e.join(", ")}`)}const k={wrapper:t,templateItems:o,currentIndex:0,mode:"split",sliderPosition:50,slider:d,beforeImage:u?.querySelector("img"),afterImage:g?.querySelector("img"),nameElement:f,descElement:h,draggable:null};if(y(k,0),b(t,50),p){const e=p.create(d,{type:"x",bounds:l,onDrag:function(){const e=l.getBoundingClientRect(),r=d.getBoundingClientRect().left-e.left,a=Math.max(0,Math.min(100,r/e.width*100));b(t,a),k.sliderPosition=a}});m.draggables.push(e),k.draggable=e[0];const r=e=>{if("split"!==k.mode)return;const r=l.getBoundingClientRect(),a=e.clientX-r.left,n=Math.max(0,Math.min(100,a/r.width*100)),s=a-r.width/2;k.draggable&&(c.set(d,{x:s}),k.draggable.update()),b(t,n),k.sliderPosition=n};l.addEventListener("click",r),m.handlers.push({element:l,event:"click",handler:r})}t.querySelectorAll(`[${i.attributes.properties.modeType}]`).forEach(t=>{const r=t.getAttribute(i.attributes.properties.modeType),a=n(e.clickable,"button"),s=t.querySelector(a)||t;r===k.mode&&t.classList.add(e.classes.active);const o=t=>{t.preventDefault(),function(t,r){const a=t.wrapper.querySelectorAll(`[${i.attributes.properties.modeType}]`),n=e.classes.active;a.forEach(e=>{e.getAttribute(i.attributes.properties.modeType)===r?e.classList.add(n):e.classList.remove(n)}),t.mode=r,v(t)}(k,r)};s.addEventListener("click",o),m.handlers.push({element:s,event:"click",handler:o})}),function(t,r){const a=r.querySelector(`[${i.attributes.properties.navType}="previous"]`),s=r.querySelector(`[${i.attributes.properties.navType}="next"]`);if(a){const r=n(e.clickable,"button"),s=a.querySelector(r)||a;s.setAttribute("aria-label","Previous image");const o=e=>{e.preventDefault(),w(t,-1)};s.addEventListener("click",o),m.handlers.push({element:s,event:"click",handler:o})}if(s){const r=n(e.clickable,"button"),a=s.querySelector(r)||s;a.setAttribute("aria-label","Next image");const o=e=>{e.preventDefault(),w(t,1)};a.addEventListener("click",o),m.handlers.push({element:a,event:"click",handler:o})}}(k,t);const E=s(i,"pagination",t);E&&o.length>1&&function(t,r){const a=r.children[0];if(!a)return;const n=e.classes.active;r.innerHTML="",t.templateItems.forEach((e,s)=>{const o=a.cloneNode(!0);o.classList.remove(n),0===s&&o.classList.add(n);const i=()=>{y(t,s)};o.addEventListener("click",i),m.handlers.push({element:o,event:"click",handler:i}),r.appendChild(o)})}(k,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"),m.handlers.push({element:e.wrapper,event:"keydown",handler:t})}(k)}),{result:`comparison initialized (${d.length} instances)`,destroy:()=>{m.draggables.forEach(e=>{e&&e[0]&&e[0].kill&&e[0].kill()}),m.handlers.forEach(({element:e,event:t,handler:r})=>{e.removeEventListener(t,r)}),m.draggables.length=0,m.handlers.length=0}}}export{i as init};
2
+ //# sourceMappingURL=hs-comparison-Ja8EiSGD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-comparison-Ja8EiSGD.js","sources":["../../src/modules/structure/functions/comparison.ts"],"sourcesContent":["/**\n * Comparison Module\n *\n * Before/after image comparison slider with GSAP Draggable.\n * Uses template list to manage multiple slides with a single persistent slider.\n *\n * Structure:\n * <!-- Template list (hidden, inside wrapper) -->\n * <div data-hs-comparison=\"wrapper\">\n * <div data-hs-comparison-template=\"list\" class=\"u-display-none\">\n * <div data-hs-comparison-template=\"item\">\n * <h3 data-hs-comparison-template=\"name\">Project 1</h3>\n * <div data-hs-comparison-template=\"description\">Description 1</div>\n * <img data-hs-comparison-template=\"before\" src=\"before1.jpg\" alt=\"Before\">\n * <img data-hs-comparison-template=\"after\" src=\"after1.jpg\" alt=\"After\">\n * </div>\n * </div>\n *\n * <!-- Visible slider elements -->\n * <div data-hs-comparison=\"image-wrapper\">\n * <div data-hs-comparison-image=\"before\">\n * <img src=\"placeholder.jpg\">\n * </div>\n * <div data-hs-comparison-image=\"after\">\n * <img src=\"placeholder.jpg\">\n * </div>\n * </div>\n * <div data-hs-comparison=\"slider\"></div>\n * <span data-hs-comparison=\"name\">Placeholder</span>\n * <span data-hs-comparison=\"description\">Placeholder</span>\n * </div>\n */\n\nimport {\n querySelector,\n querySelectorAll,\n getSelector,\n globalConfig,\n getGsap,\n warnMissingDependencies,\n cssVariables,\n} from '@utils';\n\nexport async function init(config: any) {\n const gsapLib = getGsap('comparison');\n if (!gsapLib) {\n return { result: 'comparison skipped - GSAP not loaded' };\n }\n\n const { gsap, Draggable } = gsapLib;\n\n // Warn about missing required dependencies\n warnMissingDependencies('comparison', ['Draggable'], 'error');\n\n const wrappers = querySelectorAll(config, 'wrapper');\n const cleanup = {\n draggables: [] as any[],\n handlers: [] as Array<{ element: Element; event: string; handler: EventListener }>,\n };\n\n // Cache template selectors once (they never change)\n const templateNameSelector = getSelector(config, 'template-name');\n const templateDescSelector = getSelector(config, 'template-description');\n const templateBeforeImageSelector = getSelector(config, 'template-before-image');\n const templateAfterImageSelector = getSelector(config, 'template-after-image');\n\n // Helper functions with access to config and gsap via closure\n function updateClipPath(wrapper: HTMLElement, percentage: number) {\n // Set CSS variable on wrapper, CSS handles the actual clip-path\n wrapper.style.setProperty(cssVariables.clip, `${percentage}%`);\n }\n\n function loadSlide(instance: any, index: number) {\n const templateItem = instance.templateItems[index];\n if (!templateItem) return;\n\n // Update name\n const templateName = templateItem.querySelector(templateNameSelector);\n if (instance.nameElement && templateName) {\n instance.nameElement.textContent = templateName.textContent;\n }\n\n // Update description\n const templateDesc = templateItem.querySelector(templateDescSelector);\n if (instance.descElement && templateDesc) {\n instance.descElement.textContent = templateDesc.textContent;\n }\n\n // Update before image\n const templateBeforeImage = templateItem.querySelector(\n templateBeforeImageSelector\n ) as HTMLImageElement;\n\n if (instance.beforeImage && templateBeforeImage) {\n instance.beforeImage.src = templateBeforeImage.src;\n instance.beforeImage.alt = templateBeforeImage.alt || '';\n }\n\n // Update after image\n const templateAfterImage = templateItem.querySelector(\n templateAfterImageSelector\n ) as HTMLImageElement;\n\n if (instance.afterImage && templateAfterImage) {\n instance.afterImage.src = templateAfterImage.src;\n instance.afterImage.alt = templateAfterImage.alt || '';\n\n // Apply current mode to maintain slider state\n applyMode(instance);\n }\n\n instance.currentIndex = index;\n\n // Update pagination\n updatePagination(instance.wrapper, index);\n }\n\n function applyMode(instance: any) {\n const slider = instance.slider;\n const wrapper = instance.wrapper;\n\n switch (instance.mode) {\n case 'before':\n // Set variable to 100% (hide after image completely)\n wrapper.style.setProperty(cssVariables.clip, '100%');\n slider.style.display = 'none';\n break;\n case 'after':\n // Set variable to 0% (show after image completely)\n wrapper.style.setProperty(cssVariables.clip, '0%');\n slider.style.display = 'none';\n break;\n case 'split':\n // Restore slider position without resetting\n updateClipPath(wrapper, instance.sliderPosition);\n slider.style.display = 'flex';\n break;\n }\n }\n\n function setMode(instance: any, mode: string) {\n const wrapper = instance.wrapper;\n const modeButtons = wrapper.querySelectorAll(`[${config.attributes.properties.modeType}]`);\n const activeClass = globalConfig.classes.active;\n\n // Update button states\n modeButtons.forEach((btn: Element) => {\n const btnMode = btn.getAttribute(config.attributes.properties.modeType);\n if (btnMode === mode) {\n btn.classList.add(activeClass);\n } else {\n btn.classList.remove(activeClass);\n }\n });\n\n instance.mode = mode;\n applyMode(instance);\n }\n\n function updatePagination(wrapper: HTMLElement, index: number) {\n const paginationContainer = querySelector(config, 'pagination', wrapper);\n if (!paginationContainer) return;\n\n const activeClass = globalConfig.classes.active;\n const dots = Array.from(paginationContainer.children);\n dots.forEach((dot, dotIndex) => {\n if (dotIndex === index) {\n dot.classList.add(activeClass);\n } else {\n dot.classList.remove(activeClass);\n }\n });\n }\n\n function navigateSlide(instance: any, direction: number) {\n const newIndex = instance.currentIndex + direction;\n const maxIndex = instance.templateItems.length - 1;\n\n let targetIndex: number;\n if (newIndex > maxIndex) {\n targetIndex = 0;\n } else if (newIndex < 0) {\n targetIndex = maxIndex;\n } else {\n targetIndex = newIndex;\n }\n\n loadSlide(instance, targetIndex);\n }\n\n function setupNavigation(instance: any, wrapper: HTMLElement) {\n const leftArrow = wrapper.querySelector(`[${config.attributes.properties.navType}=\"previous\"]`);\n const rightArrow = wrapper.querySelector(`[${config.attributes.properties.navType}=\"next\"]`);\n\n if (leftArrow) {\n const clickableSelector = getSelector(globalConfig.clickable as any, 'button');\n const button = (leftArrow.querySelector(clickableSelector) || leftArrow) as HTMLElement;\n button.setAttribute('aria-label', 'Previous image');\n\n const handler = (e: Event) => {\n e.preventDefault();\n navigateSlide(instance, -1);\n };\n\n button.addEventListener('click', handler);\n cleanup.handlers.push({ element: button, event: 'click', handler });\n }\n\n if (rightArrow) {\n const clickableSelector = getSelector(globalConfig.clickable as any, 'button');\n const button = (rightArrow.querySelector(clickableSelector) || rightArrow) as HTMLElement;\n button.setAttribute('aria-label', 'Next image');\n\n const handler = (e: Event) => {\n e.preventDefault();\n navigateSlide(instance, 1);\n };\n\n button.addEventListener('click', handler);\n cleanup.handlers.push({ element: button, event: 'click', handler });\n }\n }\n\n function setupPagination(instance: any, paginationContainer: HTMLElement) {\n const templateDot = paginationContainer.children[0];\n if (!templateDot) return;\n\n const activeClass = globalConfig.classes.active;\n paginationContainer.innerHTML = '';\n\n instance.templateItems.forEach((_: any, index: number) => {\n const dot = templateDot.cloneNode(true) as HTMLElement;\n\n // Remove active class from all dots, then add only to first\n dot.classList.remove(activeClass);\n if (index === 0) {\n dot.classList.add(activeClass);\n }\n\n const clickHandler = () => {\n loadSlide(instance, index);\n };\n\n dot.addEventListener('click', clickHandler);\n cleanup.handlers.push({ element: dot, event: 'click', handler: clickHandler });\n\n paginationContainer.appendChild(dot);\n });\n }\n\n function setupKeyboardNav(instance: any) {\n const keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault();\n navigateSlide(instance, -1);\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault();\n navigateSlide(instance, 1);\n }\n };\n\n instance.wrapper.addEventListener('keydown', keydownHandler);\n instance.wrapper.setAttribute('tabindex', '0');\n cleanup.handlers.push({ element: instance.wrapper, event: 'keydown', handler: keydownHandler });\n }\n\n // Main initialization loop\n wrappers.forEach((wrapper) => {\n // Find template list inside wrapper\n const templateList = querySelector(config, 'template-list', wrapper);\n if (!templateList) {\n console.warn('[comparison] No template list found in wrapper');\n return;\n }\n\n const templateItemsSelector = getSelector(config, 'template-item');\n const templateItems = Array.from(templateList.querySelectorAll(templateItemsSelector));\n\n if (templateItems.length === 0) {\n console.warn('[comparison] No template items found');\n return;\n }\n\n // Add simple aria-live for screen reader announcements\n wrapper.setAttribute('aria-live', 'polite');\n wrapper.setAttribute('aria-label', 'Before and after image comparison');\n\n // Get references to visible elements and cache them\n const imageWrapper = querySelector(config, 'image-wrapper', wrapper) as HTMLElement;\n const slider = querySelector(config, 'slider', wrapper) as HTMLElement;\n const beforeImageWrapper = querySelector(config, 'before-image', wrapper) as HTMLElement;\n const afterImageWrapper = querySelector(config, 'after-image', wrapper) as HTMLElement;\n const nameElement = querySelector(config, 'name', wrapper) as HTMLElement;\n const descElement = querySelector(config, 'description', wrapper) as HTMLElement;\n\n if (!imageWrapper || !slider || !afterImageWrapper) {\n const missing = [];\n if (!imageWrapper) missing.push('image-wrapper (data-hs-comparison=\"image-wrapper\")');\n if (!slider) missing.push('slider (data-hs-comparison=\"slider\")');\n if (!afterImageWrapper) missing.push('after-image (data-hs-comparison-image=\"after\")');\n console.warn(`[comparison] Missing required elements: ${missing.join(', ')}`);\n return;\n }\n\n const instance = {\n wrapper: wrapper as HTMLElement,\n templateItems,\n currentIndex: 0,\n mode: 'split',\n sliderPosition: 50,\n imageWrapper,\n slider,\n beforeImage: beforeImageWrapper?.querySelector('img') as HTMLImageElement,\n afterImage: afterImageWrapper?.querySelector('img') as HTMLImageElement,\n nameElement,\n descElement,\n draggable: null as any,\n };\n\n // Load first slide\n loadSlide(instance, 0);\n\n // Set initial clip path to 50%\n updateClipPath(wrapper as HTMLElement, 50);\n\n // Setup GSAP Draggable for slider\n if (Draggable) {\n const draggableInstance = Draggable.create(slider, {\n type: 'x',\n bounds: imageWrapper,\n onDrag: function () {\n const rect = imageWrapper.getBoundingClientRect();\n const sliderRect = slider.getBoundingClientRect();\n const x = sliderRect.left - rect.left;\n const percentage = Math.max(0, Math.min(100, (x / rect.width) * 100));\n\n updateClipPath(wrapper as HTMLElement, percentage);\n instance.sliderPosition = percentage;\n },\n });\n\n cleanup.draggables.push(draggableInstance);\n instance.draggable = draggableInstance[0]; // Store reference to draggable\n\n // Click on image wrapper to jump slider\n const clickHandler = (e: MouseEvent) => {\n if (instance.mode !== 'split') return;\n\n const rect = imageWrapper.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = Math.max(0, Math.min(100, (clickX / rect.width) * 100));\n\n // Calculate target position accounting for slider's center point\n // Draggable starts from slider's initial position (50% = center)\n const centerX = rect.width / 2;\n const offsetX = clickX - centerX;\n\n // Update Draggable's x position from center\n if (instance.draggable) {\n gsap.set(slider, { x: offsetX });\n instance.draggable.update();\n }\n\n updateClipPath(wrapper as HTMLElement, percentage);\n instance.sliderPosition = percentage;\n };\n\n imageWrapper.addEventListener('click', clickHandler);\n cleanup.handlers.push({ element: imageWrapper, event: 'click', handler: clickHandler });\n }\n\n // Setup mode buttons\n const modeButtons = wrapper.querySelectorAll(`[${config.attributes.properties.modeType}]`);\n modeButtons.forEach((modeWrapper) => {\n const mode = modeWrapper.getAttribute(config.attributes.properties.modeType);\n const clickableSelector = getSelector(globalConfig.clickable as any, 'button');\n const button = (modeWrapper.querySelector(clickableSelector) || modeWrapper) as HTMLElement;\n\n // Set initial state\n if (mode === instance.mode) {\n modeWrapper.classList.add(globalConfig.classes.active);\n }\n\n const clickHandler = (e: Event) => {\n e.preventDefault();\n setMode(instance, mode!);\n };\n\n button.addEventListener('click', clickHandler);\n cleanup.handlers.push({ element: button, event: 'click', handler: clickHandler });\n });\n\n // Setup navigation\n setupNavigation(instance, wrapper as HTMLElement);\n\n // Setup pagination\n const paginationContainer = querySelector(config, 'pagination', wrapper);\n if (paginationContainer && templateItems.length > 1) {\n setupPagination(instance, paginationContainer as HTMLElement);\n }\n\n // Setup keyboard navigation\n setupKeyboardNav(instance);\n });\n\n return {\n result: `comparison initialized (${wrappers.length} instances)`,\n destroy: () => {\n // Kill all draggables\n cleanup.draggables.forEach((d) => {\n if (d && d[0] && d[0].kill) d[0].kill();\n });\n\n // Remove all event listeners\n cleanup.handlers.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n\n // Clear arrays\n cleanup.draggables.length = 0;\n cleanup.handlers.length = 0;\n },\n };\n}\n"],"names":["async","init","config","gsapLib","getGsap","result","gsap","Draggable","warnMissingDependencies","wrappers","querySelectorAll","cleanup","draggables","handlers","templateNameSelector","getSelector","templateDescSelector","templateBeforeImageSelector","templateAfterImageSelector","updateClipPath","wrapper","percentage","style","setProperty","cssVariables","clip","loadSlide","instance","index","templateItem","templateItems","templateName","querySelector","nameElement","textContent","templateDesc","descElement","templateBeforeImage","beforeImage","src","alt","templateAfterImage","afterImage","applyMode","currentIndex","paginationContainer","activeClass","globalConfig","classes","active","Array","from","children","forEach","dot","dotIndex","classList","add","remove","updatePagination","slider","mode","display","sliderPosition","navigateSlide","direction","newIndex","maxIndex","length","targetIndex","templateList","console","warn","templateItemsSelector","setAttribute","imageWrapper","beforeImageWrapper","afterImageWrapper","missing","push","join","draggable","draggableInstance","create","type","bounds","onDrag","rect","getBoundingClientRect","x","left","Math","max","min","width","clickHandler","e","clickX","clientX","offsetX","set","update","addEventListener","element","event","handler","attributes","properties","modeType","modeWrapper","getAttribute","clickableSelector","clickable","button","preventDefault","modeButtons","btn","setMode","leftArrow","navType","rightArrow","setupNavigation","templateDot","innerHTML","_","cloneNode","appendChild","setupPagination","keydownHandler","key","setupKeyboardNav","destroy","d","kill","removeEventListener"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{p as e,g as t,w as r}from"./hs-modalManager-H_YegPAO.js";import"../main.js";const n='[data-hs-anim="counter"]';async function o(){if(e())return{result:"counter skipped - prefers-reduced-motion enabled"};const o=t("counter");if(!o)return{result:"counter skipped - GSAP not loaded"};const{gsap:i,ScrollTrigger:s}=o;if(!s)return r("counter",["ScrollTrigger"],"error"),{result:"counter skipped - ScrollTrigger not loaded"};i.registerPlugin(s);const l=Array.from(document.querySelectorAll(n)),u={timelines:[],scrollTriggers:[]};return l.forEach(e=>{const t=e,r=t.textContent?.trim()||"",n=function(e){const t=e.replace(/,/g,"").match(/([^\d.]*)(\d*\.?\d+)(.*)/);return t?{prefix:t[1]||"",number:parseFloat(t[2]),suffix:t[3]||""}:{prefix:"",number:0,suffix:""}}(r),o=(n.number.toString().split(".")[1]||"").length,l=r.includes(",");t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true");const a={value:0},c=i.timeline({paused:!0});c.to(a,{value:n.number,duration:3,ease:"power4.out",onUpdate:function(){const e=a.value;let r=o>0?e.toFixed(o):Math.round(e).toString();l&&(r=r.replace(/\B(?=(\d{3})+(?!\d))/g,",")),t.textContent=`${n.prefix}${r}${n.suffix}`},onComplete:function(){t.textContent=r}}),u.timelines.push(c);const g=s.create({trigger:e,start:"top bottom",once:!0,onEnter:()=>{c.play()}});u.scrollTriggers.push(g)}),{result:`counter initialized (${l.length} instances)`,destroy:()=>{u.timelines.forEach(e=>{e&&e.kill()}),u.scrollTriggers.forEach(e=>{e&&e.kill()}),u.timelines.length=0,u.scrollTriggers.length=0}}}export{o as init};
2
+ //# sourceMappingURL=hs-counter-Bfh7_P60.js.map
@@ -0,0 +1,2 @@
1
+ import{p as e,g as t,w as r}from"./hs-modalManager-H_YegPAO.js";import"../main.js";const n='[data-hs-anim="counter"]';async function o(){if(e())return{result:"counter skipped - prefers-reduced-motion enabled"};const o=t("counter");if(!o)return{result:"counter skipped - GSAP not loaded"};const{gsap:i,ScrollTrigger:s}=o;if(!s)return r("counter",["ScrollTrigger"],"error"),{result:"counter skipped - ScrollTrigger not loaded"};i.registerPlugin(s);const l=Array.from(document.querySelectorAll(n)),u={timelines:[],scrollTriggers:[]};return l.forEach(e=>{const t=e,r=t.textContent?.trim()||"",n=function(e){const t=e.replace(/,/g,"").match(/([^\d.]*)(\d*\.?\d+)(.*)/);return t?{prefix:t[1]||"",number:parseFloat(t[2]),suffix:t[3]||""}:{prefix:"",number:0,suffix:""}}(r),o=(n.number.toString().split(".")[1]||"").length,l=r.includes(",");t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true");const a={value:0},c=i.timeline({paused:!0});c.to(a,{value:n.number,duration:3,ease:"power4.out",onUpdate:function(){const e=a.value;let r=o>0?e.toFixed(o):Math.round(e).toString();l&&(r=r.replace(/\B(?=(\d{3})+(?!\d))/g,",")),t.textContent=`${n.prefix}${r}${n.suffix}`},onComplete:function(){t.textContent=r}}),u.timelines.push(c);const g=s.create({trigger:e,start:"top bottom",once:!0,onEnter:()=>{c.play()}});u.scrollTriggers.push(g)}),{result:`counter initialized (${l.length} instances)`,destroy:()=>{u.timelines.forEach(e=>{e&&e.kill()}),u.scrollTriggers.forEach(e=>{e&&e.kill()}),u.timelines.length=0,u.scrollTriggers.length=0}}}export{o as init};
2
+ //# sourceMappingURL=hs-counter-Bfh7_P60.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-counter-Bfh7_P60.js","sources":["../../src/animations/functions/counter.ts"],"sourcesContent":["/**\n * Counter Module\n *\n * GSAP-powered number counter that triggers on scroll into viewport.\n * Supports decimals, prefixes, and suffixes with smooth easing.\n *\n * Usage:\n * <span data-hs-anim=\"counter\">1000</span>\n *\n * Features:\n * - Auto-detects decimals, prefixes, suffixes\n * - Respects prefers-reduced-motion\n * - Triggers on scroll into viewport\n * - Accessible with aria-live announcements\n */\n\nimport { getGsap, prefersReducedMotion, warnMissingDependencies, type GsapTimeline } from '@utils';\n\n// Selectors\nconst SELECTORS = {\n counter: '[data-hs-anim=\"counter\"]',\n};\n\nexport async function init() {\n // Skip if user prefers reduced motion\n if (prefersReducedMotion()) {\n return { result: 'counter skipped - prefers-reduced-motion enabled' };\n }\n\n const gsapLib = getGsap('counter');\n if (!gsapLib) {\n return { result: 'counter skipped - GSAP not loaded' };\n }\n\n const { gsap, ScrollTrigger } = gsapLib;\n\n // ScrollTrigger is required for scroll-based counter animations\n if (!ScrollTrigger) {\n warnMissingDependencies('counter', ['ScrollTrigger'], 'error');\n return { result: 'counter skipped - ScrollTrigger not loaded' };\n }\n\n gsap.registerPlugin(ScrollTrigger);\n\n const counters = Array.from(document.querySelectorAll(SELECTORS.counter));\n const cleanup = {\n timelines: [] as GsapTimeline[],\n scrollTriggers: [] as any[],\n };\n\n function parseText(text: string) {\n // Remove commas from the text before parsing\n const cleanText = text.replace(/,/g, '');\n const match = cleanText.match(/([^\\d.]*)(\\d*\\.?\\d+)(.*)/);\n if (!match) {\n return { prefix: '', number: 0, suffix: '' };\n }\n return {\n prefix: match[1] || '',\n number: parseFloat(match[2]),\n suffix: match[3] || '',\n };\n }\n\n counters.forEach((counter) => {\n const htmlElement = counter as HTMLElement;\n const originalText = htmlElement.textContent?.trim() || '';\n const parsed = parseText(originalText);\n const decimals = (parsed.number.toString().split('.')[1] || '').length;\n\n // Check if original had commas (for numbers >= 1000)\n const hasCommas = originalText.includes(',');\n\n // Add accessibility attributes\n htmlElement.setAttribute('aria-live', 'polite');\n htmlElement.setAttribute('aria-atomic', 'true');\n\n // Create a temporary object to animate\n const counterObj = { value: 0 };\n\n // Create GSAP animation\n const tl = gsap.timeline({ paused: true });\n\n tl.to(counterObj, {\n value: parsed.number,\n duration: 3,\n ease: 'power4.out',\n onUpdate: function () {\n const currentValue = counterObj.value;\n let formatted =\n decimals > 0 ? currentValue.toFixed(decimals) : Math.round(currentValue).toString();\n\n // Add commas if original had them\n if (hasCommas) {\n formatted = formatted.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n\n htmlElement.textContent = `${parsed.prefix}${formatted}${parsed.suffix}`;\n },\n onComplete: function () {\n // Set final exact value\n htmlElement.textContent = originalText;\n },\n });\n\n cleanup.timelines.push(tl);\n\n // Use ScrollTrigger to play animation on scroll into view\n const st = ScrollTrigger.create({\n trigger: counter,\n start: 'top bottom',\n once: true,\n onEnter: () => {\n tl.play();\n },\n });\n cleanup.scrollTriggers.push(st);\n });\n\n return {\n result: `counter initialized (${counters.length} instances)`,\n destroy: () => {\n // Kill all timelines\n cleanup.timelines.forEach((tl) => {\n if (tl) tl.kill();\n });\n\n // Kill all scroll triggers\n cleanup.scrollTriggers.forEach((st) => {\n if (st) (st as any).kill();\n });\n\n // Clear arrays\n cleanup.timelines.length = 0;\n cleanup.scrollTriggers.length = 0;\n },\n };\n}\n"],"names":["SELECTORS","async","init","prefersReducedMotion","result","gsapLib","getGsap","gsap","ScrollTrigger","warnMissingDependencies","registerPlugin","counters","Array","from","document","querySelectorAll","cleanup","timelines","scrollTriggers","forEach","counter","htmlElement","originalText","textContent","trim","parsed","text","match","replace","prefix","number","parseFloat","suffix","parseText","decimals","toString","split","length","hasCommas","includes","setAttribute","counterObj","value","tl","timeline","paused","to","duration","ease","onUpdate","currentValue","formatted","toFixed","Math","round","onComplete","push","st","create","trigger","start","once","onEnter","play","destroy","kill"],"mappings":"mFAmBA,MAAMA,EACK,2BAGXC,eAAsBC,IAEpB,GAAIC,IACF,MAAO,CAAEC,OAAQ,oDAGnB,MAAMC,EAAUC,EAAQ,WACxB,IAAKD,EACH,MAAO,CAAED,OAAQ,qCAGnB,MAAMG,KAAEA,EAAAC,cAAMA,GAAkBH,EAGhC,IAAKG,EAEH,OADAC,EAAwB,UAAW,CAAC,iBAAkB,SAC/C,CAAEL,OAAQ,8CAGnBG,EAAKG,eAAeF,GAEpB,MAAMG,EAAWC,MAAMC,KAAKC,SAASC,iBAAiBf,IAChDgB,EAAU,CACdC,UAAW,GACXC,eAAgB,IAwElB,OAvDAP,EAASQ,QAASC,IAChB,MAAMC,EAAcD,EACdE,EAAeD,EAAYE,aAAaC,QAAU,GAClDC,EAjBR,SAAmBC,GAEjB,MACMC,EADYD,EAAKE,QAAQ,KAAM,IACbD,MAAM,4BAC9B,OAAKA,EAGE,CACLE,OAAQF,EAAM,IAAM,GACpBG,OAAQC,WAAWJ,EAAM,IACzBK,OAAQL,EAAM,IAAM,IALb,CAAEE,OAAQ,GAAIC,OAAQ,EAAGE,OAAQ,GAO5C,CAKiBC,CAAUX,GACnBY,GAAYT,EAAOK,OAAOK,WAAWC,MAAM,KAAK,IAAM,IAAIC,OAG1DC,EAAYhB,EAAaiB,SAAS,KAGxClB,EAAYmB,aAAa,YAAa,UACtCnB,EAAYmB,aAAa,cAAe,QAGxC,MAAMC,EAAa,CAAEC,MAAO,GAGtBC,EAAKpC,EAAKqC,SAAS,CAAEC,QAAQ,IAEnCF,EAAGG,GAAGL,EAAY,CAChBC,MAAOjB,EAAOK,OACdiB,SAAU,EACVC,KAAM,aACNC,SAAU,WACR,MAAMC,EAAeT,EAAWC,MAChC,IAAIS,EACFjB,EAAW,EAAIgB,EAAaE,QAAQlB,GAAYmB,KAAKC,MAAMJ,GAAcf,WAGvEG,IACFa,EAAYA,EAAUvB,QAAQ,wBAAyB,MAGzDP,EAAYE,YAAc,GAAGE,EAAOI,SAASsB,IAAY1B,EAAOO,QAClE,EACAuB,WAAY,WAEVlC,EAAYE,YAAcD,CAC5B,IAGFN,EAAQC,UAAUuC,KAAKb,GAGvB,MAAMc,EAAKjD,EAAckD,OAAO,CAC9BC,QAASvC,EACTwC,MAAO,aACPC,MAAM,EACNC,QAAS,KACPnB,EAAGoB,UAGP/C,EAAQE,eAAesC,KAAKC,KAGvB,CACLrD,OAAQ,wBAAwBO,EAAS0B,oBACzC2B,QAAS,KAEPhD,EAAQC,UAAUE,QAASwB,IACrBA,KAAOsB,SAIbjD,EAAQE,eAAeC,QAASsC,IAC1BA,KAAgBQ,SAItBjD,EAAQC,UAAUoB,OAAS,EAC3BrB,EAAQE,eAAemB,OAAS,GAGtC"}
@@ -0,0 +1,2 @@
1
+ import{c as a}from"../main.js";const s=a._global.cssVars,e={state:s.prefix+s.state.name,clip:s.prefix+s.clip?.name};export{e as c};
2
+ //# sourceMappingURL=hs-cssVariables-BjuwJfDJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-cssVariables-BjuwJfDJ.js","sources":["../../src/utils/cssVariables.ts"],"sourcesContent":["/**\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"],"names":["globalCssVars","config","_global","cssVars","cssVariables","state","prefix","name","clip"],"mappings":"+BAaA,MAAMA,EAAgBC,EAAOC,QAAQC,QAM/BC,EAAe,CAEnBC,MAAOL,EAAcM,OAASN,EAAcK,MAAME,KAClDC,KAAMR,EAAcM,OAAUN,EAAcQ,MAAMD"}
@@ -0,0 +1,2 @@
1
+ import{c as e}from"../main.js";import{a as t,q as n,g as r}from"./hs-attributeSelector-6pGcDBo-.js";import{g as s,p as o,s as a,a as i,o as l,c}from"./hs-modalManager-H_YegPAO.js";import{g as u}from"./hs-utils-CKm6QhLw.js";import{c as d}from"./hs-cssVariables-BjuwJfDJ.js";async function f(e){let n=null,r=null;function a(n){const r=n.target.closest('a[href^="#"]');if(!r)return;const a=r.getAttribute("href");if(!a||"#"===a)return;const i=a.substring(1),l=document.getElementById(i);if(l){n.preventDefault(),history.replaceState&&history.replaceState(null,null,`#${l.id}`);!function(e,t=0){if(!e)return;const n=s("smooth-scroll",!1);if(o()||!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 n=t(e,"offset-proxy");if(console.log("[smooth-scroll] Proxy element:",n),n&&n instanceof HTMLElement){const e=getComputedStyle(n).top,t=parseFloat(e)||0;return console.log("[smooth-scroll] Computed top:",e,"-> offset:",t),t}return console.log("[smooth-scroll] No proxy element found, using offset: 0"),0}())}}"undefined"!=typeof $&&$(document).off("click.wf-scroll"),document.documentElement.style.scrollBehavior="auto",document.body.style.scrollBehavior="auto",n=a,r=e=>{"Enter"!==e.key&&" "!==e.key||a(e)},document.addEventListener("click",n),document.addEventListener("keydown",r);const i=s("smooth-scroll",!1);return i&&document.body.scrollHeight>window.innerHeight&&(i.gsap.set(window,{scrollTo:1}),i.gsap.set(window,{scrollTo:0})),{result:"autoInit-smooth-scroll initialized",destroy:()=>{n&&(document.removeEventListener("click",n),n=null),r&&(document.removeEventListener("keydown",r),r=null),document.documentElement.style.scrollBehavior="",document.body.style.scrollBehavior=""}}}let p=null;function v(e){p=e;const s={observers:[],handlers:[]};return function(e,s){const o=n(p,"wrapper"),l=[];o.forEach(n=>{const o=r(u.clickable,"button"),c=n.querySelector(o),d=t(p,"list",n);if(!c||!d)return void console.warn("[dropdown] Dropdown wrapper missing required elements:",n);const f=n.getAttribute("data-hs-nav-dropdown-type")||"hover",v=n.querySelector('[data-hs-height="element"]'),m=v?v.parentElement:null,h=c.textContent?.trim()||"dropdown",y=h.toLowerCase().replace(/[^a-z0-9\s]/g,"").replace(/\s+/g,"-").replace(/^-+|-+$/g,"").substring(0,50);const b=`navbar-dropdown-${y}-toggle`,g=`navbar-dropdown-${y}-list`;c.id=b,c.setAttribute("aria-haspopup","menu"),c.setAttribute("aria-expanded","false"),c.setAttribute("aria-controls",g),d.id=g,d.setAttribute("role","menu"),d.inert=!0;const w=Array.from(d.querySelectorAll(o));w.forEach((e,t)=>{if(e.setAttribute("role","menuitem"),e.setAttribute("tabindex","-1"),0===t){const t=c.textContent?.trim()||"menu";e.getAttribute("aria-label")||e.setAttribute("aria-label",`${e.textContent?.trim()}, ${t} submenu`)}});let A=-1;function E(){return n.classList.contains(u.classes.active)}function k(){const e=E();"true"===c.getAttribute("aria-expanded")&&!e&&d.contains(document.activeElement)&&c.focus(),c.setAttribute("aria-expanded",e?"true":"false"),d.inert=!e,w.forEach(t=>{t.setAttribute("tabindex",e?"0":"-1")}),e||(A=-1),i(m,e,{duration:"hover"===f?200:300,ease:"power2.inOut"})}a(m,E()),k();const L=new MutationObserver(()=>{k()});if(L.observe(n,{attributes:!0,attributeFilter:["class"]}),e(L),"hover"===f){l.push(n);const e=()=>{n.classList.add("is-active")},t=()=>{n.classList.remove("is-active")};s(n,"mouseenter",e),s(n,"mouseleave",t);s(c,"keydown",e=>{"ArrowDown"===e.key?(e.preventDefault(),E()||(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):" "===e.key||"Enter"===e.key?(e.preventDefault(),E()?n.classList.remove(u.classes.active):(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):"ArrowUp"===e.key?(e.preventDefault(),E()||(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=w.length-1,w[A].focus()},100))):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(u.classes.active))});const r=e=>{E()&&n.contains(document.activeElement)&&("ArrowDown"===e.key?(e.preventDefault(),A<w.length-1&&(A++,w[A].focus())):"ArrowUp"===e.key?(e.preventDefault(),0===A?(n.classList.remove(u.classes.active),c.focus(),A=-1):A>0?(A--,w[A].focus()):(c.focus(),A=-1)):"Escape"===e.key&&(e.preventDefault(),n.classList.remove("is-active")))};s(n,"keydown",r)}else if("click"===f){s(c,"click",e=>{e.preventDefault(),n.classList.toggle(u.classes.active)});s(c,"keydown",e=>{" "===e.key||"Enter"===e.key?(e.preventDefault(),n.classList.toggle(u.classes.active)):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(u.classes.active))})}});const c=e=>{l.forEach(t=>{t.classList.contains("is-active")&&!t.contains(e.target)&&t.classList.remove("is-active")})};l.length>0&&s(document.body,"focusin",c)}(e=>{s.observers.push(e)},(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})}),{result:"dropdown initialized",destroy:()=>{s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0,p=null}}}function m(e,s){const o={observers:[],handlers:[],state:{focusTrapHandler:null}},f=e=>{o.observers.push(e)};return function(d,f){const p=n(e,"button"),v=t(e,"wrapper");if(!p.length||!v)return;const m=s?t(s,"wrapper"):null,h=`menu-${Date.now()}`;v.id=h,v.setAttribute("role","dialog"),v.setAttribute("aria-modal","true"),v.inert=!0;const y=v.querySelector('[data-hs-height="element"]'),b=y?y.parentElement:null;p.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-controls",h),e.setAttribute("aria-label","Open navigation menu");let n=null,y=!1;function g(){return e.classList.contains(u.classes.active)}function w(){const o=g(),a="true"===e.getAttribute("aria-expanded");o&&!a?(l(),v.classList.add(u.classes.active),v.inert=!1,m&&m.classList.add("hs-menu-open"),p.forEach(e=>{e.setAttribute("aria-expanded","true"),e.setAttribute("aria-label","Close navigation menu")}),b&&i(b,!0,{duration:300,ease:"power2.inOut"}),n=function(){const e=s?t(s,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!e)return;const n=t=>{if("Tab"===t.key){const n=r(u.clickable,"button"),s=Array.from(e.querySelectorAll(n)),o=e.querySelectorAll('input, select, textarea, [tabindex]:not([tabindex="-1"])'),a=[...s,...Array.from(o)],i=a[0],l=a[a.length-1];t.shiftKey?document.activeElement===i&&(t.preventDefault(),l.focus()):document.activeElement===l&&(t.preventDefault(),i.focus())}};return document.addEventListener("keydown",n),n}(),y&&(setTimeout(()=>{const e=r(u.clickable,"button"),t=Array.from(v.querySelectorAll(e));if("last"===y){const e=t[t.length-1];e&&e.focus()}else{const e=t[0];e&&e.focus()}},100),y=!1)):!o&&a&&(v.contains(document.activeElement)&&e.focus(),c(),v.classList.remove(u.classes.active),v.inert=!0,m&&m.classList.remove("hs-menu-open"),p.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-label","Open navigation menu")}),b&&i(b,!1,{duration:300,ease:"power2.inOut"}),function(e){e&&document.removeEventListener("keydown",e)}(n),n=null)}b&&a(b,g()),w();const A=new MutationObserver(()=>{w()});A.observe(e,{attributes:!0,attributeFilter:["class"]}),d(A);f(e,"click",function(t){t.preventDefault(),e.classList.toggle("is-active")});f(e,"keydown",function(t){" "===t.key||"Enter"===t.key?(t.preventDefault(),y=!0,e.classList.toggle(u.classes.active)):"ArrowDown"===t.key?(t.preventDefault(),g()||(y=!0,e.classList.add(u.classes.active))):"ArrowUp"===t.key?(t.preventDefault(),g()||(y="last",e.classList.add(u.classes.active))):"Escape"===t.key&&(t.preventDefault(),g()&&e.classList.remove(u.classes.active))}),o.state.focusTrapHandler=n})}(f,(e,t,n,r)=>{e.addEventListener(t,n,r),o.handlers.push({element:e,event:t,handler:n,options:r})}),function(n){const r=t(e,"wrapper");if(!r)return;let s=null;function o(){const e=window.getComputedStyle(r).getPropertyValue(d.state).trim();if(s===u.cssVars.state.values.active&&e===u.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=e}const a=new ResizeObserver(o);a.observe(r),n(a),o()}(f),{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 h(e,n){const s={handlers:[]},o=(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})};return o(document,"keydown",e=>{if("ArrowLeft"!==e.key&&"ArrowRight"!==e.key)return;const s=n?t(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(s&&s.contains(document.activeElement))return;const o=n?t(n,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!o||!o.contains(document.activeElement))return;const a=o.querySelector(`.${u.classes.active}[data-hs-nav-dropdown]`);if(a&&a.contains(document.activeElement))return;e.preventDefault();const i=r(u.clickable,"button"),l=Array.from(o.querySelectorAll(i)),c=Array.from(l).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 s=window.getComputedStyle(e),a=e;if("none"===s.display||"hidden"===s.visibility||"0"===s.opacity||0===a.offsetWidth||0===a.offsetHeight)return!1;let i=e.parentElement;for(;i&&i!==o;){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=c.indexOf(document.activeElement);-1!==d&&("ArrowRight"===e.key?d<c.length-1&&c[d+1].focus():d>0&&c[d-1].focus())}),function(e){const s=n?t(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(!s)return;let o=-1;e(s,"keydown",e=>{const a=function(){const e=r(u.clickable,"button"),t=Array.from(s.querySelectorAll(e));return Array.from(t).filter(e=>{let t=e;for(;t&&t!==s;){if(t.inert)return!1;t=t.parentElement}return!0})}();if(0===a.length)return;const i=document.activeElement;if(o=a.indexOf(i),"ArrowDown"===e.key)e.preventDefault(),o<a.length-1&&(o+=1,a[o].focus());else if("ArrowUp"===e.key)e.preventDefault(),o>0&&(o-=1,a[o].focus());else if("ArrowRight"===e.key){if(e.preventDefault(),i&&"BUTTON"===i.tagName&&i.hasAttribute("aria-controls")){return void("true"===i.getAttribute("aria-expanded")||i.click())}}else if("ArrowLeft"===e.key){if(e.preventDefault(),i&&"BUTTON"===i.tagName&&i.hasAttribute("aria-controls")){return void("true"===i.getAttribute("aria-expanded")&&i.click())}}else if("Home"===e.key)e.preventDefault(),o=0,a[0].focus();else if("End"===e.key)e.preventDefault(),o=a.length-1,a[a.length-1].focus();else if(" "===e.key&&i&&"A"===i.tagName)e.preventDefault();else if("Escape"===e.key){const e=n?t(n.menu,"button"):document.querySelector('[data-hs-nav-menu="button"]');e&&(e.click(),e.focus())}})}(o),{result:"arrow-navigation initialized",destroy:()=>{s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0}}}async function y(e){const t={destroyFunctions:[]},n=await Promise.allSettled([v(e.dropdown),m(e.menu,e),h(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,s=n.length-r;return s>0&&console.warn(`[navbar] ${r}/${n.length} functions loaded successfully. ${s} 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 b(e){const s={observers:[],handlers:[]};return function(s,o){const l=n(e,"wrapper");if(0===l.length)return 0;let c=0;l.forEach((n,l)=>{const d=t(e,"toggle",n),f=t(e,"content",n);if(!d||!f)return;c++;const p=`[${u.attributes.height}="${u.attributes.heightValue}"]`,v=n.querySelector(p),m=v?v.parentElement:f,h=`hs-accordion-btn-${l}`,y=`hs-accordion-content-${l}`,b=n.getAttribute(e.attributes.properties.open),g=n.getAttribute(e.attributes.properties.closed),w=b&&g;let A=[];if(w){const t=r(e,"state");A=Array.from(d.querySelectorAll(t))}function E(){return n.classList.contains(u.classes.active)}function k(){const e=E();if("true"===d.getAttribute("aria-expanded")&&!e&&f.contains(document.activeElement)){d.focus()}d.setAttribute("aria-expanded",e?"true":"false");var t;f.inert=!e,w&&A.length>0&&(t=e?b:g,w&&A.forEach(e=>{e.textContent=t})),i(m,e,{duration:300,ease:"power2.inOut"})}d.setAttribute("id",h),f.setAttribute("id",y),f.setAttribute("role","region"),f.setAttribute("aria-labelledby",h),d.setAttribute("aria-controls",y);const L=n.getAttribute(e.attributes.properties.default);L&&"open"===L.toLowerCase()&&n.classList.add(u.classes.active),a(m,E()),k();o(d,"click",e=>{e.preventDefault(),n.classList.toggle(u.classes.active)});const D=new MutationObserver(()=>{k()});D.observe(n,{attributes:!0,attributeFilter:["class"]}),s(D)})}(e=>s.observers.push(e),(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})}),{result:"accordion initialized",destroy:()=>{s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0}}}async function g(){const t={destroyFunctions:[]},n=e.default,r=[f(n["smooth-scroll"]),y(n.navbar),b(n.accordion)],s=await Promise.allSettled(r);s.forEach(e=>{"fulfilled"===e.status&&e.value?.destroy&&t.destroyFunctions.push(e.value.destroy)});const o=s.filter(e=>"fulfilled"===e.status).length,a=s.length-o;return a>0&&console.warn(`[default] ${o}/${s.length} functions loaded successfully. ${a} failed but won't affect other functions.`),{result:"default initialized",destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[default] Error during cleanup:",t)}}),t.destroyFunctions.length=0}}}export{g as init};
2
+ //# sourceMappingURL=hs-default-CLmDRb9d.js.map
@@ -0,0 +1,2 @@
1
+ import{c as e}from"../main.js";import{a as t,q as n,g as r}from"./hs-attributeSelector-6pGcDBo-.js";import{g as s,p as o,s as a,a as i,o as l,c}from"./hs-modalManager-H_YegPAO.js";import{g as u}from"./hs-utils-CKm6QhLw.js";import{c as d}from"./hs-cssVariables-BjuwJfDJ.js";async function f(e){let n=null,r=null;function a(n){const r=n.target.closest('a[href^="#"]');if(!r)return;const a=r.getAttribute("href");if(!a||"#"===a)return;const i=a.substring(1),l=document.getElementById(i);if(l){n.preventDefault(),history.replaceState&&history.replaceState(null,null,`#${l.id}`);!function(e,t=0){if(!e)return;const n=s("smooth-scroll",!1);if(o()||!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 n=t(e,"offset-proxy");if(console.log("[smooth-scroll] Proxy element:",n),n&&n instanceof HTMLElement){const e=getComputedStyle(n).top,t=parseFloat(e)||0;return console.log("[smooth-scroll] Computed top:",e,"-> offset:",t),t}return console.log("[smooth-scroll] No proxy element found, using offset: 0"),0}())}}"undefined"!=typeof $&&$(document).off("click.wf-scroll"),document.documentElement.style.scrollBehavior="auto",document.body.style.scrollBehavior="auto",n=a,r=e=>{"Enter"!==e.key&&" "!==e.key||a(e)},document.addEventListener("click",n),document.addEventListener("keydown",r);const i=s("smooth-scroll",!1);return i&&document.body.scrollHeight>window.innerHeight&&(i.gsap.set(window,{scrollTo:1}),i.gsap.set(window,{scrollTo:0})),{result:"autoInit-smooth-scroll initialized",destroy:()=>{n&&(document.removeEventListener("click",n),n=null),r&&(document.removeEventListener("keydown",r),r=null),document.documentElement.style.scrollBehavior="",document.body.style.scrollBehavior=""}}}let p=null;function v(e){p=e;const s={observers:[],handlers:[]};return function(e,s){const o=n(p,"wrapper"),l=[];o.forEach(n=>{const o=r(u.clickable,"button"),c=n.querySelector(o),d=t(p,"list",n);if(!c||!d)return void console.warn("[dropdown] Dropdown wrapper missing required elements:",n);const f=n.getAttribute("data-hs-nav-dropdown-type")||"hover",v=n.querySelector('[data-hs-height="element"]'),m=v?v.parentElement:null,h=c.textContent?.trim()||"dropdown",y=h.toLowerCase().replace(/[^a-z0-9\s]/g,"").replace(/\s+/g,"-").replace(/^-+|-+$/g,"").substring(0,50);const b=`navbar-dropdown-${y}-toggle`,g=`navbar-dropdown-${y}-list`;c.id=b,c.setAttribute("aria-haspopup","menu"),c.setAttribute("aria-expanded","false"),c.setAttribute("aria-controls",g),d.id=g,d.setAttribute("role","menu"),d.inert=!0;const w=Array.from(d.querySelectorAll(o));w.forEach((e,t)=>{if(e.setAttribute("role","menuitem"),e.setAttribute("tabindex","-1"),0===t){const t=c.textContent?.trim()||"menu";e.getAttribute("aria-label")||e.setAttribute("aria-label",`${e.textContent?.trim()}, ${t} submenu`)}});let A=-1;function E(){return n.classList.contains(u.classes.active)}function k(){const e=E();"true"===c.getAttribute("aria-expanded")&&!e&&d.contains(document.activeElement)&&c.focus(),c.setAttribute("aria-expanded",e?"true":"false"),d.inert=!e,w.forEach(t=>{t.setAttribute("tabindex",e?"0":"-1")}),e||(A=-1),i(m,e,{duration:"hover"===f?200:300,ease:"power2.inOut"})}a(m,E()),k();const L=new MutationObserver(()=>{k()});if(L.observe(n,{attributes:!0,attributeFilter:["class"]}),e(L),"hover"===f){l.push(n);const e=()=>{n.classList.add("is-active")},t=()=>{n.classList.remove("is-active")};s(n,"mouseenter",e),s(n,"mouseleave",t);s(c,"keydown",e=>{"ArrowDown"===e.key?(e.preventDefault(),E()||(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):" "===e.key||"Enter"===e.key?(e.preventDefault(),E()?n.classList.remove(u.classes.active):(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):"ArrowUp"===e.key?(e.preventDefault(),E()||(n.classList.add(u.classes.active),w.length>0&&setTimeout(()=>{A=w.length-1,w[A].focus()},100))):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(u.classes.active))});const r=e=>{E()&&n.contains(document.activeElement)&&("ArrowDown"===e.key?(e.preventDefault(),A<w.length-1&&(A++,w[A].focus())):"ArrowUp"===e.key?(e.preventDefault(),0===A?(n.classList.remove(u.classes.active),c.focus(),A=-1):A>0?(A--,w[A].focus()):(c.focus(),A=-1)):"Escape"===e.key&&(e.preventDefault(),n.classList.remove("is-active")))};s(n,"keydown",r)}else if("click"===f){s(c,"click",e=>{e.preventDefault(),n.classList.toggle(u.classes.active)});s(c,"keydown",e=>{" "===e.key||"Enter"===e.key?(e.preventDefault(),n.classList.toggle(u.classes.active)):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(u.classes.active))})}});const c=e=>{l.forEach(t=>{t.classList.contains("is-active")&&!t.contains(e.target)&&t.classList.remove("is-active")})};l.length>0&&s(document.body,"focusin",c)}(e=>{s.observers.push(e)},(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})}),{result:"dropdown initialized",destroy:()=>{s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0,p=null}}}function m(e,s){const o={observers:[],handlers:[],state:{focusTrapHandler:null}},f=e=>{o.observers.push(e)};return function(d,f){const p=n(e,"button"),v=t(e,"wrapper");if(!p.length||!v)return;const m=s?t(s,"wrapper"):null,h=`menu-${Date.now()}`;v.id=h,v.setAttribute("role","dialog"),v.setAttribute("aria-modal","true"),v.inert=!0;const y=v.querySelector('[data-hs-height="element"]'),b=y?y.parentElement:null;p.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-controls",h),e.setAttribute("aria-label","Open navigation menu");let n=null,y=!1;function g(){return e.classList.contains(u.classes.active)}function w(){const o=g(),a="true"===e.getAttribute("aria-expanded");o&&!a?(l(),v.classList.add(u.classes.active),v.inert=!1,m&&m.classList.add("hs-menu-open"),p.forEach(e=>{e.setAttribute("aria-expanded","true"),e.setAttribute("aria-label","Close navigation menu")}),b&&i(b,!0,{duration:300,ease:"power2.inOut"}),n=function(){const e=s?t(s,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!e)return;const n=t=>{if("Tab"===t.key){const n=r(u.clickable,"button"),s=Array.from(e.querySelectorAll(n)),o=e.querySelectorAll('input, select, textarea, [tabindex]:not([tabindex="-1"])'),a=[...s,...Array.from(o)],i=a[0],l=a[a.length-1];t.shiftKey?document.activeElement===i&&(t.preventDefault(),l.focus()):document.activeElement===l&&(t.preventDefault(),i.focus())}};return document.addEventListener("keydown",n),n}(),y&&(setTimeout(()=>{const e=r(u.clickable,"button"),t=Array.from(v.querySelectorAll(e));if("last"===y){const e=t[t.length-1];e&&e.focus()}else{const e=t[0];e&&e.focus()}},100),y=!1)):!o&&a&&(v.contains(document.activeElement)&&e.focus(),c(),v.classList.remove(u.classes.active),v.inert=!0,m&&m.classList.remove("hs-menu-open"),p.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-label","Open navigation menu")}),b&&i(b,!1,{duration:300,ease:"power2.inOut"}),function(e){e&&document.removeEventListener("keydown",e)}(n),n=null)}b&&a(b,g()),w();const A=new MutationObserver(()=>{w()});A.observe(e,{attributes:!0,attributeFilter:["class"]}),d(A);f(e,"click",function(t){t.preventDefault(),e.classList.toggle("is-active")});f(e,"keydown",function(t){" "===t.key||"Enter"===t.key?(t.preventDefault(),y=!0,e.classList.toggle(u.classes.active)):"ArrowDown"===t.key?(t.preventDefault(),g()||(y=!0,e.classList.add(u.classes.active))):"ArrowUp"===t.key?(t.preventDefault(),g()||(y="last",e.classList.add(u.classes.active))):"Escape"===t.key&&(t.preventDefault(),g()&&e.classList.remove(u.classes.active))}),o.state.focusTrapHandler=n})}(f,(e,t,n,r)=>{e.addEventListener(t,n,r),o.handlers.push({element:e,event:t,handler:n,options:r})}),function(n){const r=t(e,"wrapper");if(!r)return;let s=null;function o(){const e=window.getComputedStyle(r).getPropertyValue(d.state).trim();if(s===u.cssVars.state.values.active&&e===u.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=e}const a=new ResizeObserver(o);a.observe(r),n(a),o()}(f),{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 h(e,n){const s={handlers:[]},o=(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})};return o(document,"keydown",e=>{if("ArrowLeft"!==e.key&&"ArrowRight"!==e.key)return;const s=n?t(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(s&&s.contains(document.activeElement))return;const o=n?t(n,"wrapper"):document.querySelector('[data-hs-nav="wrapper"]');if(!o||!o.contains(document.activeElement))return;const a=o.querySelector(`.${u.classes.active}[data-hs-nav-dropdown]`);if(a&&a.contains(document.activeElement))return;e.preventDefault();const i=r(u.clickable,"button"),l=Array.from(o.querySelectorAll(i)),c=Array.from(l).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 s=window.getComputedStyle(e),a=e;if("none"===s.display||"hidden"===s.visibility||"0"===s.opacity||0===a.offsetWidth||0===a.offsetHeight)return!1;let i=e.parentElement;for(;i&&i!==o;){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=c.indexOf(document.activeElement);-1!==d&&("ArrowRight"===e.key?d<c.length-1&&c[d+1].focus():d>0&&c[d-1].focus())}),function(e){const s=n?t(n.menu,"wrapper"):document.querySelector('[data-hs-nav-menu="wrapper"]');if(!s)return;let o=-1;e(s,"keydown",e=>{const a=function(){const e=r(u.clickable,"button"),t=Array.from(s.querySelectorAll(e));return Array.from(t).filter(e=>{let t=e;for(;t&&t!==s;){if(t.inert)return!1;t=t.parentElement}return!0})}();if(0===a.length)return;const i=document.activeElement;if(o=a.indexOf(i),"ArrowDown"===e.key)e.preventDefault(),o<a.length-1&&(o+=1,a[o].focus());else if("ArrowUp"===e.key)e.preventDefault(),o>0&&(o-=1,a[o].focus());else if("ArrowRight"===e.key){if(e.preventDefault(),i&&"BUTTON"===i.tagName&&i.hasAttribute("aria-controls")){return void("true"===i.getAttribute("aria-expanded")||i.click())}}else if("ArrowLeft"===e.key){if(e.preventDefault(),i&&"BUTTON"===i.tagName&&i.hasAttribute("aria-controls")){return void("true"===i.getAttribute("aria-expanded")&&i.click())}}else if("Home"===e.key)e.preventDefault(),o=0,a[0].focus();else if("End"===e.key)e.preventDefault(),o=a.length-1,a[a.length-1].focus();else if(" "===e.key&&i&&"A"===i.tagName)e.preventDefault();else if("Escape"===e.key){const e=n?t(n.menu,"button"):document.querySelector('[data-hs-nav-menu="button"]');e&&(e.click(),e.focus())}})}(o),{result:"arrow-navigation initialized",destroy:()=>{s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0}}}async function y(e){const t={destroyFunctions:[]},n=await Promise.allSettled([v(e.dropdown),m(e.menu,e),h(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,s=n.length-r;return s>0&&console.warn(`[navbar] ${r}/${n.length} functions loaded successfully. ${s} 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 b(e){const s={observers:[],handlers:[]};return function(s,o){const l=n(e,"wrapper");if(0===l.length)return 0;let c=0;l.forEach((n,l)=>{const d=t(e,"toggle",n),f=t(e,"content",n);if(!d||!f)return;c++;const p=`[${u.attributes.height}="${u.attributes.heightValue}"]`,v=n.querySelector(p),m=v?v.parentElement:f,h=`hs-accordion-btn-${l}`,y=`hs-accordion-content-${l}`,b=n.getAttribute(e.attributes.properties.open),g=n.getAttribute(e.attributes.properties.closed),w=b&&g;let A=[];if(w){const t=r(e,"state");A=Array.from(d.querySelectorAll(t))}function E(){return n.classList.contains(u.classes.active)}function k(){const e=E();if("true"===d.getAttribute("aria-expanded")&&!e&&f.contains(document.activeElement)){d.focus()}d.setAttribute("aria-expanded",e?"true":"false");var t;f.inert=!e,w&&A.length>0&&(t=e?b:g,w&&A.forEach(e=>{e.textContent=t})),i(m,e,{duration:300,ease:"power2.inOut"})}d.setAttribute("id",h),f.setAttribute("id",y),f.setAttribute("role","region"),f.setAttribute("aria-labelledby",h),d.setAttribute("aria-controls",y);const L=n.getAttribute(e.attributes.properties.default);L&&"open"===L.toLowerCase()&&n.classList.add(u.classes.active),a(m,E()),k();o(d,"click",e=>{e.preventDefault(),n.classList.toggle(u.classes.active)});const D=new MutationObserver(()=>{k()});D.observe(n,{attributes:!0,attributeFilter:["class"]}),s(D)})}(e=>s.observers.push(e),(e,t,n,r)=>{e.addEventListener(t,n,r),s.handlers.push({element:e,event:t,handler:n,options:r})}),{result:"accordion initialized",destroy:()=>{s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),s.handlers.length=0}}}async function g(){const t={destroyFunctions:[]},n=e.default,r=[f(n["smooth-scroll"]),y(n.navbar),b(n.accordion)],s=await Promise.allSettled(r);s.forEach(e=>{"fulfilled"===e.status&&e.value?.destroy&&t.destroyFunctions.push(e.value.destroy)});const o=s.filter(e=>"fulfilled"===e.status).length,a=s.length-o;return a>0&&console.warn(`[default] ${o}/${s.length} functions loaded successfully. ${a} failed but won't affect other functions.`),{result:"default initialized",destroy:()=>{t.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("[default] Error during cleanup:",t)}}),t.destroyFunctions.length=0}}}export{g as init};
2
+ //# sourceMappingURL=hs-default-CLmDRb9d.js.map