@hortonstudio/main 1.9.23 → 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
@@ -0,0 +1,2 @@
1
+ import{c as e}from"../main.js";import{q as r,a as t,g as o}from"./hs-attributeSelector-6pGcDBo-.js";import{p as s,g as n}from"./hs-modalManager-H_YegPAO.js";function l(t){const o=e._global.classes.active,s={observers:[],handlers:[],scrollTimeout:null,headings:[]},n=r(t,"content"),l=r(t,"list");return n.forEach(e=>{const r=l[0];if(!r||0===r.children.length)return;const t=r.children[0].cloneNode(!0),n=t.querySelector("a");n&&n.classList.remove(o),r.innerHTML="";const i=e.querySelectorAll("h2");i.forEach(e=>{const r=e.textContent.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");e.id=r,s.headings.push(e)}),i.forEach((e,o)=>{const s=t.cloneNode(!0),n=s.querySelector("a"),l=e.id;n.href=`#${l}`;const i=document.createElement("strong");i.textContent=`${o+1}. `,n.innerHTML="",n.appendChild(i),n.appendChild(document.createTextNode(e.textContent)),r.appendChild(s)});const c=r.querySelectorAll("a");let a=null;const d=()=>{const e=.25*window.innerHeight;let r=null;for(let t=i.length-1;t>=0;t--){if(i[t].getBoundingClientRect().top<=e){r=i[t].id;break}}if(r!==a&&(a=r,c.forEach(e=>e.classList.remove(o)),a)){const e=Array.from(c).find(e=>e.getAttribute("href")===`#${a}`);e&&e.classList.add(o)}},u=new IntersectionObserver(()=>{d()},{rootMargin:"-25% 0px -75% 0px",threshold:0});i.forEach(e=>u.observe(e)),(e=>{s.observers.push(e)})(u);var g,p,h;g=window,p="scroll",h=()=>{s.scrollTimeout&&clearTimeout(s.scrollTimeout),s.scrollTimeout=setTimeout(d,50)},g.addEventListener(p,h),s.handlers.push({element:g,event:p,handler:h})}),{result:"toc initialized",destroy:()=>{s.headings.forEach(e=>{e.removeAttribute("id")}),s.headings.length=0,s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:r,handler:t})=>{e.removeEventListener(r,t)}),s.handlers.length=0,s.scrollTimeout&&(clearTimeout(s.scrollTimeout),s.scrollTimeout=null)}}}async function i(){const i=e.structure.toc,c={destroyFunctions:[]},a=o(i,"list");if(document.querySelector(a))try{const e=await l(i);e?.destroy&&c.destroyFunctions.push(e.destroy)}catch(u){console.error("[toc] Error initializing heading-links:",u)}const d=o(i["progress-bar"],"wrapper");if(document.querySelector(d))try{const e=await async function(e){const{progressConfig:o,tocConfig:l}=e;if(s())return{result:"progress-bar skipped - prefers-reduced-motion enabled"};const i=n("progress-bar");if(!i)return{result:"progress-bar skipped - GSAP not loaded"};const{gsap:c,ScrollTrigger:a}=i;if(!a)return console.warn("[progress-bar] GSAP ScrollTrigger plugin not loaded"),{result:"progress-bar skipped - ScrollTrigger not loaded"};c.registerPlugin(a);const d={scrollTriggers:[]},u=t(l,"content");if(!u)return{result:"progress-bar skipped - no content element found"};const g=r(o,"wrapper");return 0===g.length?{result:"progress-bar skipped - no wrapper elements found"}:(g.forEach(e=>{c.set(e,{display:"block"}),Array.from(e.querySelectorAll("*")).filter(e=>{const r=o.attributes.elements.element.primary,[t,s]=r.split("="),n=s?.replace(/['"]/g,"");return e.getAttribute(t)===n}).forEach(e=>{c.set(e,{width:"0%"}),c.to(e,{width:"100%",ease:"none",scrollTrigger:{trigger:u,start:"top bottom",end:"bottom 75%",scrub:!0,invalidateOnRefresh:!0,onUpdate:e=>{d.scrollTriggers.includes(e)||d.scrollTriggers.push(e)}}})})}),{result:`progress-bar initialized (${g.length} instances)`,destroy:()=>{d.scrollTriggers.forEach(e=>{e&&"object"==typeof e&&"kill"in e&&"function"==typeof e.kill&&e.kill()}),d.scrollTriggers.length=0}})}({progressConfig:i["progress-bar"],tocConfig:i});e?.destroy&&c.destroyFunctions.push(e.destroy)}catch(u){console.error("[toc] Error initializing progress-bar:",u)}return{result:`toc initialized (${c.destroyFunctions.length} modules active)`,destroy:()=>{c.destroyFunctions.forEach(e=>{try{e()}catch(u){console.error("[toc] Error during cleanup:",u)}}),c.destroyFunctions.length=0}}}export{i as init};
2
+ //# sourceMappingURL=hs-toc-fxIQS7tz.js.map
@@ -0,0 +1,2 @@
1
+ import{c as e}from"../main.js";import{q as r,a as t,g as o}from"./hs-attributeSelector-6pGcDBo-.js";import{p as s,g as n}from"./hs-modalManager-H_YegPAO.js";function l(t){const o=e._global.classes.active,s={observers:[],handlers:[],scrollTimeout:null,headings:[]},n=r(t,"content"),l=r(t,"list");return n.forEach(e=>{const r=l[0];if(!r||0===r.children.length)return;const t=r.children[0].cloneNode(!0),n=t.querySelector("a");n&&n.classList.remove(o),r.innerHTML="";const i=e.querySelectorAll("h2");i.forEach(e=>{const r=e.textContent.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");e.id=r,s.headings.push(e)}),i.forEach((e,o)=>{const s=t.cloneNode(!0),n=s.querySelector("a"),l=e.id;n.href=`#${l}`;const i=document.createElement("strong");i.textContent=`${o+1}. `,n.innerHTML="",n.appendChild(i),n.appendChild(document.createTextNode(e.textContent)),r.appendChild(s)});const c=r.querySelectorAll("a");let a=null;const d=()=>{const e=.25*window.innerHeight;let r=null;for(let t=i.length-1;t>=0;t--){if(i[t].getBoundingClientRect().top<=e){r=i[t].id;break}}if(r!==a&&(a=r,c.forEach(e=>e.classList.remove(o)),a)){const e=Array.from(c).find(e=>e.getAttribute("href")===`#${a}`);e&&e.classList.add(o)}},u=new IntersectionObserver(()=>{d()},{rootMargin:"-25% 0px -75% 0px",threshold:0});i.forEach(e=>u.observe(e)),(e=>{s.observers.push(e)})(u);var g,p,h;g=window,p="scroll",h=()=>{s.scrollTimeout&&clearTimeout(s.scrollTimeout),s.scrollTimeout=setTimeout(d,50)},g.addEventListener(p,h),s.handlers.push({element:g,event:p,handler:h})}),{result:"toc initialized",destroy:()=>{s.headings.forEach(e=>{e.removeAttribute("id")}),s.headings.length=0,s.observers.forEach(e=>e.disconnect()),s.observers.length=0,s.handlers.forEach(({element:e,event:r,handler:t})=>{e.removeEventListener(r,t)}),s.handlers.length=0,s.scrollTimeout&&(clearTimeout(s.scrollTimeout),s.scrollTimeout=null)}}}async function i(){const i=e.structure.toc,c={destroyFunctions:[]},a=o(i,"list");if(document.querySelector(a))try{const e=await l(i);e?.destroy&&c.destroyFunctions.push(e.destroy)}catch(u){console.error("[toc] Error initializing heading-links:",u)}const d=o(i["progress-bar"],"wrapper");if(document.querySelector(d))try{const e=await async function(e){const{progressConfig:o,tocConfig:l}=e;if(s())return{result:"progress-bar skipped - prefers-reduced-motion enabled"};const i=n("progress-bar");if(!i)return{result:"progress-bar skipped - GSAP not loaded"};const{gsap:c,ScrollTrigger:a}=i;if(!a)return console.warn("[progress-bar] GSAP ScrollTrigger plugin not loaded"),{result:"progress-bar skipped - ScrollTrigger not loaded"};c.registerPlugin(a);const d={scrollTriggers:[]},u=t(l,"content");if(!u)return{result:"progress-bar skipped - no content element found"};const g=r(o,"wrapper");return 0===g.length?{result:"progress-bar skipped - no wrapper elements found"}:(g.forEach(e=>{c.set(e,{display:"block"}),Array.from(e.querySelectorAll("*")).filter(e=>{const r=o.attributes.elements.element.primary,[t,s]=r.split("="),n=s?.replace(/['"]/g,"");return e.getAttribute(t)===n}).forEach(e=>{c.set(e,{width:"0%"}),c.to(e,{width:"100%",ease:"none",scrollTrigger:{trigger:u,start:"top bottom",end:"bottom 75%",scrub:!0,invalidateOnRefresh:!0,onUpdate:e=>{d.scrollTriggers.includes(e)||d.scrollTriggers.push(e)}}})})}),{result:`progress-bar initialized (${g.length} instances)`,destroy:()=>{d.scrollTriggers.forEach(e=>{e&&"object"==typeof e&&"kill"in e&&"function"==typeof e.kill&&e.kill()}),d.scrollTriggers.length=0}})}({progressConfig:i["progress-bar"],tocConfig:i});e?.destroy&&c.destroyFunctions.push(e.destroy)}catch(u){console.error("[toc] Error initializing progress-bar:",u)}return{result:`toc initialized (${c.destroyFunctions.length} modules active)`,destroy:()=>{c.destroyFunctions.forEach(e=>{try{e()}catch(u){console.error("[toc] Error during cleanup:",u)}}),c.destroyFunctions.length=0}}}export{i as init};
2
+ //# sourceMappingURL=hs-toc-fxIQS7tz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-toc-fxIQS7tz.js","sources":["../../src/modules/structure/functions/toc/functions/heading-links.ts","../../src/modules/structure/functions/toc/toc.ts","../../src/modules/structure/functions/toc/functions/progress-bar.ts"],"sourcesContent":["/**\n * TOC Heading Links\n *\n * Automatically generates table of contents from H2 headings in rich text.\n * Creates links with smooth scrolling and active state tracking.\n *\n * Features:\n * - Automatically adds IDs to H2 headings based on text content\n * - Generates numbered TOC entries from template item\n * - Active state tracking with IntersectionObserver (25% from top trigger)\n * - Smooth scroll handled by smooth-scroll module\n * - Full cleanup on destroy (removes IDs, observers, handlers)\n */\n\nimport globalConfig from '@config';\nimport { querySelectorAll } from '@utils';\n\nexport function init(config) {\n const activeClass = globalConfig._global.classes.active;\n const cleanup = {\n observers: [],\n handlers: [],\n scrollTimeout: null,\n headings: [],\n };\n\n const addObserver = (observer: IntersectionObserver) => cleanup.observers.push(observer);\n const addHandler = (element: Element | Window, event: string, handler: EventListener) => {\n element.addEventListener(event, handler);\n cleanup.handlers.push({ element, event, handler });\n };\n\n const contentAreas = querySelectorAll(config, 'content');\n const tocLists = querySelectorAll(config, 'list');\n\n contentAreas.forEach((contentArea) => {\n // Since there's only 1 content area and 1 TOC list per page, use the first TOC list\n const tocList = tocLists[0];\n\n if (!tocList || tocList.children.length === 0) {\n return;\n }\n\n const template = tocList.children[0].cloneNode(true) as HTMLElement;\n const templateLink = template.querySelector('a');\n if (templateLink) {\n templateLink.classList.remove(activeClass);\n }\n\n // Clear all original TOC items\n tocList.innerHTML = '';\n\n const h2Headings = contentArea.querySelectorAll('h2');\n\n // Add IDs directly to H2 headings\n h2Headings.forEach((heading) => {\n const sectionId = heading.textContent\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n\n heading.id = sectionId;\n cleanup.headings.push(heading);\n });\n\n // Create TOC entries\n h2Headings.forEach((heading, index) => {\n const tocItem = template.cloneNode(true) as HTMLElement;\n const link = tocItem.querySelector('a');\n const sectionId = heading.id;\n link.href = `#${sectionId}`;\n\n // Bold numbered text\n const number = document.createElement('strong');\n number.textContent = `${index + 1}. `;\n\n // Clear the link and add the number + text\n link.innerHTML = '';\n link.appendChild(number);\n link.appendChild(document.createTextNode(heading.textContent));\n\n tocList.appendChild(tocItem);\n });\n\n // Set up IntersectionObserver for active state\n const tocLinks = tocList.querySelectorAll('a');\n let currentActive = null;\n\n const updateActiveLink = () => {\n const windowHeight = window.innerHeight;\n const trigger = windowHeight * 0.25; // 25% from top (natural reading position)\n\n let newActive = null;\n\n // Find the last heading whose top is above the trigger point\n for (let i = h2Headings.length - 1; i >= 0; i--) {\n const rect = h2Headings[i].getBoundingClientRect();\n if (rect.top <= trigger) {\n newActive = h2Headings[i].id;\n break;\n }\n }\n\n // Only update if active section changed\n if (newActive !== currentActive) {\n currentActive = newActive;\n\n // Remove all active classes\n tocLinks.forEach((link) => link.classList.remove(activeClass));\n\n // Add to current\n if (currentActive) {\n const activeLink = Array.from(tocLinks).find(\n (link) => link.getAttribute('href') === `#${currentActive}`\n );\n if (activeLink) {\n activeLink.classList.add(activeClass);\n }\n }\n }\n };\n\n const observerOptions = {\n rootMargin: '-25% 0px -75% 0px',\n threshold: 0,\n };\n\n const observer = new IntersectionObserver(() => {\n updateActiveLink();\n }, observerOptions);\n\n // Observe all headings\n h2Headings.forEach((heading) => observer.observe(heading));\n addObserver(observer);\n\n // Also update on scroll for smoother tracking\n const scrollHandler = () => {\n if (cleanup.scrollTimeout) clearTimeout(cleanup.scrollTimeout);\n cleanup.scrollTimeout = setTimeout(updateActiveLink, 50);\n };\n addHandler(window, 'scroll', scrollHandler);\n });\n\n return {\n result: 'toc initialized',\n destroy: () => {\n // Remove IDs from headings\n cleanup.headings.forEach((heading) => {\n heading.removeAttribute('id');\n });\n cleanup.headings.length = 0;\n\n // Disconnect all observers\n cleanup.observers.forEach((obs) => obs.disconnect());\n cleanup.observers.length = 0;\n\n // Remove all event listeners\n cleanup.handlers.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n cleanup.handlers.length = 0;\n\n // Clear scroll timeout\n if (cleanup.scrollTimeout) {\n clearTimeout(cleanup.scrollTimeout);\n cleanup.scrollTimeout = null;\n }\n },\n };\n}\n","/**\n * Table of Contents Orchestrator\n *\n * Loads TOC sub-modules based on element presence.\n * Static imports ensure all modules bundle into single file.\n *\n * Features:\n * - Conditional initialization based on element presence\n * - Centralized cleanup management\n * - Single bundled output file\n *\n * Modules:\n * - heading-links: Main TOC functionality (adds IDs, generates links)\n * - progress-bar: Optional reading progress indicator\n */\n\nimport config from '@config';\nimport { getSelector, type ModuleConfig } from '@utils';\nimport { init as headingLinksInit } from './functions/heading-links.ts';\nimport { init as progressBarInit } from './functions/progress-bar.ts';\n\nexport async function init() {\n const moduleConfig = config.structure.toc;\n const cleanup = {\n destroyFunctions: [] as Array<() => void>,\n };\n\n // Initialize heading-links if TOC list exists\n const headingLinksSelector = getSelector(moduleConfig as ModuleConfig, 'list');\n if (document.querySelector(headingLinksSelector)) {\n try {\n const result = await headingLinksInit(moduleConfig);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[toc] Error initializing heading-links:', error);\n }\n }\n\n // Initialize progress-bar if wrapper exists\n const progressBarSelector = getSelector(moduleConfig['progress-bar'] as ModuleConfig, 'wrapper');\n if (document.querySelector(progressBarSelector)) {\n try {\n const result = await progressBarInit({\n progressConfig: moduleConfig['progress-bar'],\n tocConfig: moduleConfig,\n } as any);\n if (result?.destroy) {\n cleanup.destroyFunctions.push(result.destroy);\n }\n } catch (error) {\n console.error('[toc] Error initializing progress-bar:', error);\n }\n }\n\n return {\n result: `toc initialized (${cleanup.destroyFunctions.length} modules active)`,\n destroy: () => {\n cleanup.destroyFunctions.forEach((destroyFn) => {\n try {\n destroyFn();\n } catch (error) {\n console.error('[toc] Error during cleanup:', error);\n }\n });\n cleanup.destroyFunctions.length = 0;\n },\n };\n}\n","/**\n * Progress Bar\n *\n * Scroll-based progress bar tracking reading progress through content.\n * Uses GSAP ScrollTrigger to animate bar width from 0% to 100%.\n *\n * Structure:\n * <div data-hs-toc=\"content\">\n * <!-- Content to track -->\n * </div>\n * <div data-hs-toc-progress=\"wrapper\">\n * <div data-hs-toc-progress=\"element\"></div>\n * </div>\n */\n\nimport { querySelector, querySelectorAll, getGsap, prefersReducedMotion } from '@utils';\n\ninterface ProgressBarConfig {\n progressConfig: {\n attributes: {\n elements: {\n wrapper: { primary: string; aliases?: string[] };\n element: { primary: string; aliases?: string[] };\n };\n };\n };\n tocConfig: {\n attributes: {\n elements: {\n content: { primary: string; aliases?: string[] };\n };\n };\n };\n}\n\nexport async function init(configObj: ProgressBarConfig) {\n const { progressConfig: config, tocConfig } = configObj;\n\n // Skip if user prefers reduced motion\n if (prefersReducedMotion()) {\n return { result: 'progress-bar skipped - prefers-reduced-motion enabled' };\n }\n\n const gsapLib = getGsap('progress-bar');\n if (!gsapLib) {\n return { result: 'progress-bar skipped - GSAP not loaded' };\n }\n\n const { gsap, ScrollTrigger } = gsapLib;\n\n if (!ScrollTrigger) {\n console.warn('[progress-bar] GSAP ScrollTrigger plugin not loaded');\n return { result: 'progress-bar skipped - ScrollTrigger not loaded' };\n }\n\n gsap.registerPlugin(ScrollTrigger);\n\n const cleanup = {\n scrollTriggers: [] as unknown[],\n };\n\n // Find content area (using toc config since they share the same content)\n const content = querySelector(tocConfig, 'content');\n if (!content) {\n return { result: 'progress-bar skipped - no content element found' };\n }\n\n // Find all progress bar wrappers\n const wrappers = querySelectorAll(config, 'wrapper');\n if (wrappers.length === 0) {\n return { result: 'progress-bar skipped - no wrapper elements found' };\n }\n\n wrappers.forEach((wrapper) => {\n // Show wrapper\n gsap.set(wrapper, { display: 'block' });\n\n // Find progress bar elements inside this wrapper using config\n const progressBars = Array.from(wrapper.querySelectorAll('*')).filter((el) => {\n // Check primary selector\n const primaryAttr = config.attributes.elements.element.primary;\n const [attr, value] = primaryAttr.split('=');\n const cleanValue = value?.replace(/['\"]/g, '');\n return el.getAttribute(attr) === cleanValue;\n });\n\n progressBars.forEach((bar) => {\n // Set initial width to 0%\n gsap.set(bar, { width: '0%' });\n\n // Animate from 0% to 100% based on scroll\n gsap.to(bar, {\n width: '100%',\n ease: 'none',\n scrollTrigger: {\n trigger: content,\n start: 'top bottom', // Start when top of content touches bottom of viewport\n end: 'bottom 75%', // End when bottom of content reaches 75% down the viewport\n scrub: true,\n invalidateOnRefresh: true,\n onUpdate: (self) => {\n // Store the scrollTrigger instance for cleanup\n if (!cleanup.scrollTriggers.includes(self)) {\n cleanup.scrollTriggers.push(self);\n }\n },\n },\n });\n });\n });\n\n return {\n result: `progress-bar initialized (${wrappers.length} instances)`,\n destroy: () => {\n // Kill all scroll triggers\n cleanup.scrollTriggers.forEach((st) => {\n if (st && typeof st === 'object' && 'kill' in st && typeof st.kill === 'function') {\n st.kill();\n }\n });\n cleanup.scrollTriggers.length = 0;\n },\n };\n}\n"],"names":["init","config","activeClass","globalConfig","_global","classes","active","cleanup","observers","handlers","scrollTimeout","headings","contentAreas","querySelectorAll","tocLists","forEach","contentArea","tocList","children","length","template","cloneNode","templateLink","querySelector","classList","remove","innerHTML","h2Headings","heading","sectionId","textContent","toLowerCase","replace","id","push","index","tocItem","link","href","number","document","createElement","appendChild","createTextNode","tocLinks","currentActive","updateActiveLink","trigger","window","innerHeight","newActive","i","getBoundingClientRect","top","activeLink","Array","from","find","getAttribute","add","observer","IntersectionObserver","rootMargin","threshold","observe","addObserver","element","event","handler","clearTimeout","setTimeout","addEventListener","result","destroy","removeAttribute","obs","disconnect","removeEventListener","async","moduleConfig","structure","toc","destroyFunctions","headingLinksSelector","getSelector","headingLinksInit","error","console","progressBarSelector","configObj","progressConfig","tocConfig","prefersReducedMotion","gsapLib","getGsap","gsap","ScrollTrigger","warn","registerPlugin","scrollTriggers","content","wrappers","wrapper","set","display","filter","el","primaryAttr","attributes","elements","primary","attr","value","split","cleanValue","bar","width","to","ease","scrollTrigger","start","end","scrub","invalidateOnRefresh","onUpdate","self","includes","st","kill","progressBarInit","destroyFn"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{g as t}from"./hs-utils-CKm6QhLw.js";import"./hs-modalManager-H_YegPAO.js";import"../main.js";const e=t.apiName,n='[data-hs-transition="wrapper"]',r="data-hs-transition-exit-trigger",i="data-hs-transition-enter-trigger",s="data-hs-transition-trigger",o="data-hs-transition-namespace",a="data-hs-transition-exit-time",l="data-hs-transition-first-delay",d="data-hs-transition-initialized",c="data-hs-exit-time",u="data-hs-delay";async function f(){const t=document.querySelector(n);if(!t)return{result:"transition skipped - no wrapper found",destroy:()=>{}};if(t.hasAttribute(d))return{result:"transition already initialized",destroy:()=>{}};t.setAttribute(d,"true");const f=window[e]?.settings?.isSPA||!1,m=new Map;let h=null;const w=(e,n=null,a=t)=>{const l=a.querySelectorAll(`[${s}="${e}"]`);if(l.length>0){if(n){const t=a.querySelector(`[${o}="${n}"]`);if(t){const n=t.querySelector(`[${s}="${e}"]`);if(n)return n}}const t=Array.from(l).find(t=>{let e=t.parentElement;for(;e&&e!==a;){if(e.hasAttribute(o))return!1;e=e.parentElement}return!0});if(t)return t}const d="exit"===e?r:i,c=a.querySelectorAll(`[${d}]`);if(c.length>0){if(n){const t=a.querySelector(`[${o}="${n}"]`);if(t){const e=t.querySelector(`[${d}]`);if(e)return e}}const t=Array.from(c).find(t=>{let e=t.parentElement;for(;e&&e!==a;){if(e.hasAttribute(o))return!1;e=e.parentElement}return!0});if(t)return t}return null},p=(e=null)=>new Promise(n=>{const r=w("exit",e);if(!r)return void n();const i=(()=>{const e=t.getAttribute(a);if(e)return 1e3*parseFloat(e);const n=t.getAttribute(c);return n?1e3*parseFloat(n):0})();r.click(),setTimeout(()=>n(),i)}),g=(e=null)=>new Promise(n=>{const r=w("enter",e);if(!r)return void n();const i=!sessionStorage.getItem("transition-loaded"),s=(()=>{const e=t.getAttribute(l);if(e)return 1e3*parseFloat(e);const n=t.getAttribute(u);return n?1e3*parseFloat(n):0})(),o=()=>{r.click(),i&&sessionStorage.setItem("transition-loaded","true"),n()};i&&s>0?h=setTimeout(o,s):o()}),y=t=>{p(t?.detail?.namespace||null)},A=t=>{g(t?.detail?.namespace||null)};if(m.set("hsmain:transition-exit",y),m.set("hsmain:transition-enter",A),window.addEventListener("hsmain:transition-exit",y),window.addEventListener("hsmain:transition-enter",A),!f){const t=t=>{const e=t.target.closest("a[href]");if(e&&e.hostname===window.location.hostname&&e.getAttribute("href")&&-1===e.getAttribute("href").indexOf("#")&&"_blank"!==e.getAttribute("target")){t.preventDefault();const n=e.href;p().then(()=>{window.location.href=n})}};m.set("click",t),document.addEventListener("click",t);const e=t=>{t.persisted&&window.location.reload()};m.set("pageshow",e),window.addEventListener("pageshow",e)}const v=()=>{t&&(t.style.display="none")};if(m.set("resize",v),window.addEventListener("resize",v),!f){const t=()=>{g()};m.set(`${e}:dom-ready`,t),window.addEventListener(`${e}:dom-ready`,t,{once:!0})}return{result:"transition initialized",destroy:()=>{h&&clearTimeout(h),m.forEach((t,e)=>{if("click"===e||"pageshow"===e||"resize"===e){("click"===e?document:window).removeEventListener(e,t)}else window.removeEventListener(e,t)}),m.clear(),t.removeAttribute(d)}}}export{f as init};
2
+ //# sourceMappingURL=hs-transition-CDNuGJNq.js.map
@@ -0,0 +1,2 @@
1
+ import{g as t}from"./hs-utils-CKm6QhLw.js";import"./hs-modalManager-H_YegPAO.js";import"../main.js";const e=t.apiName,n='[data-hs-transition="wrapper"]',r="data-hs-transition-exit-trigger",i="data-hs-transition-enter-trigger",s="data-hs-transition-trigger",o="data-hs-transition-namespace",a="data-hs-transition-exit-time",l="data-hs-transition-first-delay",d="data-hs-transition-initialized",c="data-hs-exit-time",u="data-hs-delay";async function f(){const t=document.querySelector(n);if(!t)return{result:"transition skipped - no wrapper found",destroy:()=>{}};if(t.hasAttribute(d))return{result:"transition already initialized",destroy:()=>{}};t.setAttribute(d,"true");const f=window[e]?.settings?.isSPA||!1,m=new Map;let h=null;const w=(e,n=null,a=t)=>{const l=a.querySelectorAll(`[${s}="${e}"]`);if(l.length>0){if(n){const t=a.querySelector(`[${o}="${n}"]`);if(t){const n=t.querySelector(`[${s}="${e}"]`);if(n)return n}}const t=Array.from(l).find(t=>{let e=t.parentElement;for(;e&&e!==a;){if(e.hasAttribute(o))return!1;e=e.parentElement}return!0});if(t)return t}const d="exit"===e?r:i,c=a.querySelectorAll(`[${d}]`);if(c.length>0){if(n){const t=a.querySelector(`[${o}="${n}"]`);if(t){const e=t.querySelector(`[${d}]`);if(e)return e}}const t=Array.from(c).find(t=>{let e=t.parentElement;for(;e&&e!==a;){if(e.hasAttribute(o))return!1;e=e.parentElement}return!0});if(t)return t}return null},p=(e=null)=>new Promise(n=>{const r=w("exit",e);if(!r)return void n();const i=(()=>{const e=t.getAttribute(a);if(e)return 1e3*parseFloat(e);const n=t.getAttribute(c);return n?1e3*parseFloat(n):0})();r.click(),setTimeout(()=>n(),i)}),g=(e=null)=>new Promise(n=>{const r=w("enter",e);if(!r)return void n();const i=!sessionStorage.getItem("transition-loaded"),s=(()=>{const e=t.getAttribute(l);if(e)return 1e3*parseFloat(e);const n=t.getAttribute(u);return n?1e3*parseFloat(n):0})(),o=()=>{r.click(),i&&sessionStorage.setItem("transition-loaded","true"),n()};i&&s>0?h=setTimeout(o,s):o()}),y=t=>{p(t?.detail?.namespace||null)},A=t=>{g(t?.detail?.namespace||null)};if(m.set("hsmain:transition-exit",y),m.set("hsmain:transition-enter",A),window.addEventListener("hsmain:transition-exit",y),window.addEventListener("hsmain:transition-enter",A),!f){const t=t=>{const e=t.target.closest("a[href]");if(e&&e.hostname===window.location.hostname&&e.getAttribute("href")&&-1===e.getAttribute("href").indexOf("#")&&"_blank"!==e.getAttribute("target")){t.preventDefault();const n=e.href;p().then(()=>{window.location.href=n})}};m.set("click",t),document.addEventListener("click",t);const e=t=>{t.persisted&&window.location.reload()};m.set("pageshow",e),window.addEventListener("pageshow",e)}const v=()=>{t&&(t.style.display="none")};if(m.set("resize",v),window.addEventListener("resize",v),!f){const t=()=>{g()};m.set(`${e}:dom-ready`,t),window.addEventListener(`${e}:dom-ready`,t,{once:!0})}return{result:"transition initialized",destroy:()=>{h&&clearTimeout(h),m.forEach((t,e)=>{if("click"===e||"pageshow"===e||"resize"===e){("click"===e?document:window).removeEventListener(e,t)}else window.removeEventListener(e,t)}),m.clear(),t.removeAttribute(d)}}}export{f as init};
2
+ //# sourceMappingURL=hs-transition-CDNuGJNq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-transition-CDNuGJNq.js","sources":["../../src/animations/functions/transition.ts"],"sourcesContent":["/**\n * Page Transition\n *\n * Provides animated page transitions by intercepting link clicks and triggering\n * Webflow IX animations. Supports namespace-based transitions for different page\n * types (home, contact, etc.) and both MPA and SPA architectures.\n *\n * Features:\n * - Auto link interception for seamless page transitions (MPA mode)\n * - Namespace system for page-specific transitions (Barba.js compatible)\n * - Separate exit/enter triggers for precise animation control\n * - Configurable timing with exit-time and first-delay\n * - Session-aware first load handling\n * - SPA event-based integration support\n *\n * Usage:\n * <div data-hs-transition=\"wrapper\" data-hs-transition-exit-time=\"0.5\" data-hs-transition-first-delay=\"0.3\">\n * <!-- Default triggers (fallback) -->\n * <div data-hs-transition-exit-trigger>Exit animation</div>\n * <div data-hs-transition-enter-trigger>Enter animation</div>\n * <!-- OR -->\n * <div data-hs-transition-trigger=\"exit\">Exit animation</div>\n * <div data-hs-transition-trigger=\"enter\">Enter animation</div>\n *\n * <!-- Namespace-specific (for Barba.js) -->\n * <div data-hs-transition-namespace=\"home\">\n * <div data-hs-transition-trigger=\"exit\">Home exit</div>\n * <div data-hs-transition-trigger=\"enter\">Home enter</div>\n * </div>\n * </div>\n */\n\nimport { globalConfig } from '@utils';\n\nconst API_NAME = globalConfig.apiName;\n\n// Selectors and Attributes\nconst SELECTORS = {\n wrapper: '[data-hs-transition=\"wrapper\"]',\n};\n\nconst ATTRIBUTES = {\n exitTrigger: 'data-hs-transition-exit-trigger',\n enterTrigger: 'data-hs-transition-enter-trigger',\n trigger: 'data-hs-transition-trigger',\n namespace: 'data-hs-transition-namespace',\n exitTime: 'data-hs-transition-exit-time',\n firstDelay: 'data-hs-transition-first-delay',\n initialized: 'data-hs-transition-initialized',\n // Legacy fallbacks\n legacyExitTime: 'data-hs-exit-time',\n legacyFirstDelay: 'data-hs-delay',\n};\n\nexport async function init() {\n // Check if transition wrapper exists - skip if not found\n const transitionWrapper = document.querySelector(SELECTORS.wrapper);\n if (!transitionWrapper) {\n return {\n result: 'transition skipped - no wrapper found',\n destroy: () => {},\n };\n }\n\n // Prevent double initialization (important for SPA when wrapper is outside Barba container)\n if (transitionWrapper.hasAttribute(ATTRIBUTES.initialized)) {\n return {\n result: 'transition already initialized',\n destroy: () => {},\n };\n }\n\n // Mark as initialized\n transitionWrapper.setAttribute(ATTRIBUTES.initialized, 'true');\n\n // Check if running in SPA mode\n const isSPA = window[API_NAME]?.settings?.isSPA || false;\n\n // Store event handlers and timeouts for cleanup\n const eventHandlers = new Map();\n let delayTimeout: number | null = null;\n let navTimeout: number | null = null;\n\n const cleanup = () => {\n // Clear any pending timeouts\n if (delayTimeout) clearTimeout(delayTimeout);\n if (navTimeout) clearTimeout(navTimeout);\n\n // Remove all event listeners\n eventHandlers.forEach((handler, event) => {\n if (event === 'click' || event === 'pageshow' || event === 'resize') {\n const target = event === 'click' ? document : window;\n target.removeEventListener(event, handler);\n } else {\n window.removeEventListener(event, handler);\n }\n });\n eventHandlers.clear();\n\n // Remove initialization flag to allow re-initialization\n transitionWrapper.removeAttribute(ATTRIBUTES.initialized);\n };\n\n /**\n * Find trigger element for specific type (exit or enter) and optional namespace\n * Supports trigger patterns with priority:\n * 1. Namespace-specific triggers (if namespace provided)\n * 2. Default triggers (no namespace)\n */\n const findTrigger = (\n type: 'exit' | 'enter',\n namespace: string | null = null,\n root: Element = transitionWrapper\n ): Element | null => {\n // Try new syntax: data-hs-transition-trigger=\"exit\" or \"enter\"\n const newSyntaxTriggers = root.querySelectorAll(`[${ATTRIBUTES.trigger}=\"${type}\"]`);\n\n if (newSyntaxTriggers.length > 0) {\n // If namespace specified, look inside namespace wrapper\n if (namespace) {\n const namespaceWrapper = root.querySelector(`[${ATTRIBUTES.namespace}=\"${namespace}\"]`);\n if (namespaceWrapper) {\n const namespaceTrigger = namespaceWrapper.querySelector(\n `[${ATTRIBUTES.trigger}=\"${type}\"]`\n );\n if (namespaceTrigger) return namespaceTrigger;\n }\n }\n\n // Fallback to default (not inside ANY namespace wrapper)\n const defaultTrigger = Array.from(newSyntaxTriggers).find((trigger) => {\n // Check if trigger is inside any namespace wrapper\n let parent = trigger.parentElement;\n while (parent && parent !== root) {\n if (parent.hasAttribute(ATTRIBUTES.namespace)) {\n return false; // Inside a namespace, skip it\n }\n parent = parent.parentElement;\n }\n return true; // Not inside any namespace\n });\n\n if (defaultTrigger) return defaultTrigger;\n }\n\n // Try separate exit/enter trigger syntax\n const triggerAttr = type === 'exit' ? ATTRIBUTES.exitTrigger : ATTRIBUTES.enterTrigger;\n const separateTriggers = root.querySelectorAll(`[${triggerAttr}]`);\n\n if (separateTriggers.length > 0) {\n // If namespace specified, look inside namespace wrapper\n if (namespace) {\n const namespaceWrapper = root.querySelector(`[${ATTRIBUTES.namespace}=\"${namespace}\"]`);\n if (namespaceWrapper) {\n const namespaceTrigger = namespaceWrapper.querySelector(`[${triggerAttr}]`);\n if (namespaceTrigger) return namespaceTrigger;\n }\n }\n\n // Fallback to default (not inside ANY namespace wrapper)\n const defaultTrigger = Array.from(separateTriggers).find((trigger) => {\n // Check if trigger is inside any namespace wrapper\n let parent = trigger.parentElement;\n while (parent && parent !== root) {\n if (parent.hasAttribute(ATTRIBUTES.namespace)) {\n return false; // Inside a namespace, skip it\n }\n parent = parent.parentElement;\n }\n return true; // Not inside any namespace\n });\n\n if (defaultTrigger) return defaultTrigger;\n }\n\n return null;\n };\n\n /**\n * Get exit time from wrapper element\n */\n const getExitTime = (): number => {\n const value = transitionWrapper.getAttribute(ATTRIBUTES.exitTime);\n if (value) return parseFloat(value) * 1000;\n\n // Legacy fallback\n const legacyValue = transitionWrapper.getAttribute(ATTRIBUTES.legacyExitTime);\n if (legacyValue) return parseFloat(legacyValue) * 1000;\n\n return 0;\n };\n\n /**\n * Get first delay from wrapper element (only applies on first load)\n */\n const getFirstDelay = (): number => {\n const value = transitionWrapper.getAttribute(ATTRIBUTES.firstDelay);\n if (value) return parseFloat(value) * 1000;\n\n // Legacy fallback\n const legacyValue = transitionWrapper.getAttribute(ATTRIBUTES.legacyFirstDelay);\n if (legacyValue) return parseFloat(legacyValue) * 1000;\n\n return 0;\n };\n\n /**\n * Play exit animation (when leaving page)\n */\n const playExitAnimation = (namespace: string | null = null): Promise<void> => {\n return new Promise((resolve) => {\n const exitTrigger = findTrigger('exit', namespace);\n if (!exitTrigger) {\n resolve();\n return;\n }\n\n const exitTime = getExitTime();\n\n // Trigger the animation\n (exitTrigger as HTMLElement).click();\n\n // Resolve after animation completes\n setTimeout(() => resolve(), exitTime);\n });\n };\n\n /**\n * Play enter animation (when arriving on page)\n */\n const playEnterAnimation = (namespace: string | null = null): Promise<void> => {\n return new Promise((resolve) => {\n const enterTrigger = findTrigger('enter', namespace);\n if (!enterTrigger) {\n resolve();\n return;\n }\n\n // Check if first load\n const isFirstLoad = !sessionStorage.getItem('transition-loaded');\n const firstDelay = getFirstDelay();\n\n const triggerAnimation = () => {\n (enterTrigger as HTMLElement).click();\n\n // Mark as loaded for session\n if (isFirstLoad) {\n sessionStorage.setItem('transition-loaded', 'true');\n }\n\n resolve();\n };\n\n // Only apply delay on first load\n if (isFirstLoad && firstDelay > 0) {\n delayTimeout = setTimeout(triggerAnimation, firstDelay) as unknown as number;\n } else {\n triggerAnimation();\n }\n });\n };\n\n // Always listen for custom events (works for both MPA and SPA)\n // SPA frameworks (like Barba) can dispatch these with namespace data\n const handleExitEvent = (event?: CustomEvent) => {\n const namespace = (event as any)?.detail?.namespace || null;\n playExitAnimation(namespace);\n };\n\n const handleEnterEvent = (event?: CustomEvent) => {\n const namespace = (event as any)?.detail?.namespace || null;\n playEnterAnimation(namespace);\n };\n\n eventHandlers.set('hsmain:transition-exit', handleExitEvent);\n eventHandlers.set('hsmain:transition-enter', handleEnterEvent);\n window.addEventListener('hsmain:transition-exit', handleExitEvent as EventListener);\n window.addEventListener('hsmain:transition-enter', handleEnterEvent as EventListener);\n\n // MPA Mode: Intercept link clicks\n if (!isSPA) {\n const linkClickHandler = (e: MouseEvent) => {\n const link = (e.target as Element).closest('a[href]') as HTMLAnchorElement;\n\n if (\n link &&\n link.hostname === window.location.hostname &&\n link.getAttribute('href') &&\n link.getAttribute('href')!.indexOf('#') === -1 &&\n link.getAttribute('target') !== '_blank'\n ) {\n e.preventDefault();\n const href = link.href;\n\n // Play exit animation, then navigate\n playExitAnimation().then(() => {\n window.location.href = href;\n });\n }\n };\n\n eventHandlers.set('click', linkClickHandler);\n document.addEventListener('click', linkClickHandler);\n\n // Handle back button navigation\n const pageShowHandler = (event: PageTransitionEvent) => {\n if (event.persisted) {\n window.location.reload();\n }\n };\n\n eventHandlers.set('pageshow', pageShowHandler);\n window.addEventListener('pageshow', pageShowHandler);\n }\n\n // Hide transition on window resize (prevents visual glitches)\n const resizeHandler = () => {\n if (transitionWrapper) {\n (transitionWrapper as HTMLElement).style.display = 'none';\n }\n };\n\n eventHandlers.set('resize', resizeHandler);\n window.addEventListener('resize', resizeHandler);\n\n // On DOM ready, play enter animation (only in MPA mode)\n // In SPA mode, Barba handles all transitions via events\n if (!isSPA) {\n const domReadyHandler = () => {\n playEnterAnimation();\n };\n\n eventHandlers.set(`${API_NAME}:dom-ready`, domReadyHandler);\n window.addEventListener(`${API_NAME}:dom-ready`, domReadyHandler, { once: true });\n }\n\n return {\n result: 'transition initialized',\n destroy: cleanup,\n };\n}\n"],"names":["API_NAME","globalConfig","apiName","SELECTORS","ATTRIBUTES","async","init","transitionWrapper","document","querySelector","result","destroy","hasAttribute","setAttribute","isSPA","window","settings","eventHandlers","Map","delayTimeout","findTrigger","type","namespace","root","newSyntaxTriggers","querySelectorAll","length","namespaceWrapper","namespaceTrigger","defaultTrigger","Array","from","find","trigger","parent","parentElement","triggerAttr","separateTriggers","playExitAnimation","Promise","resolve","exitTrigger","exitTime","value","getAttribute","parseFloat","legacyValue","getExitTime","click","setTimeout","playEnterAnimation","enterTrigger","isFirstLoad","sessionStorage","getItem","firstDelay","getFirstDelay","triggerAnimation","setItem","handleExitEvent","event","detail","handleEnterEvent","set","addEventListener","linkClickHandler","e","link","target","closest","hostname","location","indexOf","preventDefault","href","then","pageShowHandler","persisted","reload","resizeHandler","style","display","domReadyHandler","once","forEach","handler","removeEventListener","clear","removeAttribute"],"mappings":"oGAkCA,MAAMA,EAAWC,EAAaC,QAGxBC,EACK,iCAGLC,EACS,kCADTA,EAEU,mCAFVA,EAGK,6BAHLA,EAIO,+BAJPA,EAKM,+BALNA,EAMQ,iCANRA,EAOS,iCAPTA,EASY,oBATZA,EAUc,gBAGpBC,eAAsBC,IAEpB,MAAMC,EAAoBC,SAASC,cAAcN,GACjD,IAAKI,EACH,MAAO,CACLG,OAAQ,wCACRC,QAAS,QAKb,GAAIJ,EAAkBK,aAAaR,GACjC,MAAO,CACLM,OAAQ,iCACRC,QAAS,QAKbJ,EAAkBM,aAAaT,EAAwB,QAGvD,MAAMU,EAAQC,OAAOf,IAAWgB,UAAUF,QAAS,EAG7CG,MAAoBC,IAC1B,IAAIC,EAA8B,KAGlC,MA0BMC,EAAc,CAClBC,EACAC,EAA2B,KAC3BC,EAAgBhB,KAGhB,MAAMiB,EAAoBD,EAAKE,iBAAiB,IAAIrB,MAAuBiB,OAE3E,GAAIG,EAAkBE,OAAS,EAAG,CAEhC,GAAIJ,EAAW,CACb,MAAMK,EAAmBJ,EAAKd,cAAc,IAAIL,MAAyBkB,OACzE,GAAIK,EAAkB,CACpB,MAAMC,EAAmBD,EAAiBlB,cACxC,IAAIL,MAAuBiB,OAE7B,GAAIO,EAAkB,OAAOA,CAC/B,CACF,CAGA,MAAMC,EAAiBC,MAAMC,KAAKP,GAAmBQ,KAAMC,IAEzD,IAAIC,EAASD,EAAQE,cACrB,KAAOD,GAAUA,IAAWX,GAAM,CAChC,GAAIW,EAAOtB,aAAaR,GACtB,OAAO,EAET8B,EAASA,EAAOC,aAClB,CACA,OAAO,IAGT,GAAIN,EAAgB,OAAOA,CAC7B,CAGA,MAAMO,EAAuB,SAATf,EAAkBjB,EAAyBA,EACzDiC,EAAmBd,EAAKE,iBAAiB,IAAIW,MAEnD,GAAIC,EAAiBX,OAAS,EAAG,CAE/B,GAAIJ,EAAW,CACb,MAAMK,EAAmBJ,EAAKd,cAAc,IAAIL,MAAyBkB,OACzE,GAAIK,EAAkB,CACpB,MAAMC,EAAmBD,EAAiBlB,cAAc,IAAI2B,MAC5D,GAAIR,EAAkB,OAAOA,CAC/B,CACF,CAGA,MAAMC,EAAiBC,MAAMC,KAAKM,GAAkBL,KAAMC,IAExD,IAAIC,EAASD,EAAQE,cACrB,KAAOD,GAAUA,IAAWX,GAAM,CAChC,GAAIW,EAAOtB,aAAaR,GACtB,OAAO,EAET8B,EAASA,EAAOC,aAClB,CACA,OAAO,IAGT,GAAIN,EAAgB,OAAOA,CAC7B,CAEA,OAAO,MAkCHS,EAAoB,CAAChB,EAA2B,OAC7C,IAAIiB,QAASC,IAClB,MAAMC,EAAcrB,EAAY,OAAQE,GACxC,IAAKmB,EAEH,YADAD,IAIF,MAAME,EApCU,MAClB,MAAMC,EAAQpC,EAAkBqC,aAAaxC,GAC7C,GAAIuC,EAAO,OAA2B,IAApBE,WAAWF,GAG7B,MAAMG,EAAcvC,EAAkBqC,aAAaxC,GACnD,OAAI0C,EAA8C,IAA1BD,WAAWC,GAE5B,GA4BYC,GAGhBN,EAA4BO,QAG7BC,WAAW,IAAMT,IAAWE,KAO1BQ,EAAqB,CAAC5B,EAA2B,OAC9C,IAAIiB,QAASC,IAClB,MAAMW,EAAe/B,EAAY,QAASE,GAC1C,IAAK6B,EAEH,YADAX,IAKF,MAAMY,GAAeC,eAAeC,QAAQ,qBACtCC,EA7CY,MACpB,MAAMZ,EAAQpC,EAAkBqC,aAAaxC,GAC7C,GAAIuC,EAAO,OAA2B,IAApBE,WAAWF,GAG7B,MAAMG,EAAcvC,EAAkBqC,aAAaxC,GACnD,OAAI0C,EAA8C,IAA1BD,WAAWC,GAE5B,GAqCcU,GAEbC,EAAmB,KACtBN,EAA6BH,QAG1BI,GACFC,eAAeK,QAAQ,oBAAqB,QAG9ClB,KAIEY,GAAeG,EAAa,EAC9BpC,EAAe8B,WAAWQ,EAAkBF,GAE5CE,MAOAE,EAAmBC,IAEvBtB,EADmBsB,GAAeC,QAAQvC,WAAa,OAInDwC,EAAoBF,IAExBV,EADmBU,GAAeC,QAAQvC,WAAa,OAUzD,GANAL,EAAc8C,IAAI,yBAA0BJ,GAC5C1C,EAAc8C,IAAI,0BAA2BD,GAC7C/C,OAAOiD,iBAAiB,yBAA0BL,GAClD5C,OAAOiD,iBAAiB,0BAA2BF,IAG9ChD,EAAO,CACV,MAAMmD,EAAoBC,IACxB,MAAMC,EAAQD,EAAEE,OAAmBC,QAAQ,WAE3C,GACEF,GACAA,EAAKG,WAAavD,OAAOwD,SAASD,UAClCH,EAAKvB,aAAa,cAClBuB,EAAKvB,aAAa,QAAS4B,QAAQ,MACH,WAAhCL,EAAKvB,aAAa,UAClB,CACAsB,EAAEO,iBACF,MAAMC,EAAOP,EAAKO,KAGlBpC,IAAoBqC,KAAK,KACvB5D,OAAOwD,SAASG,KAAOA,GAE3B,GAGFzD,EAAc8C,IAAI,QAASE,GAC3BzD,SAASwD,iBAAiB,QAASC,GAGnC,MAAMW,EAAmBhB,IACnBA,EAAMiB,WACR9D,OAAOwD,SAASO,UAIpB7D,EAAc8C,IAAI,WAAYa,GAC9B7D,OAAOiD,iBAAiB,WAAYY,EACtC,CAGA,MAAMG,EAAgB,KAChBxE,IACDA,EAAkCyE,MAAMC,QAAU,SASvD,GALAhE,EAAc8C,IAAI,SAAUgB,GAC5BhE,OAAOiD,iBAAiB,SAAUe,IAI7BjE,EAAO,CACV,MAAMoE,EAAkB,KACtBhC,KAGFjC,EAAc8C,IAAI,GAAG/D,cAAsBkF,GAC3CnE,OAAOiD,iBAAiB,GAAGhE,cAAsBkF,EAAiB,CAAEC,MAAM,GAC5E,CAEA,MAAO,CACLzE,OAAQ,yBACRC,QA/Pc,KAEVQ,gBAA2BA,GAI/BF,EAAcmE,QAAQ,CAACC,EAASzB,KAC9B,GAAc,UAAVA,GAA+B,aAAVA,GAAkC,WAAVA,EAAoB,EAC1C,UAAVA,EAAoBpD,SAAWO,QACvCuE,oBAAoB1B,EAAOyB,EACpC,MACEtE,OAAOuE,oBAAoB1B,EAAOyB,KAGtCpE,EAAcsE,QAGdhF,EAAkBiF,gBAAgBpF,IAgPtC"}
@@ -0,0 +1,2 @@
1
+ import"./hs-modalManager-H_YegPAO.js";import{c as a}from"../main.js";const o=a._global;export{o as g};
2
+ //# sourceMappingURL=hs-utils-CKm6QhLw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs-utils-CKm6QhLw.js","sources":["../../src/utils.ts"],"sourcesContent":["/**\n * Utils Barrel Export\n *\n * Centralized export for all utility functions.\n * Enables cleaner imports across modules.\n */\n\n// Attribute selector utilities\nexport {\n getSelector,\n querySelectorAll,\n querySelector,\n checkDeprecated,\n} from './utils/attributeSelector.ts';\n\n// Height animation utilities\nexport { animateHeight, setHeight } from './utils/heightAnimator.ts';\n\n// Modal manager utilities\nexport {\n openModal,\n closeModal,\n onModalOpen,\n onModalClose,\n getActiveModalCount,\n isModalOpen,\n} from './utils/modalManager.ts';\n\n// Import config to extract globalConfig\nimport config from '@config';\n\n// Export globalConfig from master config\nexport const globalConfig = config._global;\n\n// CSS variables utility (default export becomes named export)\nexport { default as cssVariables } from './utils/cssVariables.ts';\n\n// GSAP utilities\nexport {\n getGsap,\n hasGsap,\n hasScrollTrigger,\n hasDraggable,\n resetGsapWarning,\n prefersReducedMotion,\n initScrollVelocityTracking,\n initScrollTriggerRefresh,\n getScrollVelocity,\n getScrollDirection,\n warnMissingDependencies,\n type GsapTimeline,\n type GsapTween,\n} from './utils/gsap.ts';\n\n// Orchestrator utility\nexport {\n createOrchestrator,\n type ModuleRegistryEntry,\n type ModuleInstance,\n type ScanResult,\n type OrchestratorReturn,\n} from './utils/orchestrator.ts';\n\n// Webflow platform utilities\nexport { isWebflow, waitForIx3, shouldSkipWebflow } from './utils/webflow.ts';\n\n// Config types\nexport { type ModuleConfig } from './config.ts';\n"],"names":["globalConfig","config","_global"],"mappings":"qEAgCO,MAAMA,EAAeC,EAAOC"}
package/dist/main.js CHANGED
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/normalize-DWI4olFS.js","assets/modalManager-LtDi9OJz.js","assets/utils-DA-PANmk.js","assets/structure--7b3v7AH.js","assets/cssVariables-n9wQSSYb.js","assets/default-CZ6vle49.js"])))=>i.map(i=>d[i]);
2
- const e={},a=function(a,t,s){let r=Promise.resolve();if(t&&t.length>0){let a=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),i=s?.nonce||s?.getAttribute("nonce");r=a(t.map(a=>{if((a=function(e){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.22/dist/"+e}(a))in e)return;e[a]=!0;const t=a.endsWith(".css"),s=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${a}"]${s}`))return;const r=document.createElement("link");return r.rel=t?"stylesheet":"modulepreload",t||(r.as="script"),r.crossOrigin="",r.href=a,i&&r.setAttribute("nonce",i),document.head.appendChild(r),t?new Promise((e,t)=>{r.addEventListener("load",e),r.addEventListener("error",()=>t(new Error(`Unable to preload CSS for ${a}`)))}):void 0}))}function i(e){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=e,window.dispatchEvent(a),!a.defaultPrevented)throw e}return r.then(e=>{for(const a of e||[])"rejected"===a.status&&i(a.reason);return a().catch(i)})},t={_global:{version:"2.0.0",apiName:"hsmain",attributes:{height:"data-hs-height",heightValue:"element",heightDuration:"data-hs-height-duration",heightEase:"data-hs-height-ease",moduleType:"data-hs-module-type",module:"data-hs-module"},classes:{modalOpen:"hs-modal-open",overflowHidden:"u-overflow-hidden",initialized:"hs-main",displayContents:"u-display-contents",active:"is-active",gsap:"hs-gsap"},cssVars:{prefix:"--_hs---",state:{name:"state",values:{active:"1",inactive:"0"}},clip:{name:"clip"}},clickable:{module:"global-clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},normalize:{sync:{module:"sync",description:"Syncs collection list data to static lists with matching structure",attributes:{elements:{source:{primary:"data-hs-sync='source'",aliases:[]},target:{primary:"data-hs-sync='target'",aliases:[]},item:{primary:"data-hs-sync='item'",aliases:[]},ignore:{primary:"data-hs-sync='ignore'",aliases:[]}},properties:{syncId:"data-hs-sync-id",syncField:"data-hs-sync-field",syncMode:"data-hs-sync-mode"}}},clickable:{module:"clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]}}},normalize:{module:"normalize",description:"Normalizes clickable wrappers by keeping either button or link based on href validity",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},dupe:{module:"dupe",description:"Duplicates elements or their children based on specified modes",attributes:{elements:{wrapper:{primary:"data-hs-dupe",aliases:[]}},properties:{count:"data-hs-dupe-count",hidden:"data-hs-dupe-hidden",noSelect:"data-hs-dupe-no-select"}},modes:{child:"Duplicates the first direct child element",self:"Duplicates the element itself as a sibling"},modifiers:{hidden:"Adds aria-hidden='true' to clones for accessibility",noSelect:"Adds user-select: none to clones to prevent text selection"},limits:{maxCount:20}}},structure:{"year-replacement":{module:"year-replacement",attributes:{placeholders:{year:"{{year}}",month:"{{month}}"}}},toc:{module:"toc",description:"Table of contents with heading links and optional progress bar",attributes:{elements:{content:{primary:"data-hs-toc='content'",aliases:[]},list:{primary:"data-hs-toc='list'",aliases:[]}}},"progress-bar":{module:"progress-bar",attributes:{elements:{wrapper:{primary:"data-hs-toc-progress='wrapper'",aliases:[]},element:{primary:"data-hs-toc-progress='element'",aliases:[]}}}}},pagination:{module:"pagination",attributes:{elements:{wrapper:{primary:"data-hs-pagination='wrapper'",aliases:[]},list:{primary:"data-hs-pagination='list'",aliases:[]},controls:{primary:"data-hs-pagination='controls'",aliases:[]},previous:{primary:"data-hs-pagination='previous'",aliases:[]},next:{primary:"data-hs-pagination='next'",aliases:[]},counter:{primary:"data-hs-pagination='counter'",aliases:[]},dots:{primary:"data-hs-pagination='dots'",aliases:[]}}}},"site-settings":{module:"site-settings",attributes:{elements:{wrapper:{primary:"data-site-settings-element='wrapper'",aliases:[]},list:{primary:"data-site-settings-element='list'",aliases:[]},setting:{primary:"data-site-settings",aliases:[]},hide:{primary:"data-site-settings-hide",aliases:[]}}}},form:{honeypot:{module:"honeypot",attributes:{elements:{"form-handler":{primary:"data-hs-form='form-handler'",aliases:[]}}}},range:{module:"range",attributes:{elements:{wrapper:{primary:"data-hs-form-range='wrapper'",aliases:[]},output:{primary:"data-hs-form-range='output'",aliases:[]}}}},test:{module:"form-test",attributes:{elements:{wrapper:{primary:"data-hs-form-test='wrapper'",aliases:[]},info:{primary:"data-hs-form-test='info'",aliases:[]}}}},select:{module:"select",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}},states:{module:"select-states",attributes:{elements:{states:{primary:"data-hs-form-select='states'",aliases:[]}}}},"custom-select":{module:"select-custom",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}}}}}},default:{transition:{module:"transition",attributes:{elements:{element:{primary:"data-hs-transition='element'",aliases:[]},exitTrigger:{primary:"data-hs-transition-exit-trigger",aliases:[]},enterTrigger:{primary:"data-hs-transition-enter-trigger",aliases:[]},namespace:{primary:"data-hs-transition-namespace",aliases:[]},exitTime:{primary:"data-hs-exit-time",aliases:[]},enterTime:{primary:"data-hs-enter-time",aliases:[]},exitDelay:{primary:"data-hs-exit-delay",aliases:[]},enterDelay:{primary:"data-hs-enter-delay",aliases:[]}}}},"smooth-scroll":{module:"smooth-scroll",attributes:{elements:{},note:"This module auto-detects anchor links (a[href^='#']) and does not require data attributes"}},accordion:{module:"accordion",attributes:{elements:{wrapper:{primary:"data-hs-accordion='wrapper'",aliases:[]},toggle:{primary:"data-hs-accordion='toggle'",aliases:[]},content:{primary:"data-hs-accordion='content'",aliases:[]},state:{primary:"data-hs-accordion-text='state'",aliases:[]}},properties:{default:"data-hs-accordion-default",open:"data-hs-accordion-open",closed:"data-hs-accordion-closed"}}},comparison:{module:"comparison",attributes:{elements:{wrapper:{primary:"data-hs-comparison='wrapper'",aliases:[]},"template-list":{primary:"data-hs-comparison-template='list'",aliases:[]},"template-item":{primary:"data-hs-comparison-template='item'",aliases:[]},"template-name":{primary:"data-hs-comparison-template='name'",aliases:[]},"template-description":{primary:"data-hs-comparison-template='description'",aliases:[]},"template-before-image":{primary:"data-hs-comparison-template='before-image'",aliases:[]},"template-after-image":{primary:"data-hs-comparison-template='after-image'",aliases:[]},name:{primary:"data-hs-comparison='name'",aliases:[]},description:{primary:"data-hs-comparison='description'",aliases:[]},"image-wrapper":{primary:"data-hs-comparison='image-wrapper'",aliases:[]},"before-image":{primary:"data-hs-comparison-image='before'",aliases:[]},"after-image":{primary:"data-hs-comparison-image='after'",aliases:[]},slider:{primary:"data-hs-comparison='slider'",aliases:[]},pagination:{primary:"data-hs-comparison='pagination'",aliases:[]}},properties:{modeType:"data-hs-comparison-mode",navType:"data-hs-comparison-nav"}}},marquee:{module:"marquee",attributes:{elements:{wrapper:{primary:"data-hs-marquee='wrapper'",aliases:[]}},properties:{direction:"data-hs-marquee-direction",duration:"data-hs-marquee-duration",scrollMultiplier:"data-hs-marquee-scroll",type:"data-hs-marquee-type"}},defaults:{duration:"25",scrollMultiplier:"0"}},navbar:{module:"navbar",description:"Main navigation orchestrator with modular functions",attributes:{elements:{wrapper:{primary:"data-hs-nav='wrapper'",aliases:[]},"skip-link":{primary:"data-hs-nav='skip-link'",aliases:[]}}},dropdown:{module:"dropdown",description:"Navigation dropdown with hover or click behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-dropdown='wrapper'",aliases:[]},list:{primary:"data-hs-nav-dropdown='list'",aliases:[]}},properties:{type:"data-hs-nav-dropdown-type"}},types:{hover:"Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",click:"Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"}},menu:{module:"menu",description:"Mobile menu button and modal behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-menu='wrapper'",aliases:[]},button:{primary:"data-hs-nav-menu='button'",aliases:[]}}}},"arrow-navigation":{module:"arrow-navigation",description:"Keyboard arrow navigation for desktop navbar and mobile menu"}}},animations:{module:"animations",description:"Conditionally loaded GSAP animations based on DOM presence",counter:{module:"counter",attributes:{elements:{wrapper:{primary:"data-hs-counter='wrapper'",aliases:[]},counter:{primary:"data-hs-anim='counter'",aliases:[]}}}}}},s=t._global.apiName;(async()=>{if(window[s]&&!Array.isArray(window[s])&&window[s].loaded)return;document.documentElement.classList.add(t._global.classes.initialized);const e=Array.isArray(window[s])?window[s]:[],r={normalize:()=>a(()=>import("./assets/normalize-DWI4olFS.js"),__vite__mapDeps([0,1,2])),structure:()=>a(()=>import("./assets/structure--7b3v7AH.js"),__vite__mapDeps([3,1,2,4])),default:()=>a(()=>import("./assets/default-CZ6vle49.js"),__vite__mapDeps([5,1,2,4])),animations:()=>a(()=>import("./assets/animations-igIF6V0K.js"),[])};let i=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===i.length&&(i=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(e=>{const a=e.src,t=import.meta.url,s=a.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],r=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return s&&r&&s.split("@")[0]===r.split("@")[0]}));const o={isSPA:i.some(e=>"true"===e.getAttribute("data-hs-spa"))},n={normalize:{modules:["normalize"],parallel:!1},structure:{modules:["structure"],parallel:!1},default:{modules:["default","animations"],parallel:!0,waitForIx3:!0}},l=async e=>{const a=window[s];if(a.process.has(e))return a.modules[e]?.loading;a.process.add(e);const t=a.modules[e]||{};let i;a.modules[e]=t,t.loading=new Promise((e,a)=>{t.resolve=e,t.reject=a});try{const{init:s}=await r[e](),o=await s()||{};i=o.destroy;const n=o.result;return t.destroy=()=>{i?.(),a.process.delete(e)},t.restart=()=>{t.destroy?.(),a.load(e)},t.resolve?.(n),delete t.resolve,delete t.reject,n}catch(o){throw i?.(),t.reject?.(o),a.process.delete(e),o}},d=async e=>{const a=n[e];if(await Promise.allSettled(a.modules.map(e=>r[e]())),a.parallel){const e=a.modules.map(e=>l(e));await Promise.allSettled(e)}else for(const t of a.modules)await l(t)},m=async()=>new Promise(e=>{const a=()=>{document.documentElement.classList.contains("w-mod-ix3")?e(!0):setTimeout(a,50)};a()}),p=async()=>{await d("normalize"),await d("structure"),n.default.waitForIx3&&await m(),await d("default"),(()=>{const e=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(e)})()},c=[];window[s]={scripts:i,settings:o,modules:{},process:new Set,load:l,loaded:!1,push(...e){for(const[a,t]of e)"function"==typeof t?this.modules[a]?.loading?.then(t):this.load(a)},destroy(){for(const e in this.modules)this.modules[e]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await p(),await m(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(e=>{e.querySelectorAll("script[data-hs-module]").forEach(e=>{const a=e.getAttribute("data-hs-module-type"),t=e.getAttribute("data-hs-module");if(a&&t){const e=`data-hs-${a}-${t}`;r[e]&&this.load(e)}})})},afterReady(e){"function"==typeof e&&(this.loaded?e():c.push(e))},status(e){return e?{loaded:!!this.modules[e],loading:this.process.has(e)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:n}}};(async()=>{window[s].push(...e),await p(),await m(),window[s].loaded=!0,c.forEach(e=>{try{e()}catch{}}),c.length=0})().catch(()=>{})})();export{a as _,t as c};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-normalize-CTwtG5-a.js","assets/hs-attributeSelector-6pGcDBo-.js","assets/hs-modalManager-H_YegPAO.js","assets/hs-utils-CKm6QhLw.js","assets/hs-structure-DhNix64P.js","assets/hs-orchestrator-J8b7XRk1.js","assets/hs-default-CLmDRb9d.js","assets/hs-cssVariables-BjuwJfDJ.js","assets/hs-animations-BDMqlbof.js"])))=>i.map(i=>d[i]);
2
+ const a={},e=function(e,t,s){let r=Promise.resolve();if(t&&t.length>0){let e=function(a){return Promise.all(a.map(a=>Promise.resolve(a).then(a=>({status:"fulfilled",value:a}),a=>({status:"rejected",reason:a}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),i=s?.nonce||s?.getAttribute("nonce");r=e(t.map(e=>{if((e=function(a){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.24/dist/"+a}(e))in a)return;a[e]=!0;const t=e.endsWith(".css"),s=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${s}`))return;const r=document.createElement("link");return r.rel=t?"stylesheet":"modulepreload",t||(r.as="script"),r.crossOrigin="",r.href=e,i&&r.setAttribute("nonce",i),document.head.appendChild(r),t?new Promise((a,t)=>{r.addEventListener("load",a),r.addEventListener("error",()=>t(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function i(a){const e=new Event("vite:preloadError",{cancelable:!0});if(e.payload=a,window.dispatchEvent(e),!e.defaultPrevented)throw a}return r.then(a=>{for(const e of a||[])"rejected"===e.status&&i(e.reason);return e().catch(i)})},t={_global:{version:"2.0.0",apiName:"hsmain",attributes:{height:"data-hs-height",heightValue:"element",heightDuration:"data-hs-height-duration",heightEase:"data-hs-height-ease",moduleType:"data-hs-module-type",module:"data-hs-module"},classes:{modalOpen:"hs-modal-open",overflowHidden:"u-overflow-hidden",initialized:"hs-main",displayContents:"u-display-contents",active:"is-active",gsap:"hs-gsap"},cssVars:{prefix:"--_hs---",state:{name:"state",values:{active:"1",inactive:"0"}},clip:{name:"clip"},scrollOffset:{name:"scroll-offset"}},clickable:{module:"global-clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},normalize:{sync:{module:"sync",description:"Syncs collection list data to static lists with matching structure",attributes:{elements:{source:{primary:"data-hs-sync='source'",aliases:[]},target:{primary:"data-hs-sync='target'",aliases:[]},item:{primary:"data-hs-sync='item'",aliases:[]},ignore:{primary:"data-hs-sync='ignore'",aliases:[]}},properties:{syncId:"data-hs-sync-id",syncField:"data-hs-sync-field",syncMode:"data-hs-sync-mode"}}},clickable:{module:"clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]}}},normalize:{module:"normalize",description:"Normalizes clickable wrappers by keeping either button or link based on href validity",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},dupe:{module:"dupe",description:"Duplicates elements or their children based on specified modes",attributes:{elements:{wrapper:{primary:"data-hs-dupe",aliases:[]}},properties:{count:"data-hs-dupe-count",hidden:"data-hs-dupe-hidden",noSelect:"data-hs-dupe-no-select"}},modes:{child:"Duplicates the first direct child element",self:"Duplicates the element itself as a sibling"},modifiers:{hidden:"Adds aria-hidden='true' to clones for accessibility",noSelect:"Adds user-select: none to clones to prevent text selection"},limits:{maxCount:20}}},structure:{"year-replacement":{module:"year-replacement",attributes:{placeholders:{year:"{{year}}",month:"{{month}}"}}},toc:{module:"toc",description:"Table of contents with heading links and optional progress bar",attributes:{elements:{content:{primary:"data-hs-toc='content'",aliases:[]},list:{primary:"data-hs-toc='list'",aliases:[]}}},"progress-bar":{module:"progress-bar",attributes:{elements:{wrapper:{primary:"data-hs-toc-progress='wrapper'",aliases:[]},element:{primary:"data-hs-toc-progress='element'",aliases:[]}}}}},pagination:{module:"pagination",attributes:{elements:{wrapper:{primary:"data-hs-pagination='wrapper'",aliases:[]},list:{primary:"data-hs-pagination='list'",aliases:[]},controls:{primary:"data-hs-pagination='controls'",aliases:[]},previous:{primary:"data-hs-pagination='previous'",aliases:[]},next:{primary:"data-hs-pagination='next'",aliases:[]},counter:{primary:"data-hs-pagination='counter'",aliases:[]},dots:{primary:"data-hs-pagination='dots'",aliases:[]}},properties:{show:"data-hs-pagination-show",showMobile:"data-hs-pagination-show-mobile"}}},comparison:{module:"comparison",attributes:{elements:{wrapper:{primary:"data-hs-comparison='wrapper'",aliases:[]},"template-list":{primary:"data-hs-comparison-template='list'",aliases:[]},"template-item":{primary:"data-hs-comparison-template='item'",aliases:[]},"template-name":{primary:"data-hs-comparison-template='name'",aliases:[]},"template-description":{primary:"data-hs-comparison-template='description'",aliases:[]},"template-before-image":{primary:"data-hs-comparison-template='before-image'",aliases:[]},"template-after-image":{primary:"data-hs-comparison-template='after-image'",aliases:[]},name:{primary:"data-hs-comparison='name'",aliases:[]},description:{primary:"data-hs-comparison='description'",aliases:[]},"image-wrapper":{primary:"data-hs-comparison='image-wrapper'",aliases:[]},"before-image":{primary:"data-hs-comparison-image='before'",aliases:[]},"after-image":{primary:"data-hs-comparison-image='after'",aliases:[]},slider:{primary:"data-hs-comparison='slider'",aliases:[]},pagination:{primary:"data-hs-comparison='pagination'",aliases:[]}},properties:{modeType:"data-hs-comparison-mode",navType:"data-hs-comparison-nav"}}},tabs:{module:"tabs",description:"Accessible tab system with autoplay, animations, and keyboard navigation",attributes:{elements:{wrapper:{primary:"data-hs-tab='wrapper'",aliases:[]},links:{primary:"data-hs-tab='links'",aliases:[]},list:{primary:"data-hs-tab='list'",aliases:[]}},properties:{autoplay:"data-hs-tab-autoplay",duration:"data-hs-tab-duration",hover:"data-hs-tab-hover",animation:"data-hs-tab-animation",animationDuration:"data-hs-tab-animation-duration",controls:"data-hs-tab-controls"}},cssVars:{progress:"progress"}},"site-settings":{module:"site-settings",attributes:{elements:{wrapper:{primary:"data-site-settings-element='wrapper'",aliases:[]},list:{primary:"data-site-settings-element='list'",aliases:[]},setting:{primary:"data-site-settings",aliases:[]},hide:{primary:"data-site-settings-hide",aliases:[]}}}},form:{honeypot:{module:"honeypot",attributes:{elements:{"form-handler":{primary:"data-hs-form='form-handler'",aliases:[]}}}},range:{module:"range",attributes:{elements:{wrapper:{primary:"data-hs-form-range='wrapper'",aliases:[]},output:{primary:"data-hs-form-range='output'",aliases:[]}}},cssVars:{progress:"progress"}},test:{module:"form-test",attributes:{elements:{wrapper:{primary:"data-hs-form-test='wrapper'",aliases:[]},info:{primary:"data-hs-form-test='info'",aliases:[]}}}},select:{module:"select",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}},states:{module:"select-states",attributes:{elements:{states:{primary:"data-hs-form-select='states'",aliases:[]}}}},"custom-select":{module:"select-custom",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}}}}}},default:{"smooth-scroll":{module:"smooth-scroll",attributes:{elements:{"offset-proxy":{primary:"data-hs-scroll-offset='proxy'",aliases:[]}},note:"Auto-detects anchor links (a[href^='#']). Optional: Use data-hs-scroll-offset='proxy' on an element to set scroll offset based on its offsetTop"}},accordion:{module:"accordion",attributes:{elements:{wrapper:{primary:"data-hs-accordion='wrapper'",aliases:[]},toggle:{primary:"data-hs-accordion='toggle'",aliases:[]},content:{primary:"data-hs-accordion='content'",aliases:[]},state:{primary:"data-hs-accordion-text='state'",aliases:[]}},properties:{default:"data-hs-accordion-default",open:"data-hs-accordion-open",closed:"data-hs-accordion-closed"}}},navbar:{module:"navbar",description:"Main navigation orchestrator with modular functions",attributes:{elements:{wrapper:{primary:"data-hs-nav='wrapper'",aliases:[]},"skip-link":{primary:"data-hs-nav='skip-link'",aliases:[]}}},dropdown:{module:"dropdown",description:"Navigation dropdown with hover or click behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-dropdown='wrapper'",aliases:[]},list:{primary:"data-hs-nav-dropdown='list'",aliases:[]}},properties:{type:"data-hs-nav-dropdown-type"}},types:{hover:"Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",click:"Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"}},menu:{module:"menu",description:"Mobile menu button and modal behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-menu='wrapper'",aliases:[]},button:{primary:"data-hs-nav-menu='button'",aliases:[]}}}},"arrow-navigation":{module:"arrow-navigation",description:"Keyboard arrow navigation for desktop navbar and mobile menu"}}},animations:{transition:{module:"transition",attributes:{elements:{wrapper:{primary:"data-hs-transition='wrapper'",aliases:["data-hs-transition='element'"]},exitTrigger:{primary:"data-hs-transition-exit-trigger",aliases:[]},enterTrigger:{primary:"data-hs-transition-enter-trigger",aliases:[]},trigger:{primary:"data-hs-transition-trigger",aliases:[]},namespace:{primary:"data-hs-transition-namespace",aliases:[]},exitTime:{primary:"data-hs-transition-exit-time",aliases:["data-hs-exit-time"]},firstDelay:{primary:"data-hs-transition-first-delay",aliases:["data-hs-delay"]}}}}}},s=t._global.apiName;(async()=>{if(window[s]&&!Array.isArray(window[s])&&window[s].loaded)return;document.documentElement.classList.add(t._global.classes.initialized);const a=Array.isArray(window[s])?window[s]:[],r={normalize:()=>e(()=>import("./assets/hs-normalize-CTwtG5-a.js"),__vite__mapDeps([0,1,2,3])),structure:()=>e(()=>import("./assets/hs-structure-DhNix64P.js"),__vite__mapDeps([4,1,2,5])),default:()=>e(()=>import("./assets/hs-default-CLmDRb9d.js"),__vite__mapDeps([6,1,2,3,7])),animations:()=>e(()=>import("./assets/hs-animations-BDMqlbof.js"),__vite__mapDeps([8,2,5]))};let i=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===i.length&&(i=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(a=>{const e=a.src,t=import.meta.url,s=e.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],r=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return s&&r&&s.split("@")[0]===r.split("@")[0]}));const o={isSPA:i.some(a=>"true"===a.getAttribute("data-hs-spa"))},n={normalize:{modules:["normalize"],parallel:!1},structure:{modules:["structure"],parallel:!1},default:{modules:["default","animations"],parallel:!0}},l=async a=>{const e=window[s];if(e.process.has(a))return e.modules[a]?.loading;e.process.add(a);const t=e.modules[a]||{};let i;e.modules[a]=t,t.loading=new Promise((a,e)=>{t.resolve=a,t.reject=e});try{const{init:s}=await r[a](),o=await s()||{};i=o.destroy;const n=o.result;return t.destroy=()=>{i?.(),e.process.delete(a)},t.restart=()=>{t.destroy?.(),e.load(a)},t.resolve?.(n),delete t.resolve,delete t.reject,n}catch(o){throw i?.(),t.reject?.(o),e.process.delete(a),o}},d=async a=>{const e=n[a];if(e.parallel){const a=e.modules.map(a=>l(a));await Promise.allSettled(a)}else for(const t of e.modules)await l(t)},p=async()=>{await Promise.allSettled([r.normalize(),r.structure(),r.default(),r.animations()]),await d("normalize"),await d("structure"),await d("default"),(()=>{const a=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(a)})()},m=[];window[s]={scripts:i,settings:o,modules:{},process:new Set,load:l,loaded:!1,push(...a){for(const[e,t]of a)"function"==typeof t?this.modules[e]?.loading?.then(t):this.load(e)},destroy(){for(const a in this.modules)this.modules[a]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await p(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(a=>{a.querySelectorAll("script[data-hs-module]").forEach(a=>{const e=a.getAttribute("data-hs-module-type"),t=a.getAttribute("data-hs-module");if(e&&t){const a=`data-hs-${e}-${t}`;r[a]&&this.load(a)}})})},afterReady(a){"function"==typeof a&&(this.loaded?a():m.push(a))},status(a){return a?{loaded:!!this.modules[a],loading:this.process.has(a)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:n}}};(async()=>{window[s].push(...a),await p(),window[s].loaded=!0,m.forEach(a=>{try{a()}catch{}}),m.length=0})().catch(()=>{})})();export{e as _,t as c};
3
3
  //# sourceMappingURL=main.js.map
package/dist/main.js. CHANGED
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/normalize-DWI4olFS.js","assets/modalManager-LtDi9OJz.js","assets/utils-DA-PANmk.js","assets/structure--7b3v7AH.js","assets/cssVariables-n9wQSSYb.js","assets/default-CZ6vle49.js"])))=>i.map(i=>d[i]);
2
- const e={},a=function(a,t,s){let r=Promise.resolve();if(t&&t.length>0){let a=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),i=s?.nonce||s?.getAttribute("nonce");r=a(t.map(a=>{if((a=function(e){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.22/dist/"+e}(a))in e)return;e[a]=!0;const t=a.endsWith(".css"),s=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${a}"]${s}`))return;const r=document.createElement("link");return r.rel=t?"stylesheet":"modulepreload",t||(r.as="script"),r.crossOrigin="",r.href=a,i&&r.setAttribute("nonce",i),document.head.appendChild(r),t?new Promise((e,t)=>{r.addEventListener("load",e),r.addEventListener("error",()=>t(new Error(`Unable to preload CSS for ${a}`)))}):void 0}))}function i(e){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=e,window.dispatchEvent(a),!a.defaultPrevented)throw e}return r.then(e=>{for(const a of e||[])"rejected"===a.status&&i(a.reason);return a().catch(i)})},t={_global:{version:"2.0.0",apiName:"hsmain",attributes:{height:"data-hs-height",heightValue:"element",heightDuration:"data-hs-height-duration",heightEase:"data-hs-height-ease",moduleType:"data-hs-module-type",module:"data-hs-module"},classes:{modalOpen:"hs-modal-open",overflowHidden:"u-overflow-hidden",initialized:"hs-main",displayContents:"u-display-contents",active:"is-active",gsap:"hs-gsap"},cssVars:{prefix:"--_hs---",state:{name:"state",values:{active:"1",inactive:"0"}},clip:{name:"clip"}},clickable:{module:"global-clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},normalize:{sync:{module:"sync",description:"Syncs collection list data to static lists with matching structure",attributes:{elements:{source:{primary:"data-hs-sync='source'",aliases:[]},target:{primary:"data-hs-sync='target'",aliases:[]},item:{primary:"data-hs-sync='item'",aliases:[]},ignore:{primary:"data-hs-sync='ignore'",aliases:[]}},properties:{syncId:"data-hs-sync-id",syncField:"data-hs-sync-field",syncMode:"data-hs-sync-mode"}}},clickable:{module:"clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]}}},normalize:{module:"normalize",description:"Normalizes clickable wrappers by keeping either button or link based on href validity",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},dupe:{module:"dupe",description:"Duplicates elements or their children based on specified modes",attributes:{elements:{wrapper:{primary:"data-hs-dupe",aliases:[]}},properties:{count:"data-hs-dupe-count",hidden:"data-hs-dupe-hidden",noSelect:"data-hs-dupe-no-select"}},modes:{child:"Duplicates the first direct child element",self:"Duplicates the element itself as a sibling"},modifiers:{hidden:"Adds aria-hidden='true' to clones for accessibility",noSelect:"Adds user-select: none to clones to prevent text selection"},limits:{maxCount:20}}},structure:{"year-replacement":{module:"year-replacement",attributes:{placeholders:{year:"{{year}}",month:"{{month}}"}}},toc:{module:"toc",description:"Table of contents with heading links and optional progress bar",attributes:{elements:{content:{primary:"data-hs-toc='content'",aliases:[]},list:{primary:"data-hs-toc='list'",aliases:[]}}},"progress-bar":{module:"progress-bar",attributes:{elements:{wrapper:{primary:"data-hs-toc-progress='wrapper'",aliases:[]},element:{primary:"data-hs-toc-progress='element'",aliases:[]}}}}},pagination:{module:"pagination",attributes:{elements:{wrapper:{primary:"data-hs-pagination='wrapper'",aliases:[]},list:{primary:"data-hs-pagination='list'",aliases:[]},controls:{primary:"data-hs-pagination='controls'",aliases:[]},previous:{primary:"data-hs-pagination='previous'",aliases:[]},next:{primary:"data-hs-pagination='next'",aliases:[]},counter:{primary:"data-hs-pagination='counter'",aliases:[]},dots:{primary:"data-hs-pagination='dots'",aliases:[]}}}},"site-settings":{module:"site-settings",attributes:{elements:{wrapper:{primary:"data-site-settings-element='wrapper'",aliases:[]},list:{primary:"data-site-settings-element='list'",aliases:[]},setting:{primary:"data-site-settings",aliases:[]},hide:{primary:"data-site-settings-hide",aliases:[]}}}},form:{honeypot:{module:"honeypot",attributes:{elements:{"form-handler":{primary:"data-hs-form='form-handler'",aliases:[]}}}},range:{module:"range",attributes:{elements:{wrapper:{primary:"data-hs-form-range='wrapper'",aliases:[]},output:{primary:"data-hs-form-range='output'",aliases:[]}}}},test:{module:"form-test",attributes:{elements:{wrapper:{primary:"data-hs-form-test='wrapper'",aliases:[]},info:{primary:"data-hs-form-test='info'",aliases:[]}}}},select:{module:"select",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}},states:{module:"select-states",attributes:{elements:{states:{primary:"data-hs-form-select='states'",aliases:[]}}}},"custom-select":{module:"select-custom",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}}}}}},default:{transition:{module:"transition",attributes:{elements:{element:{primary:"data-hs-transition='element'",aliases:[]},exitTrigger:{primary:"data-hs-transition-exit-trigger",aliases:[]},enterTrigger:{primary:"data-hs-transition-enter-trigger",aliases:[]},namespace:{primary:"data-hs-transition-namespace",aliases:[]},exitTime:{primary:"data-hs-exit-time",aliases:[]},enterTime:{primary:"data-hs-enter-time",aliases:[]},exitDelay:{primary:"data-hs-exit-delay",aliases:[]},enterDelay:{primary:"data-hs-enter-delay",aliases:[]}}}},"smooth-scroll":{module:"smooth-scroll",attributes:{elements:{},note:"This module auto-detects anchor links (a[href^='#']) and does not require data attributes"}},accordion:{module:"accordion",attributes:{elements:{wrapper:{primary:"data-hs-accordion='wrapper'",aliases:[]},toggle:{primary:"data-hs-accordion='toggle'",aliases:[]},content:{primary:"data-hs-accordion='content'",aliases:[]},state:{primary:"data-hs-accordion-text='state'",aliases:[]}},properties:{default:"data-hs-accordion-default",open:"data-hs-accordion-open",closed:"data-hs-accordion-closed"}}},comparison:{module:"comparison",attributes:{elements:{wrapper:{primary:"data-hs-comparison='wrapper'",aliases:[]},"template-list":{primary:"data-hs-comparison-template='list'",aliases:[]},"template-item":{primary:"data-hs-comparison-template='item'",aliases:[]},"template-name":{primary:"data-hs-comparison-template='name'",aliases:[]},"template-description":{primary:"data-hs-comparison-template='description'",aliases:[]},"template-before-image":{primary:"data-hs-comparison-template='before-image'",aliases:[]},"template-after-image":{primary:"data-hs-comparison-template='after-image'",aliases:[]},name:{primary:"data-hs-comparison='name'",aliases:[]},description:{primary:"data-hs-comparison='description'",aliases:[]},"image-wrapper":{primary:"data-hs-comparison='image-wrapper'",aliases:[]},"before-image":{primary:"data-hs-comparison-image='before'",aliases:[]},"after-image":{primary:"data-hs-comparison-image='after'",aliases:[]},slider:{primary:"data-hs-comparison='slider'",aliases:[]},pagination:{primary:"data-hs-comparison='pagination'",aliases:[]}},properties:{modeType:"data-hs-comparison-mode",navType:"data-hs-comparison-nav"}}},marquee:{module:"marquee",attributes:{elements:{wrapper:{primary:"data-hs-marquee='wrapper'",aliases:[]}},properties:{direction:"data-hs-marquee-direction",duration:"data-hs-marquee-duration",scrollMultiplier:"data-hs-marquee-scroll",type:"data-hs-marquee-type"}},defaults:{duration:"25",scrollMultiplier:"0"}},navbar:{module:"navbar",description:"Main navigation orchestrator with modular functions",attributes:{elements:{wrapper:{primary:"data-hs-nav='wrapper'",aliases:[]},"skip-link":{primary:"data-hs-nav='skip-link'",aliases:[]}}},dropdown:{module:"dropdown",description:"Navigation dropdown with hover or click behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-dropdown='wrapper'",aliases:[]},list:{primary:"data-hs-nav-dropdown='list'",aliases:[]}},properties:{type:"data-hs-nav-dropdown-type"}},types:{hover:"Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",click:"Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"}},menu:{module:"menu",description:"Mobile menu button and modal behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-menu='wrapper'",aliases:[]},button:{primary:"data-hs-nav-menu='button'",aliases:[]}}}},"arrow-navigation":{module:"arrow-navigation",description:"Keyboard arrow navigation for desktop navbar and mobile menu"}}},animations:{module:"animations",description:"Conditionally loaded GSAP animations based on DOM presence",counter:{module:"counter",attributes:{elements:{wrapper:{primary:"data-hs-counter='wrapper'",aliases:[]},counter:{primary:"data-hs-anim='counter'",aliases:[]}}}}}},s=t._global.apiName;(async()=>{if(window[s]&&!Array.isArray(window[s])&&window[s].loaded)return;document.documentElement.classList.add(t._global.classes.initialized);const e=Array.isArray(window[s])?window[s]:[],r={normalize:()=>a(()=>import("./assets/normalize-DWI4olFS.js"),__vite__mapDeps([0,1,2])),structure:()=>a(()=>import("./assets/structure--7b3v7AH.js"),__vite__mapDeps([3,1,2,4])),default:()=>a(()=>import("./assets/default-CZ6vle49.js"),__vite__mapDeps([5,1,2,4])),animations:()=>a(()=>import("./assets/animations-igIF6V0K.js"),[])};let i=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===i.length&&(i=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(e=>{const a=e.src,t=import.meta.url,s=a.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],r=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return s&&r&&s.split("@")[0]===r.split("@")[0]}));const o={isSPA:i.some(e=>"true"===e.getAttribute("data-hs-spa"))},n={normalize:{modules:["normalize"],parallel:!1},structure:{modules:["structure"],parallel:!1},default:{modules:["default","animations"],parallel:!0,waitForIx3:!0}},l=async e=>{const a=window[s];if(a.process.has(e))return a.modules[e]?.loading;a.process.add(e);const t=a.modules[e]||{};let i;a.modules[e]=t,t.loading=new Promise((e,a)=>{t.resolve=e,t.reject=a});try{const{init:s}=await r[e](),o=await s()||{};i=o.destroy;const n=o.result;return t.destroy=()=>{i?.(),a.process.delete(e)},t.restart=()=>{t.destroy?.(),a.load(e)},t.resolve?.(n),delete t.resolve,delete t.reject,n}catch(o){throw i?.(),t.reject?.(o),a.process.delete(e),o}},d=async e=>{const a=n[e];if(await Promise.allSettled(a.modules.map(e=>r[e]())),a.parallel){const e=a.modules.map(e=>l(e));await Promise.allSettled(e)}else for(const t of a.modules)await l(t)},m=async()=>new Promise(e=>{const a=()=>{document.documentElement.classList.contains("w-mod-ix3")?e(!0):setTimeout(a,50)};a()}),p=async()=>{await d("normalize"),await d("structure"),n.default.waitForIx3&&await m(),await d("default"),(()=>{const e=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(e)})()},c=[];window[s]={scripts:i,settings:o,modules:{},process:new Set,load:l,loaded:!1,push(...e){for(const[a,t]of e)"function"==typeof t?this.modules[a]?.loading?.then(t):this.load(a)},destroy(){for(const e in this.modules)this.modules[e]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await p(),await m(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(e=>{e.querySelectorAll("script[data-hs-module]").forEach(e=>{const a=e.getAttribute("data-hs-module-type"),t=e.getAttribute("data-hs-module");if(a&&t){const e=`data-hs-${a}-${t}`;r[e]&&this.load(e)}})})},afterReady(e){"function"==typeof e&&(this.loaded?e():c.push(e))},status(e){return e?{loaded:!!this.modules[e],loading:this.process.has(e)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:n}}};(async()=>{window[s].push(...e),await p(),await m(),window[s].loaded=!0,c.forEach(e=>{try{e()}catch{}}),c.length=0})().catch(()=>{})})();export{a as _,t as c};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hs-normalize-CTwtG5-a.js","assets/hs-attributeSelector-6pGcDBo-.js","assets/hs-modalManager-H_YegPAO.js","assets/hs-utils-CKm6QhLw.js","assets/hs-structure-DhNix64P.js","assets/hs-orchestrator-J8b7XRk1.js","assets/hs-default-CLmDRb9d.js","assets/hs-cssVariables-BjuwJfDJ.js","assets/hs-animations-BDMqlbof.js"])))=>i.map(i=>d[i]);
2
+ const a={},e=function(e,t,s){let r=Promise.resolve();if(t&&t.length>0){let e=function(a){return Promise.all(a.map(a=>Promise.resolve(a).then(a=>({status:"fulfilled",value:a}),a=>({status:"rejected",reason:a}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),i=s?.nonce||s?.getAttribute("nonce");r=e(t.map(e=>{if((e=function(a){return"https://cdn.jsdelivr.net/npm/@hortonstudio/main@1.9.24/dist/"+a}(e))in a)return;a[e]=!0;const t=e.endsWith(".css"),s=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${s}`))return;const r=document.createElement("link");return r.rel=t?"stylesheet":"modulepreload",t||(r.as="script"),r.crossOrigin="",r.href=e,i&&r.setAttribute("nonce",i),document.head.appendChild(r),t?new Promise((a,t)=>{r.addEventListener("load",a),r.addEventListener("error",()=>t(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function i(a){const e=new Event("vite:preloadError",{cancelable:!0});if(e.payload=a,window.dispatchEvent(e),!e.defaultPrevented)throw a}return r.then(a=>{for(const e of a||[])"rejected"===e.status&&i(e.reason);return e().catch(i)})},t={_global:{version:"2.0.0",apiName:"hsmain",attributes:{height:"data-hs-height",heightValue:"element",heightDuration:"data-hs-height-duration",heightEase:"data-hs-height-ease",moduleType:"data-hs-module-type",module:"data-hs-module"},classes:{modalOpen:"hs-modal-open",overflowHidden:"u-overflow-hidden",initialized:"hs-main",displayContents:"u-display-contents",active:"is-active",gsap:"hs-gsap"},cssVars:{prefix:"--_hs---",state:{name:"state",values:{active:"1",inactive:"0"}},clip:{name:"clip"},scrollOffset:{name:"scroll-offset"}},clickable:{module:"global-clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},normalize:{sync:{module:"sync",description:"Syncs collection list data to static lists with matching structure",attributes:{elements:{source:{primary:"data-hs-sync='source'",aliases:[]},target:{primary:"data-hs-sync='target'",aliases:[]},item:{primary:"data-hs-sync='item'",aliases:[]},ignore:{primary:"data-hs-sync='ignore'",aliases:[]}},properties:{syncId:"data-hs-sync-id",syncField:"data-hs-sync-field",syncMode:"data-hs-sync-mode"}}},clickable:{module:"clickable",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]}}},normalize:{module:"normalize",description:"Normalizes clickable wrappers by keeping either button or link based on href validity",attributes:{elements:{wrapper:{primary:"data-hs-clickable='wrapper'",aliases:[]},button:{primary:"data-hs-clickable='button'",aliases:[]}}}}},dupe:{module:"dupe",description:"Duplicates elements or their children based on specified modes",attributes:{elements:{wrapper:{primary:"data-hs-dupe",aliases:[]}},properties:{count:"data-hs-dupe-count",hidden:"data-hs-dupe-hidden",noSelect:"data-hs-dupe-no-select"}},modes:{child:"Duplicates the first direct child element",self:"Duplicates the element itself as a sibling"},modifiers:{hidden:"Adds aria-hidden='true' to clones for accessibility",noSelect:"Adds user-select: none to clones to prevent text selection"},limits:{maxCount:20}}},structure:{"year-replacement":{module:"year-replacement",attributes:{placeholders:{year:"{{year}}",month:"{{month}}"}}},toc:{module:"toc",description:"Table of contents with heading links and optional progress bar",attributes:{elements:{content:{primary:"data-hs-toc='content'",aliases:[]},list:{primary:"data-hs-toc='list'",aliases:[]}}},"progress-bar":{module:"progress-bar",attributes:{elements:{wrapper:{primary:"data-hs-toc-progress='wrapper'",aliases:[]},element:{primary:"data-hs-toc-progress='element'",aliases:[]}}}}},pagination:{module:"pagination",attributes:{elements:{wrapper:{primary:"data-hs-pagination='wrapper'",aliases:[]},list:{primary:"data-hs-pagination='list'",aliases:[]},controls:{primary:"data-hs-pagination='controls'",aliases:[]},previous:{primary:"data-hs-pagination='previous'",aliases:[]},next:{primary:"data-hs-pagination='next'",aliases:[]},counter:{primary:"data-hs-pagination='counter'",aliases:[]},dots:{primary:"data-hs-pagination='dots'",aliases:[]}},properties:{show:"data-hs-pagination-show",showMobile:"data-hs-pagination-show-mobile"}}},comparison:{module:"comparison",attributes:{elements:{wrapper:{primary:"data-hs-comparison='wrapper'",aliases:[]},"template-list":{primary:"data-hs-comparison-template='list'",aliases:[]},"template-item":{primary:"data-hs-comparison-template='item'",aliases:[]},"template-name":{primary:"data-hs-comparison-template='name'",aliases:[]},"template-description":{primary:"data-hs-comparison-template='description'",aliases:[]},"template-before-image":{primary:"data-hs-comparison-template='before-image'",aliases:[]},"template-after-image":{primary:"data-hs-comparison-template='after-image'",aliases:[]},name:{primary:"data-hs-comparison='name'",aliases:[]},description:{primary:"data-hs-comparison='description'",aliases:[]},"image-wrapper":{primary:"data-hs-comparison='image-wrapper'",aliases:[]},"before-image":{primary:"data-hs-comparison-image='before'",aliases:[]},"after-image":{primary:"data-hs-comparison-image='after'",aliases:[]},slider:{primary:"data-hs-comparison='slider'",aliases:[]},pagination:{primary:"data-hs-comparison='pagination'",aliases:[]}},properties:{modeType:"data-hs-comparison-mode",navType:"data-hs-comparison-nav"}}},tabs:{module:"tabs",description:"Accessible tab system with autoplay, animations, and keyboard navigation",attributes:{elements:{wrapper:{primary:"data-hs-tab='wrapper'",aliases:[]},links:{primary:"data-hs-tab='links'",aliases:[]},list:{primary:"data-hs-tab='list'",aliases:[]}},properties:{autoplay:"data-hs-tab-autoplay",duration:"data-hs-tab-duration",hover:"data-hs-tab-hover",animation:"data-hs-tab-animation",animationDuration:"data-hs-tab-animation-duration",controls:"data-hs-tab-controls"}},cssVars:{progress:"progress"}},"site-settings":{module:"site-settings",attributes:{elements:{wrapper:{primary:"data-site-settings-element='wrapper'",aliases:[]},list:{primary:"data-site-settings-element='list'",aliases:[]},setting:{primary:"data-site-settings",aliases:[]},hide:{primary:"data-site-settings-hide",aliases:[]}}}},form:{honeypot:{module:"honeypot",attributes:{elements:{"form-handler":{primary:"data-hs-form='form-handler'",aliases:[]}}}},range:{module:"range",attributes:{elements:{wrapper:{primary:"data-hs-form-range='wrapper'",aliases:[]},output:{primary:"data-hs-form-range='output'",aliases:[]}}},cssVars:{progress:"progress"}},test:{module:"form-test",attributes:{elements:{wrapper:{primary:"data-hs-form-test='wrapper'",aliases:[]},info:{primary:"data-hs-form-test='info'",aliases:[]}}}},select:{module:"select",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}},states:{module:"select-states",attributes:{elements:{states:{primary:"data-hs-form-select='states'",aliases:[]}}}},"custom-select":{module:"select-custom",attributes:{elements:{wrapper:{primary:"data-hs-form-select='wrapper'",aliases:[]},list:{primary:"data-hs-form-select='list'",aliases:[]},button:{primary:"data-hs-form-select='button'",aliases:[]}}}}}}},default:{"smooth-scroll":{module:"smooth-scroll",attributes:{elements:{"offset-proxy":{primary:"data-hs-scroll-offset='proxy'",aliases:[]}},note:"Auto-detects anchor links (a[href^='#']). Optional: Use data-hs-scroll-offset='proxy' on an element to set scroll offset based on its offsetTop"}},accordion:{module:"accordion",attributes:{elements:{wrapper:{primary:"data-hs-accordion='wrapper'",aliases:[]},toggle:{primary:"data-hs-accordion='toggle'",aliases:[]},content:{primary:"data-hs-accordion='content'",aliases:[]},state:{primary:"data-hs-accordion-text='state'",aliases:[]}},properties:{default:"data-hs-accordion-default",open:"data-hs-accordion-open",closed:"data-hs-accordion-closed"}}},navbar:{module:"navbar",description:"Main navigation orchestrator with modular functions",attributes:{elements:{wrapper:{primary:"data-hs-nav='wrapper'",aliases:[]},"skip-link":{primary:"data-hs-nav='skip-link'",aliases:[]}}},dropdown:{module:"dropdown",description:"Navigation dropdown with hover or click behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-dropdown='wrapper'",aliases:[]},list:{primary:"data-hs-nav-dropdown='list'",aliases:[]}},properties:{type:"data-hs-nav-dropdown-type"}},types:{hover:"Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",click:"Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"}},menu:{module:"menu",description:"Mobile menu button and modal behavior",attributes:{elements:{wrapper:{primary:"data-hs-nav-menu='wrapper'",aliases:[]},button:{primary:"data-hs-nav-menu='button'",aliases:[]}}}},"arrow-navigation":{module:"arrow-navigation",description:"Keyboard arrow navigation for desktop navbar and mobile menu"}}},animations:{transition:{module:"transition",attributes:{elements:{wrapper:{primary:"data-hs-transition='wrapper'",aliases:["data-hs-transition='element'"]},exitTrigger:{primary:"data-hs-transition-exit-trigger",aliases:[]},enterTrigger:{primary:"data-hs-transition-enter-trigger",aliases:[]},trigger:{primary:"data-hs-transition-trigger",aliases:[]},namespace:{primary:"data-hs-transition-namespace",aliases:[]},exitTime:{primary:"data-hs-transition-exit-time",aliases:["data-hs-exit-time"]},firstDelay:{primary:"data-hs-transition-first-delay",aliases:["data-hs-delay"]}}}}}},s=t._global.apiName;(async()=>{if(window[s]&&!Array.isArray(window[s])&&window[s].loaded)return;document.documentElement.classList.add(t._global.classes.initialized);const a=Array.isArray(window[s])?window[s]:[],r={normalize:()=>e(()=>import("./assets/hs-normalize-CTwtG5-a.js"),__vite__mapDeps([0,1,2,3])),structure:()=>e(()=>import("./assets/hs-structure-DhNix64P.js"),__vite__mapDeps([4,1,2,5])),default:()=>e(()=>import("./assets/hs-default-CLmDRb9d.js"),__vite__mapDeps([6,1,2,3,7])),animations:()=>e(()=>import("./assets/hs-animations-BDMqlbof.js"),__vite__mapDeps([8,2,5]))};let i=[...document.querySelectorAll(`script[type="module"][src="${import.meta.url}"]`)];0===i.length&&(i=[...document.querySelectorAll('script[type="module"][src*="@hortonstudio/main"]')].filter(a=>{const e=a.src,t=import.meta.url,s=e.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0],r=t.match(/@hortonstudio\/main(@[\d.]+)?/)?.[0];return s&&r&&s.split("@")[0]===r.split("@")[0]}));const o={isSPA:i.some(a=>"true"===a.getAttribute("data-hs-spa"))},n={normalize:{modules:["normalize"],parallel:!1},structure:{modules:["structure"],parallel:!1},default:{modules:["default","animations"],parallel:!0}},l=async a=>{const e=window[s];if(e.process.has(a))return e.modules[a]?.loading;e.process.add(a);const t=e.modules[a]||{};let i;e.modules[a]=t,t.loading=new Promise((a,e)=>{t.resolve=a,t.reject=e});try{const{init:s}=await r[a](),o=await s()||{};i=o.destroy;const n=o.result;return t.destroy=()=>{i?.(),e.process.delete(a)},t.restart=()=>{t.destroy?.(),e.load(a)},t.resolve?.(n),delete t.resolve,delete t.reject,n}catch(o){throw i?.(),t.reject?.(o),e.process.delete(a),o}},d=async a=>{const e=n[a];if(e.parallel){const a=e.modules.map(a=>l(a));await Promise.allSettled(a)}else for(const t of e.modules)await l(t)},p=async()=>{await Promise.allSettled([r.normalize(),r.structure(),r.default(),r.animations()]),await d("normalize"),await d("structure"),await d("default"),(()=>{const a=new CustomEvent("hsmain:dom-ready");window.dispatchEvent(a)})()},m=[];window[s]={scripts:i,settings:o,modules:{},process:new Set,load:l,loaded:!1,push(...a){for(const[e,t]of a)"function"==typeof t?this.modules[e]?.loading?.then(t):this.load(e)},destroy(){for(const a in this.modules)this.modules[a]?.destroy?.()},async reinitialize(){this.loaded=!1,this.destroy(),this.modules={},this.process=new Set,await this.scanForEmbedModules(),await p(),this.loaded=!0},async scanForEmbedModules(){document.querySelectorAll(".w-embed").forEach(a=>{a.querySelectorAll("script[data-hs-module]").forEach(a=>{const e=a.getAttribute("data-hs-module-type"),t=a.getAttribute("data-hs-module");if(e&&t){const a=`data-hs-${e}-${t}`;r[a]&&this.load(a)}})})},afterReady(a){"function"==typeof a&&(this.loaded?a():m.push(a))},status(a){return a?{loaded:!!this.modules[a],loading:this.process.has(a)}:{loaded:Object.keys(this.modules),loading:[...this.process],phases:n}}};(async()=>{window[s].push(...a),await p(),window[s].loaded=!0,m.forEach(a=>{try{a()}catch{}}),m.length=0})().catch(()=>{})})();export{e as _,t as c};
3
3
  //# sourceMappingURL=main.js.map
package/dist/main.js.gz CHANGED
Binary file
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["config","API_NAME","_global","apiName","async","window","Array","isArray","loaded","document","documentElement","classList","add","classes","initialized","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","structure","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","waitForIx3","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","allSettled","map","name","initPromises","checkIx3","contains","setTimeout","initializeInPhases","event","CustomEvent","dispatchEvent","triggerDomReady","readyCallbacks","Set","push","items","callback","this","then","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","catch","initializeHsMain"],"ignoreList":[],"sources":["../src/config.ts","../index.ts"],"sourcesContent":["/**\n * Master configuration with TypeScript type safety\n * Single source of truth for all module configs\n *\n * @version 2.0.0\n */\nimport configData from './config.json';\n\n// TypeScript interfaces for autocomplete and type safety\n\nexport interface AttributeConfig {\n primary: string;\n aliases: string[];\n}\n\nexport interface ModuleConfig {\n module: string;\n description?: string;\n attributes?: {\n elements?: Record<string, AttributeConfig>;\n properties?: Record<string, string>;\n placeholders?: Record<string, string>;\n note?: string;\n };\n modes?: Record<string, string>;\n modifiers?: Record<string, string>;\n limits?: Record<string, number>;\n types?: Record<string, string>;\n defaults?: Record<string, string>;\n}\n\nexport interface GlobalConfig {\n version: string;\n apiName: string;\n attributes: {\n height: string;\n heightValue: string;\n heightDuration: string;\n heightEase: string;\n moduleType: string;\n module: string;\n };\n classes: {\n modalOpen: string;\n overflowHidden: string;\n initialized: string;\n displayContents: string;\n active: string;\n gsap: string;\n };\n cssVars: {\n prefix: string;\n state: {\n name: string;\n values: {\n active: string;\n inactive: string;\n };\n };\n };\n clickable: ModuleConfig;\n}\n\nexport interface Config {\n _global: GlobalConfig;\n normalize: {\n sync: ModuleConfig;\n clickable: ModuleConfig & {\n normalize: ModuleConfig;\n };\n dupe: ModuleConfig;\n };\n structure: {\n 'year-replacement': ModuleConfig;\n toc: ModuleConfig;\n pagination: ModuleConfig;\n 'site-settings': ModuleConfig;\n form: {\n honeypot: ModuleConfig;\n range: ModuleConfig;\n test: ModuleConfig;\n select: ModuleConfig & {\n states: ModuleConfig;\n 'custom-select': ModuleConfig;\n };\n };\n };\n transition: ModuleConfig;\n default: {\n 'smooth-scroll': ModuleConfig;\n accordion: ModuleConfig;\n counter: ModuleConfig;\n comparison: ModuleConfig;\n marquee: ModuleConfig;\n navbar: ModuleConfig & {\n dropdown: ModuleConfig;\n menu: ModuleConfig;\n 'arrow-navigation': ModuleConfig;\n };\n };\n}\n\n// Export typed config\nexport const config = configData as Config;\nexport default config;\n","import config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async () => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n // Add initialized class to HTML element immediately\n document.documentElement.classList.add(config._global.classes.initialized);\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n structure: () => import('./src/modules/structure/structure.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = script.src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 3-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n structure: {\n modules: ['structure'],\n parallel: false, // Must complete before default\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations synchronously\n waitForIx3: true, // Wait for Webflow IX3 before starting\n },\n };\n\n const loadModule = async (moduleName) => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to load and execute a phase\n const executePhase = async (phaseName) => {\n const phase = PHASES[phaseName];\n\n // Download all modules in parallel\n await Promise.allSettled(phase.modules.map((name) => moduleMap[name]()));\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Wait for Webflow IX3 to be ready\n const waitForIx3 = async () => {\n return new Promise((resolve) => {\n const checkIx3 = () => {\n const htmlElement = document.documentElement;\n const hasIx3 = htmlElement.classList.contains('w-mod-ix3');\n\n if (hasIx3) {\n resolve(true);\n } else {\n setTimeout(checkIx3, 50);\n }\n };\n checkIx3();\n });\n };\n\n // Initialize all modules in 3 phases\n const initializeInPhases = async () => {\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Structure (DOM modifications)\n await executePhase('structure');\n\n // Wait for IX3 if needed for Phase 3\n if (PHASES.default.waitForIx3) {\n await waitForIx3();\n }\n\n // Phase 3: Default + Transition (parallel with 50ms transition delay)\n await executePhase('default');\n\n // Trigger DOM ready after everything initialized\n triggerDomReady();\n };\n\n const readyCallbacks = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n // Wait for IX3 to be ready before marking as loaded\n await waitForIx3();\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async () => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n // Wait for IX3 to be ready before firing callbacks\n await waitForIx3();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
1
+ {"version":3,"mappings":"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","names":["config","API_NAME","_global","apiName","async","window","Array","isArray","loaded","document","documentElement","classList","add","classes","initialized","queuedModules","moduleMap","normalize","__vitePreload","import","__VITE_PRELOAD__","structure","default","animations","scripts","querySelectorAll","url","length","filter","script","scriptSrc","src","currentSrc","scriptPackage","match","currentPackage","split","settings","isSPA","some","getAttribute","PHASES","modules","parallel","loadModule","moduleName","instance","process","has","loading","moduleData","destroy","Promise","resolve","reject","init","resultData","initResult","result","delete","restart","load","error","executePhase","phaseName","phase","initPromises","map","name","allSettled","initializeInPhases","event","CustomEvent","dispatchEvent","triggerDomReady","readyCallbacks","Set","push","items","callback","this","then","reinitialize","scanForEmbedModules","forEach","embed","moduleType","moduleKey","afterReady","status","Object","keys","phases","finalize","catch","initializeHsMain"],"ignoreList":[],"sources":["../src/config.ts","../index.ts"],"sourcesContent":["/**\n * Master Configuration\n *\n * Single source of truth for all module configs with TypeScript type safety.\n * Provides autocomplete and type checking for all configuration access.\n */\nimport configData from './config.json';\n\n// TypeScript interfaces for autocomplete and type safety\n\nexport interface AttributeConfig {\n primary: string;\n aliases: string[];\n}\n\nexport interface ModuleConfig {\n module: string;\n description?: string;\n attributes?: {\n elements?: Record<string, AttributeConfig>;\n properties?: Record<string, string>;\n placeholders?: Record<string, string>;\n note?: string;\n };\n modes?: Record<string, string>;\n modifiers?: Record<string, string>;\n limits?: Record<string, number>;\n types?: Record<string, string>;\n defaults?: Record<string, string>;\n}\n\nexport interface GlobalConfig {\n version: string;\n apiName: string;\n attributes: {\n height: string;\n heightValue: string;\n heightDuration: string;\n heightEase: string;\n moduleType: string;\n module: string;\n };\n classes: {\n modalOpen: string;\n overflowHidden: string;\n initialized: string;\n displayContents: string;\n active: string;\n gsap: string;\n };\n cssVars: {\n prefix: string;\n state: {\n name: string;\n values: {\n active: string;\n inactive: string;\n };\n };\n clip: {\n name: string;\n };\n };\n clickable: ModuleConfig;\n}\n\nexport interface Config {\n _global: GlobalConfig;\n normalize?: {\n sync?: ModuleConfig;\n clickable?: ModuleConfig & {\n normalize?: ModuleConfig;\n };\n dupe?: ModuleConfig;\n };\n structure?: {\n 'year-replacement'?: ModuleConfig;\n toc?: ModuleConfig;\n pagination?: ModuleConfig;\n comparison?: ModuleConfig;\n tabs?: ModuleConfig & {\n cssVars?: {\n progress?: string;\n };\n };\n 'site-settings'?: ModuleConfig;\n form?: {\n honeypot?: ModuleConfig;\n range?: ModuleConfig;\n test?: ModuleConfig;\n select?: ModuleConfig & {\n states?: ModuleConfig;\n 'custom-select'?: ModuleConfig;\n };\n };\n };\n transition?: ModuleConfig;\n default?: {\n 'smooth-scroll'?: ModuleConfig;\n accordion?: ModuleConfig;\n counter?: ModuleConfig;\n comparison?: ModuleConfig;\n navbar?: ModuleConfig & {\n dropdown?: ModuleConfig;\n menu?: ModuleConfig;\n 'arrow-navigation'?: ModuleConfig;\n };\n };\n animations?: {\n transition?: ModuleConfig;\n };\n [key: string]: unknown;\n}\n\n// Export typed config\nexport const config = configData as Config;\nexport default config;\n","/**\n * Main Entry Point\n *\n * 3-phase initialization system: Normalize → Structure → Default + Animations.\n * Handles module loading, lifecycle management, and SPA coordination.\n */\nimport config from '@config';\n\nconst API_NAME = config._global.apiName;\n\nconst initializeHsMain = async (): Promise<void> => {\n if (window[API_NAME] && !Array.isArray(window[API_NAME]) && window[API_NAME].loaded) {\n return;\n }\n\n // Add initialized class to HTML element immediately\n document.documentElement.classList.add(config._global.classes.initialized);\n\n const queuedModules = Array.isArray(window[API_NAME]) ? window[API_NAME] : [];\n\n const moduleMap = {\n normalize: () => import('./src/modules/normalize/normalize.ts'),\n structure: () => import('./src/modules/structure/structure.ts'),\n default: () => import('./src/modules/default/default.ts'),\n animations: () => import('./src/animations/animations.ts'),\n };\n\n let scripts = [...document.querySelectorAll(`script[type=\"module\"][src=\"${import.meta.url}\"]`)];\n\n if (scripts.length === 0) {\n scripts = [\n ...document.querySelectorAll('script[type=\"module\"][src*=\"@hortonstudio/main\"]'),\n ].filter((script) => {\n const scriptSrc = (script as HTMLScriptElement).src;\n const currentSrc = import.meta.url;\n const scriptPackage = scriptSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n const currentPackage = currentSrc.match(/@hortonstudio\\/main(@[\\d.]+)?/)?.[0];\n return (\n scriptPackage &&\n currentPackage &&\n scriptPackage.split('@')[0] === currentPackage.split('@')[0]\n );\n });\n }\n\n // Read settings from script tag attributes\n const settings = {\n isSPA: scripts.some((script) => script.getAttribute('data-hs-spa') === 'true'),\n };\n\n // Define 3-phase initialization system\n const PHASES = {\n normalize: {\n modules: ['normalize'],\n parallel: false, // Sequential execution critical for DOM fixes\n },\n structure: {\n modules: ['structure'],\n parallel: false, // Must complete before default\n },\n default: {\n modules: ['default', 'animations'],\n parallel: true, // Run default and animations in parallel\n },\n };\n\n const loadModule = async (moduleName: string): Promise<unknown> => {\n const instance = window[API_NAME];\n if (instance.process.has(moduleName)) {\n return instance.modules[moduleName]?.loading;\n }\n\n instance.process.add(moduleName);\n\n const moduleData = instance.modules[moduleName] || {};\n instance.modules[moduleName] = moduleData;\n\n moduleData.loading = new Promise((resolve, reject) => {\n moduleData.resolve = resolve;\n moduleData.reject = reject;\n });\n\n let destroy: (() => void) | undefined;\n try {\n const { init } = await moduleMap[moduleName]();\n const result = await init();\n const resultData = result || {};\n destroy = resultData.destroy as (() => void) | undefined;\n const initResult = resultData.result;\n\n moduleData.destroy = () => {\n destroy?.();\n instance.process.delete(moduleName);\n };\n moduleData.restart = () => {\n moduleData.destroy?.();\n instance.load(moduleName);\n };\n\n moduleData.resolve?.(initResult);\n delete moduleData.resolve;\n delete moduleData.reject;\n\n return initResult;\n } catch (error) {\n destroy?.();\n moduleData.reject?.(error);\n instance.process.delete(moduleName);\n throw error;\n }\n };\n\n // Helper to execute a phase (modules already downloaded)\n const executePhase = async (phaseName: string): Promise<void> => {\n const phase = PHASES[phaseName];\n\n // Execute based on parallel setting\n if (phase.parallel) {\n const initPromises = phase.modules.map((name: string) => loadModule(name));\n await Promise.allSettled(initPromises);\n } else {\n // Sequential execution\n for (const name of phase.modules) {\n await loadModule(name);\n }\n }\n };\n\n // Trigger DOM ready event\n const triggerDomReady = () => {\n const event = new CustomEvent('hsmain:dom-ready');\n window.dispatchEvent(event);\n };\n\n // Initialize all modules in 3 phases\n const initializeInPhases = async (): Promise<void> => {\n // Step 1: Download ALL modules in parallel (before any init)\n await Promise.allSettled([\n moduleMap['normalize'](),\n moduleMap['structure'](),\n moduleMap['default'](),\n moduleMap['animations'](),\n ]);\n\n // Step 2: Init in phases\n // Phase 1: Normalize (critical DOM fixes)\n await executePhase('normalize');\n\n // Phase 2: Structure (DOM modifications)\n await executePhase('structure');\n\n // Phase 3: Default + Animations (parallel)\n await executePhase('default');\n\n // Trigger DOM ready after everything initialized\n triggerDomReady();\n };\n\n const readyCallbacks: (() => void)[] = [];\n\n window[API_NAME] = {\n scripts,\n settings,\n modules: {},\n process: new Set(),\n load: loadModule,\n loaded: false,\n push(...items: [string, ((result: unknown) => void)?][]) {\n for (const [moduleName, callback] of items) {\n if (typeof callback === 'function') {\n this.modules[moduleName]?.loading?.then(callback);\n } else {\n this.load(moduleName);\n }\n }\n },\n destroy() {\n for (const moduleName in this.modules) {\n this.modules[moduleName]?.destroy?.();\n }\n },\n async reinitialize() {\n // Complete teardown\n this.loaded = false;\n this.destroy();\n this.modules = {};\n this.process = new Set();\n\n // Re-scan for modules including in w-embeds\n await this.scanForEmbedModules();\n\n // Use same phased initialization flow\n await initializeInPhases();\n\n this.loaded = true;\n },\n async scanForEmbedModules() {\n const embeds = document.querySelectorAll('.w-embed');\n embeds.forEach((embed) => {\n const scripts = embed.querySelectorAll('script[data-hs-module]');\n scripts.forEach((script) => {\n // Extract module info from data attributes\n const moduleType = script.getAttribute('data-hs-module-type');\n const moduleName = script.getAttribute('data-hs-module');\n\n if (moduleType && moduleName) {\n const moduleKey = `data-hs-${moduleType}-${moduleName}`;\n if (moduleMap[moduleKey]) {\n this.load(moduleKey);\n }\n }\n });\n });\n },\n afterReady(callback: () => void) {\n if (typeof callback === 'function') {\n if (this.loaded) {\n callback();\n } else {\n readyCallbacks.push(callback);\n }\n }\n },\n status(moduleName?: string) {\n if (moduleName) {\n return {\n loaded: !!this.modules[moduleName],\n loading: this.process.has(moduleName),\n };\n }\n return {\n loaded: Object.keys(this.modules),\n loading: [...this.process],\n phases: PHASES,\n };\n },\n };\n\n const finalize = async (): Promise<void> => {\n window[API_NAME].push(...queuedModules);\n\n // Run phased initialization\n await initializeInPhases();\n\n window[API_NAME].loaded = true;\n readyCallbacks.forEach((callback) => {\n try {\n callback();\n } catch {\n // Silent error handling\n }\n });\n readyCallbacks.length = 0; // Clear array after execution\n };\n\n finalize().catch(() => {});\n};\n\ninitializeHsMain();\n"],"file":"main.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hortonstudio/main",
3
- "version": "1.9.23",
3
+ "version": "1.9.24",
4
4
  "description": "Animation and utility library for client websites",
5
5
  "main": "dist/main.js",
6
6
  "type": "module",
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/counter-B9xmgh8V.js","assets/modalManager-LtDi9OJz.js","main.js"])))=>i.map(i=>d[i]);
2
- import{_ as n,c as t}from"../main.js";async function a(){const a=new Map,e=t.animations;async function o(){const t=[];if(document.querySelector('[data-hs-anim="counter"]'))if(a.has("counter"))t.push({name:"counter",status:"already-loaded"});else try{const{init:o}=await n(async()=>{const{init:n}=await import("./counter-B9xmgh8V.js");return{init:n}},__vite__mapDeps([0,1,2])),s=await o(e.counter);a.set("counter",s),t.push({name:"counter",status:"loaded"})}catch(o){console.error("[animations] Failed to load counter:",o),t.push({name:"counter",status:"failed"})}return t}const s=(await o()).filter(n=>"loaded"===n.status);return s.length>0&&console.log(`[animations] Loaded ${s.length} animation(s):`,s.map(n=>n.name).join(", ")),{result:`animations initialized (${s.length} active)`,rescan:async()=>{const n=await o(),t=n.filter(n=>"loaded"===n.status);return t.length>0&&console.log(`[animations] Rescanned and loaded ${t.length} new animation(s):`,t.map(n=>n.name).join(", ")),n},destroy:()=>{a.forEach((n,t)=>{try{n?.destroy&&n.destroy()}catch(a){console.error(`[animations] Error destroying ${t}:`,a)}}),a.clear()}}}export{a as init};
3
- //# sourceMappingURL=animations-igIF6V0K.js.map
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/counter-B9xmgh8V.js","assets/modalManager-LtDi9OJz.js","main.js"])))=>i.map(i=>d[i]);
2
- import{_ as n,c as t}from"../main.js";async function a(){const a=new Map,e=t.animations;async function o(){const t=[];if(document.querySelector('[data-hs-anim="counter"]'))if(a.has("counter"))t.push({name:"counter",status:"already-loaded"});else try{const{init:o}=await n(async()=>{const{init:n}=await import("./counter-B9xmgh8V.js");return{init:n}},__vite__mapDeps([0,1,2])),s=await o(e.counter);a.set("counter",s),t.push({name:"counter",status:"loaded"})}catch(o){console.error("[animations] Failed to load counter:",o),t.push({name:"counter",status:"failed"})}return t}const s=(await o()).filter(n=>"loaded"===n.status);return s.length>0&&console.log(`[animations] Loaded ${s.length} animation(s):`,s.map(n=>n.name).join(", ")),{result:`animations initialized (${s.length} active)`,rescan:async()=>{const n=await o(),t=n.filter(n=>"loaded"===n.status);return t.length>0&&console.log(`[animations] Rescanned and loaded ${t.length} new animation(s):`,t.map(n=>n.name).join(", ")),n},destroy:()=>{a.forEach((n,t)=>{try{n?.destroy&&n.destroy()}catch(a){console.error(`[animations] Error destroying ${t}:`,a)}}),a.clear()}}}export{a as init};
3
- //# sourceMappingURL=animations-igIF6V0K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":";sCAiBAA,eAAsBC,IACpB,MAAMC,MAAoBC,IAEpBC,EAAeC,EAAkB,WAKvCL,eAAeM,IACb,MAAMC,EAAU,GAGhB,GAAIC,SAASC,cAAc,4BACzB,GAAKP,EAAcQ,IAAI,WAWrBH,EAAQI,KAAK,CAAEC,KAAM,UAAWC,OAAQ,wBAVxC,IACE,MAAQZ,cAASa,EAAAd,UAAA,MAAAC,KAAAc,SAAMC,OAAO,yBAAgC,OAAAf,KAAAc,IAAAE,0BACxDC,QAAiBjB,EAAKG,EAAae,SACzCjB,EAAckB,IAAI,UAAWF,GAC7BX,EAAQI,KAAK,CAAEC,KAAM,UAAWC,OAAQ,UAC1C,OAASQ,GACPC,QAAQD,MAAM,uCAAwCA,GACtDd,EAAQI,KAAK,CAAEC,KAAM,UAAWC,OAAQ,UAC1C,CAUJ,OAAON,CACT,CAGA,MAGMgB,SAHuBjB,KAGCkB,OAAQC,GAAmB,WAAbA,EAAEZ,QAQ9C,OAPIU,EAAOG,OAAS,GAClBJ,QAAQK,IACN,uBAAuBJ,EAAOG,uBAC9BH,EAAOK,IAAKH,GAAMA,EAAEb,MAAMiB,KAAK,OAI5B,CACLC,OAAQ,2BAA2BP,EAAOG,iBAC1CK,OAAQ/B,UAEN,MAAMO,QAAgBD,IAChB0B,EAAczB,EAAQiB,OAAQC,GAAmB,WAAbA,EAAEZ,QAO5C,OANImB,EAAYN,OAAS,GACvBJ,QAAQK,IACN,qCAAqCK,EAAYN,2BACjDM,EAAYJ,IAAKH,GAAMA,EAAEb,MAAMiB,KAAK,OAGjCtB,GAET0B,QAAS,KAEP/B,EAAcgC,QAAQ,CAAChB,EAAUN,KAC/B,IACMM,GAAUe,SACZf,EAASe,SAEb,OAASZ,GACPC,QAAQD,MAAM,iCAAiCT,KAASS,EAC1D,IAEFnB,EAAciC,SAGpB","names":["async","init","activeModules","Map","moduleConfig","config","scanAndInitialize","results","document","querySelector","has","push","name","status","__vitePreload","init2","import","__VITE_PRELOAD__","instance","counter","set","error","console","loaded","filter","r","length","log","map","join","result","rescan","newlyLoaded","destroy","forEach","clear"],"ignoreList":[],"sources":["../../src/animations/animations.ts"],"sourcesContent":["/**\n * Animations Orchestrator\n *\n * Conditionally loads animation modules based on DOM presence.\n * Uses dynamic imports for tree-shaking - only bundles animations that exist on the page.\n *\n * Architecture:\n * - Runs synchronously with default phase (Phase 3)\n * - Scans DOM for animation attributes\n * - Dynamically imports only the animations found\n * - Exposes rescan() for SPA page transitions\n *\n * @version 2.0.0\n */\n\nimport config from '@config';\n\nexport async function init() {\n const activeModules = new Map();\n const CONFIG_ROOT = 'animations';\n const moduleConfig = config[CONFIG_ROOT];\n\n /**\n * Scan DOM and initialize animations that exist on the page\n */\n async function scanAndInitialize() {\n const results = [];\n\n // Counter Animation\n if (document.querySelector('[data-hs-anim=\"counter\"]')) {\n if (!activeModules.has('counter')) {\n try {\n const { init } = await import('./functions/counter/counter.ts');\n const instance = await init(moduleConfig.counter);\n activeModules.set('counter', instance);\n results.push({ name: 'counter', status: 'loaded' });\n } catch (error) {\n console.error('[animations] Failed to load counter:', error);\n results.push({ name: 'counter', status: 'failed' });\n }\n } else {\n results.push({ name: 'counter', status: 'already-loaded' });\n }\n }\n\n // Add more animation checks here as you create them:\n // if (document.querySelector('[data-hs-hamburger=\"squeeze\"]')) { ... }\n // if (document.querySelector('[data-hs-scroll-reveal]')) { ... }\n\n return results;\n }\n\n // Initial scan on page load\n const initialResults = await scanAndInitialize();\n\n // Log what was loaded\n const loaded = initialResults.filter((r) => r.status === 'loaded');\n if (loaded.length > 0) {\n console.log(\n `[animations] Loaded ${loaded.length} animation(s):`,\n loaded.map((r) => r.name).join(', ')\n );\n }\n\n return {\n result: `animations initialized (${loaded.length} active)`,\n rescan: async () => {\n // Rescan for new animations after SPA navigation\n const results = await scanAndInitialize();\n const newlyLoaded = results.filter((r) => r.status === 'loaded');\n if (newlyLoaded.length > 0) {\n console.log(\n `[animations] Rescanned and loaded ${newlyLoaded.length} new animation(s):`,\n newlyLoaded.map((r) => r.name).join(', ')\n );\n }\n return results;\n },\n destroy: () => {\n // Destroy all active animation modules\n activeModules.forEach((instance, name) => {\n try {\n if (instance?.destroy) {\n instance.destroy();\n }\n } catch (error) {\n console.error(`[animations] Error destroying ${name}:`, error);\n }\n });\n activeModules.clear();\n },\n };\n}\n"],"file":"animations-igIF6V0K.js"}
@@ -1,2 +0,0 @@
1
- import{p as e,g as t,q as r}from"./modalManager-LtDi9OJz.js";import"../main.js";async function n(n){if(e())return{result:"counter skipped - prefers-reduced-motion enabled"};const i=t("counter");if(!i)return{result:"counter skipped - GSAP not loaded"};const{gsap:o,ScrollTrigger:s}=i;s&&o.registerPlugin(s);const l=r(n,"counter"),a={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),i=(n.number.toString().split(".")[1]||"").length,l=r.includes(",");t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true");const u={value:0},c=o.timeline({paused:!0});if(c.to(u,{value:n.number,duration:3,ease:"power4.out",onUpdate:function(){const e=u.value;let r=i>0?e.toFixed(i):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}}),a.timelines.push(c),s){const t=s.create({trigger:e,start:"top bottom",once:!0,onEnter:()=>{c.play()}});a.scrollTriggers.push(t)}else c.play()}),{result:`counter initialized (${l.length} instances)`,destroy:()=>{a.timelines.forEach(e=>{e&&e.kill()}),a.scrollTriggers.forEach(e=>{e&&e.kill()}),a.timelines.length=0,a.scrollTriggers.length=0}}}export{n as init};
2
- //# sourceMappingURL=counter-B9xmgh8V.js.map
@@ -1,2 +0,0 @@
1
- import{p as e,g as t,q as r}from"./modalManager-LtDi9OJz.js";import"../main.js";async function n(n){if(e())return{result:"counter skipped - prefers-reduced-motion enabled"};const i=t("counter");if(!i)return{result:"counter skipped - GSAP not loaded"};const{gsap:o,ScrollTrigger:s}=i;s&&o.registerPlugin(s);const l=r(n,"counter"),a={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),i=(n.number.toString().split(".")[1]||"").length,l=r.includes(",");t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true");const u={value:0},c=o.timeline({paused:!0});if(c.to(u,{value:n.number,duration:3,ease:"power4.out",onUpdate:function(){const e=u.value;let r=i>0?e.toFixed(i):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}}),a.timelines.push(c),s){const t=s.create({trigger:e,start:"top bottom",once:!0,onEnter:()=>{c.play()}});a.scrollTriggers.push(t)}else c.play()}),{result:`counter initialized (${l.length} instances)`,destroy:()=>{a.timelines.forEach(e=>{e&&e.kill()}),a.scrollTriggers.forEach(e=>{e&&e.kill()}),a.timelines.length=0,a.scrollTriggers.length=0}}}export{n as init};
2
- //# sourceMappingURL=counter-B9xmgh8V.js.map
Binary file
@@ -1 +0,0 @@
1
- {"version":3,"file":"counter-B9xmgh8V.js","sources":["../../src/animations/functions/counter/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 * Attributes:\n * data-hs-anim=\"counter\" - Number element to animate (required)\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 { querySelectorAll, getGsap, prefersReducedMotion } from '@utils';\n\nexport async function init(config: any) {\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 if (ScrollTrigger) {\n gsap.registerPlugin(ScrollTrigger);\n }\n\n const counters = querySelectorAll(config, 'counter');\n const cleanup = {\n timelines: [],\n scrollTriggers: [],\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 if (ScrollTrigger) {\n const st = ScrollTrigger.create({\n trigger: counter,\n start: 'top bottom',\n once: true,\n onEnter: () => {\n (tl as any).play();\n },\n });\n cleanup.scrollTriggers.push(st);\n } else {\n // Fallback: play immediately if no ScrollTrigger\n (tl as any).play();\n }\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 as any).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":["async","init","config","prefersReducedMotion","result","gsapLib","getGsap","gsap","ScrollTrigger","registerPlugin","counters","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":"gFAqBAA,eAAsBC,EAAKC,GAEzB,GAAIC,IACF,MAAO,CAAEC,OAAQ,oDAGnB,MAAMC,EAAUC,EAAQ,WACxB,IAAKD,EACH,MAAO,CAAED,OAAQ,qCAGnB,MAAMG,KAAEA,EAAAC,cAAMA,GAAkBH,EAE5BG,GACFD,EAAKE,eAAeD,GAGtB,MAAME,EAAWC,EAAiBT,EAAQ,WACpCU,EAAU,CACdC,UAAW,GACXC,eAAgB,IA6ElB,OA5DAJ,EAASK,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,EAAKhC,EAAKiC,SAAS,CAAEC,QAAQ,IA2BnC,GAzBAF,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,GAGnB/B,EAAe,CACjB,MAAM6C,EAAK7C,EAAc8C,OAAO,CAC9BC,QAASvC,EACTwC,MAAO,aACPC,MAAM,EACNC,QAAS,KACNnB,EAAWoB,UAGhB/C,EAAQE,eAAesC,KAAKC,EAC9B,MAEGd,EAAWoB,SAIT,CACLvD,OAAQ,wBAAwBM,EAASuB,oBACzC2B,QAAS,KAEPhD,EAAQC,UAAUE,QAASwB,IACrBA,KAAgBsB,SAItBjD,EAAQE,eAAeC,QAASsC,IAC1BA,KAAgBQ,SAItBjD,EAAQC,UAAUoB,OAAS,EAC3BrB,EAAQE,eAAemB,OAAS,GAGtC"}
@@ -1,2 +0,0 @@
1
- import{c as s}from"../main.js";const a={state:s._global.cssVars.prefix+s._global.cssVars.state.name,clip:s._global.cssVars.prefix+s._global.cssVars.clip.name};export{a as c};
2
- //# sourceMappingURL=cssVariables-n9wQSSYb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cssVariables-n9wQSSYb.js","sources":["../../src/utils/cssVariables.ts"],"sourcesContent":["/**\n * CSS Variables Utility\n *\n * Provides the CSS variable prefix for constructing variable names.\n * Uses config from @config for prefix.\n *\n * Usage:\n * import cssVariables from '@utils/cssVariables';\n * const varName = cssVariables.prefix + 'state';\n * const value = getComputedStyle(el).getPropertyValue(varName);\n * // Returns: \"--_hs---state\"\n *\n * @version 2.0.0\n */\n\nimport config from '@config';\n\nconst cssVariables = {\n prefix: config._global.cssVars.prefix,\n state: config._global.cssVars.prefix + config._global.cssVars.state.name,\n clip: config._global.cssVars.prefix + config._global.cssVars.clip.name,\n};\n\nexport default cssVariables;\n"],"names":["cssVariables","state","config","_global","cssVars","prefix","name","clip"],"mappings":"+BAiBA,MAAMA,EAAe,CAEnBC,MAAOC,EAAOC,QAAQC,QAAQC,OAASH,EAAOC,QAAQC,QAAQH,MAAMK,KACpEC,KAAML,EAAOC,QAAQC,QAAQC,OAASH,EAAOC,QAAQC,QAAQG,KAAKD"}
@@ -1,2 +0,0 @@
1
- import{c as e}from"../main.js";import{g as t,p as n,q as r,b as s,a as o,s as i,d as a,o as l,c,i as u,e as d,f}from"./modalManager-LtDi9OJz.js";import{g as p}from"./utils-DA-PANmk.js";import{c as m}from"./cssVariables-n9wQSSYb.js";async function h(){let e=null,r=null;function s(e){const r=e.target.closest('a[href^="#"]');if(!r)return;const s=r.getAttribute("href");if(!s||"#"===s)return;const o=s.substring(1),i=document.getElementById(o);if(i){e.preventDefault(),history.replaceState&&history.replaceState(null,null,`#${i.id}`);!function(e,r=0){if(!e)return;const s=t("smooth-scroll",!1);if(n()||!s){const t=e.getBoundingClientRect().top+window.scrollY-r;return window.scrollTo(0,t),e.setAttribute("tabindex","-1"),void e.focus({preventScroll:!0})}s.gsap.to(window,{duration:1,scrollTo:{y:e,offsetY:r},ease:"power2.out",onComplete:function(){e.setAttribute("tabindex","-1"),e.focus({preventScroll:!0})}})}(i,function(){const e=getComputedStyle(document.documentElement).getPropertyValue("--misc--scroll-offset").trim();return parseInt(e)||0}())}}"undefined"!=typeof $&&$(document).off("click.wf-scroll"),document.documentElement.style.scrollBehavior="auto",document.body.style.scrollBehavior="auto",e=s,r=function(e){"Enter"!==e.key&&" "!==e.key||s(e)},document.addEventListener("click",e),document.addEventListener("keydown",r);const o=t("smooth-scroll",!1);return o&&document.body.scrollHeight>window.innerHeight&&(o.gsap.set(window,{scrollTo:1}),o.gsap.set(window,{scrollTo:0})),{result:"autoInit-smooth-scroll initialized",destroy:()=>{e&&(document.removeEventListener("click",e),e=null),r&&(document.removeEventListener("keydown",r),r=null),document.documentElement.style.scrollBehavior="",document.body.style.scrollBehavior=""}}}let v=null;function g(e){v=e;const t={observers:[],handlers:[]};return function(e,t){const n=r(v,"wrapper"),l=[];n.forEach(n=>{const r=s(p.clickable,"button"),c=n.querySelector(r),u=o(v,"list",n);if(!c||!u)return void console.warn("[dropdown] Dropdown wrapper missing required elements:",n);const d=n.getAttribute("data-hs-nav-dropdown-type")||"hover",f=n.querySelector('[data-hs-height="element"]'),m=f?f.parentElement:null,h=c.textContent?.trim()||"dropdown",g=h.toLowerCase().replace(/[^a-z0-9\s]/g,"").replace(/\s+/g,"-").replace(/^-+|-+$/g,"").substring(0,50);const y=`navbar-dropdown-${g}-toggle`,b=`navbar-dropdown-${g}-list`;c.id=y,c.setAttribute("aria-haspopup","menu"),c.setAttribute("aria-expanded","false"),c.setAttribute("aria-controls",b),u.id=b,u.setAttribute("role","menu"),u.inert=!0;const w=Array.from(u.querySelectorAll(r));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(p.classes.active)}function k(){const e=E();"true"===c.getAttribute("aria-expanded")&&!e&&u.contains(document.activeElement)&&c.focus(),c.setAttribute("aria-expanded",e?"true":"false"),u.inert=!e,w.forEach(t=>{t.setAttribute("tabindex",e?"0":"-1")}),e||(A=-1),a(m,e,{duration:"hover"===d?200:300,ease:"power2.inOut"})}i(m,E()),k();const L=new MutationObserver(()=>{k()});if(L.observe(n,{attributes:!0,attributeFilter:["class"]}),e(L),"hover"===d){l.push(n);const e=()=>{n.classList.add("is-active")},r=()=>{n.classList.remove("is-active")};t(n,"mouseenter",e),t(n,"mouseleave",r);t(c,"keydown",function(e){"ArrowDown"===e.key?(e.preventDefault(),E()||(n.classList.add(p.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):" "===e.key||"Enter"===e.key?(e.preventDefault(),E()?n.classList.remove(p.classes.active):(n.classList.add(p.classes.active),w.length>0&&setTimeout(()=>{A=0,w[0].focus()},100))):"ArrowUp"===e.key?(e.preventDefault(),E()||(n.classList.add(p.classes.active),w.length>0&&setTimeout(()=>{A=w.length-1,w[A].focus()},100))):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(p.classes.active))});t(document,"keydown",function(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(p.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")))})}else if("click"===d){t(c,"click",function(e){e.preventDefault(),n.classList.toggle(p.classes.active)});t(c,"keydown",function(e){" "===e.key||"Enter"===e.key?(e.preventDefault(),n.classList.toggle(p.classes.active)):"Escape"===e.key&&(e.preventDefault(),E()&&n.classList.remove(p.classes.active))})}});const c=function(e){l.forEach(t=>{t.classList.contains("is-active")&&!t.contains(e.target)&&t.classList.remove("is-active")})};l.length>0&&t(document,"focusin",c)}(e=>t.observers.push(e),(e,n,r,s)=>{e.addEventListener(n,r,s),t.handlers.push({element:e,event:n,handler:r,options:s})}),{result:"dropdown initialized",destroy:()=>{t.observers.forEach(e=>e.disconnect()),t.observers.length=0,t.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),t.handlers.length=0,v=null}}}function y(e,t){const n={observers:[],handlers:[],state:{focusTrapHandler:null}},u=e=>n.observers.push(e);return function(u,d){const f=r(e,"button"),m=o(e,"wrapper");if(!f.length||!m)return;const h=o(t,"wrapper"),v=`menu-${Date.now()}`;m.id=v,m.setAttribute("role","dialog"),m.setAttribute("aria-modal","true"),m.inert=!0;const g=m.querySelector('[data-hs-height="element"]'),y=g?g.parentElement:null;f.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-controls",v),e.setAttribute("aria-label","Open navigation menu");let t=null,r=!1;function o(){return e.classList.contains(p.classes.active)}function g(){const n=o(),i="true"===e.getAttribute("aria-expanded");n&&!i?(l(),m.classList.add(p.classes.active),m.inert=!1,h&&h.classList.add("hs-menu-open"),f.forEach(e=>{e.setAttribute("aria-expanded","true"),e.setAttribute("aria-label","Close navigation menu")}),y&&a(y,!0,{duration:300,ease:"power2.inOut"}),t=function(){const e=document.querySelector('[data-hs-nav="wrapper"]');if(!e)return;const t=t=>{if("Tab"===t.key){const n=s(p.clickable,"button"),r=Array.from(e.querySelectorAll(n)),o=e.querySelectorAll('input, select, textarea, [tabindex]:not([tabindex="-1"])'),i=[...r,...Array.from(o)],a=i[0],l=i[i.length-1];t.shiftKey?document.activeElement===a&&(t.preventDefault(),l.focus()):document.activeElement===l&&(t.preventDefault(),a.focus())}};return document.addEventListener("keydown",t),t}(),r&&(setTimeout(()=>{const e=s(p.clickable,"button"),t=Array.from(m.querySelectorAll(e));if("last"===r){const e=t[t.length-1];e&&e.focus()}else{const e=t[0];e&&e.focus()}},100),r=!1)):!n&&i&&(m.contains(document.activeElement)&&e.focus(),c(),m.classList.remove(p.classes.active),m.inert=!0,h&&h.classList.remove("hs-menu-open"),f.forEach(e=>{e.setAttribute("aria-expanded","false"),e.setAttribute("aria-label","Open navigation menu")}),y&&a(y,!1,{duration:300,ease:"power2.inOut"}),function(e){e&&document.removeEventListener("keydown",e)}(t),t=null)}y&&i(y,o()),g();const b=new MutationObserver(()=>{g()});b.observe(e,{attributes:!0,attributeFilter:["class"]}),u(b);d(e,"click",function(t){t.preventDefault(),e.classList.toggle("is-active")});d(e,"keydown",function(t){" "===t.key||"Enter"===t.key?(t.preventDefault(),r=!0,e.classList.toggle(p.classes.active)):"ArrowDown"===t.key?(t.preventDefault(),o()||(r=!0,e.classList.add(p.classes.active))):"ArrowUp"===t.key?(t.preventDefault(),o()||(r="last",e.classList.add(p.classes.active))):"Escape"===t.key&&(t.preventDefault(),o()&&e.classList.remove(p.classes.active))}),n.state.focusTrapHandler=t})}(u,(e,t,r,s)=>{e.addEventListener(t,r,s),n.handlers.push({element:e,event:t,handler:r,options:s})}),function(t){const n=o(e,"wrapper");if(!n)return;let r=null;function s(){const e=window.getComputedStyle(n).getPropertyValue(m.state).trim();if(r===p.cssVars.state.values.active&&e===p.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")}r=e}const i=new ResizeObserver(s);i.observe(n),t(i),s()}(u),{result:"menu initialized",destroy:()=>{n.state.focusTrapHandler&&(document.removeEventListener("keydown",n.state.focusTrapHandler),n.state.focusTrapHandler=null),n.observers.forEach(e=>e.disconnect()),n.observers.length=0,n.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),n.handlers.length=0,document.body.classList.remove("u-overflow-hidden")}}}function b(e){const t={handlers:[]},n=(e,n,r,s)=>{e.addEventListener(n,r,s),t.handlers.push({element:e,event:n,handler:r,options:s})};return n(document,"keydown",function(e){if("ArrowLeft"!==e.key&&"ArrowRight"!==e.key)return;const t=document.querySelector('[data-hs-nav-menu="wrapper"]');if(t&&t.contains(document.activeElement))return;const n=document.querySelector('[data-hs-nav="wrapper"]');if(!n||!n.contains(document.activeElement))return;const r=n.querySelector(`.${p.classes.active}[data-hs-nav-dropdown]`);if(r&&r.contains(document.activeElement))return;e.preventDefault();const o=s(p.clickable,"button"),i=Array.from(n.querySelectorAll(o)),a=Array.from(i).filter(e=>{if("-1"===e.getAttribute("tabindex"))return!1;if(e.closest('[role="menu"]'))return!1;if(e.closest('[data-hs-nav-menu="wrapper"]'))return!1;if(e.closest('[data-hs-nav="skip-link"]'))return!1;const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility||"0"===t.opacity||0===e.offsetWidth||0===e.offsetHeight)return!1;let r=e.parentElement;for(;r&&r!==n;){const e=window.getComputedStyle(r);if("none"===e.display||"hidden"===e.visibility||0===r.offsetWidth||0===r.offsetHeight)return!1;r=r.parentElement}return!0}),l=a.indexOf(document.activeElement);-1!==l&&("ArrowRight"===e.key?l<a.length-1&&a[l+1].focus():l>0&&a[l-1].focus())}),function(e){const t=document.querySelector('[data-hs-nav-menu="wrapper"]');if(!t)return;let n=-1;e(t,"keydown",function(e){const r=function(){const e=s(p.clickable,"button"),n=Array.from(t.querySelectorAll(e));return Array.from(n).filter(e=>{let n=e;for(;n&&n!==t;){if(n.inert)return!1;n=n.parentElement}return!0})}();if(0===r.length)return;const o=document.activeElement;if(n=r.indexOf(o),"ArrowDown"===e.key)e.preventDefault(),n<r.length-1&&(n+=1,r[n].focus());else if("ArrowUp"===e.key)e.preventDefault(),n>0&&(n-=1,r[n].focus());else if("ArrowRight"===e.key){if(e.preventDefault(),"BUTTON"===o.tagName&&o.hasAttribute("aria-controls")){return void("true"===o.getAttribute("aria-expanded")||o.click())}}else if("ArrowLeft"===e.key){if(e.preventDefault(),"BUTTON"===o.tagName&&o.hasAttribute("aria-controls")){return void("true"===o.getAttribute("aria-expanded")&&o.click())}}else if("Home"===e.key)e.preventDefault(),n=0,r[0].focus();else if("End"===e.key)e.preventDefault(),n=r.length-1,r[r.length-1].focus();else if(" "===e.key&&"A"===o.tagName)e.preventDefault();else if("Escape"===e.key){const e=document.querySelector('[data-hs-nav-menu="button"]');e&&(e.click(),e.focus())}})}(n),{result:"arrow-navigation initialized",destroy:()=>{t.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),t.handlers.length=0}}}async function w(e){const t={destroyFunctions:[]},n=await Promise.allSettled([g(e.dropdown),y(e.menu,e),b(e["arrow-navigation"])]);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}}}async function A(){const e={modules:{},destroyFunctions:[]},t={},n=Object.keys(t).map(n=>(async n=>{try{const{init:r}=await t[n](),s=await r();return e.modules[n]=s,s&&s.destroy&&e.destroyFunctions.push(s.destroy),s}catch(r){return console.error(`[accessibility] Failed to load function: ${n}`,r),null}})(n)),r=await Promise.allSettled(n),s=r.filter(e=>"fulfilled"===e.status&&e.value).length,o=r.length-s;return o>0&&console.warn(`[accessibility] ${s}/${r.length} functions loaded successfully. ${o} failed but won't affect other functions.`),{result:"accessibility initialized (no functions loaded)",destroy:()=>{e.destroyFunctions.forEach(e=>{try{e()}catch(t){console.error("Error during accessibility cleanup:",t)}}),e.destroyFunctions.length=0,e.modules={}}}}function E(e){const t={observers:[],handlers:[],liveRegions:[]};return function(n,l){const c=r(e,"wrapper");if(0===c.length)return 0;let u=0;c.forEach((r,c)=>{const d=o(e,"toggle",r),f=o(e,"content",r);if(!d||!f)return;u++;const m=r.querySelector('[data-hs-height="element"]'),h=m?m.parentElement:f,v=`hs-accordion-btn-${c}`,g=`hs-accordion-content-${c}`,y=document.createElement("div");y.className="sr-only",y.setAttribute("aria-live","polite"),y.setAttribute("aria-atomic","true"),y.style.cssText="position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden;",r.appendChild(y),t.liveRegions.push(y);const b=r.getAttribute(e.attributes.properties.open),w=r.getAttribute(e.attributes.properties.closed),A=b&&w;let E=[];if(A){const t=s(e,"state");E=Array.from(d.querySelectorAll(t))}function k(){return r.classList.contains(p.classes.active)}function L(){const e=k(),t="true"===d.getAttribute("aria-expanded");if(t&&!e&&f.contains(document.activeElement)){d.focus()}d.setAttribute("aria-expanded",e?"true":"false");var n;f.inert=!e,e!==t&&function(e){const t=d.textContent?.trim()||"Section";y.textContent=`${t} ${e?"expanded":"collapsed"}`,setTimeout(()=>y.textContent="",1e3)}(e),A&&E.length>0&&(n=e?b:w,A&&E.forEach(e=>{e.textContent=n})),a(h,e,{duration:300,ease:"power2.inOut"})}d.setAttribute("id",v),f.setAttribute("id",g),f.setAttribute("role","region"),f.setAttribute("aria-labelledby",v),d.setAttribute("aria-controls",g);const x=r.getAttribute(e.attributes.properties.default);x&&"open"===x.toLowerCase()&&r.classList.add(p.classes.active),i(h,k()),L();l(d,"click",e=>{e.preventDefault(),r.classList.toggle(p.classes.active)});const S=new MutationObserver(()=>{L()});S.observe(r,{attributes:!0,attributeFilter:["class"]}),n(S)})}(e=>t.observers.push(e),(e,n,r,s)=>{e.addEventListener(n,r,s),t.handlers.push({element:e,event:n,handler:r,options:s})}),{result:"accordion initialized",destroy:()=>{t.liveRegions.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),t.liveRegions.length=0,t.observers.forEach(e=>e.disconnect()),t.observers.length=0,t.handlers.forEach(({element:e,event:t,handler:n,options:r})=>{e.removeEventListener(t,n,r)}),t.handlers.length=0}}}async function k(e){const n=t("comparison");if(!n)return{result:"comparison skipped - GSAP not loaded"};const{gsap:i,Draggable:a}=n;a||console.warn("[comparison] GSAP Draggable plugin not loaded, drag functionality disabled");const l=r(e,"wrapper"),c={draggables:[],handlers:[]},u=s(e,"template-name"),d=s(e,"template-description"),f=s(e,"template-before-image"),h=s(e,"template-after-image");function v(e,t){e.style.setProperty(m.clip,`${t}%`)}function g(t,n){const r=t.templateItems[n];if(!r)return;const s=r.querySelector(u);t.nameElement&&s&&(t.nameElement.textContent=s.textContent);const i=r.querySelector(d);t.descElement&&i&&(t.descElement.textContent=i.textContent);const a=r.querySelector(f);t.beforeImage&&a&&(t.beforeImage.src=a.src,t.beforeImage.alt=a.alt||"");const l=r.querySelector(h);t.afterImage&&l&&(t.afterImage.src=l.src,t.afterImage.alt=l.alt||"",y(t)),t.currentIndex=n,function(t,n){const r=o(e,"pagination",t);if(!r)return;const s=p.classes.active;Array.from(r.children).forEach((e,t)=>{t===n?e.classList.add(s):e.classList.remove(s)})}(t.wrapper,n)}function y(e){const t=e.slider,n=e.wrapper;switch(e.mode){case"before":n.style.setProperty(m.clip,"100%"),t.style.display="none";break;case"after":n.style.setProperty(m.clip,"0%"),t.style.display="none";break;case"split":v(n,e.sliderPosition),t.style.display="flex"}}function b(e,t){const n=e.currentIndex+t,r=e.templateItems.length-1;let s;s=n>r?0:n<0?r:n,g(e,s)}return l.forEach(t=>{const n=o(e,"template-list",t);if(!n)return void console.warn("[comparison] No template list found in wrapper");const r=s(e,"template-item"),l=Array.from(n.querySelectorAll(r));if(0===l.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 u=o(e,"image-wrapper",t),d=o(e,"slider",t),f=o(e,"before-image",t),m=o(e,"after-image",t),h=o(e,"name",t),w=o(e,"description",t);if(!u||!d||!m){const e=[];return u||e.push('image-wrapper (data-hs-comparison="image-wrapper")'),d||e.push('slider (data-hs-comparison="slider")'),m||e.push('after-image (data-hs-comparison-image="after")'),void console.warn(`[comparison] Missing required elements: ${e.join(", ")}`)}const A={wrapper:t,templateItems:l,currentIndex:0,mode:"split",sliderPosition:50,slider:d,beforeImage:f?.querySelector("img"),afterImage:m?.querySelector("img"),nameElement:h,descElement:w,draggable:null};if(g(A,0),v(t,50),a){const e=a.create(d,{type:"x",bounds:u,onDrag:function(){const e=u.getBoundingClientRect(),n=d.getBoundingClientRect().left-e.left,r=Math.max(0,Math.min(100,n/e.width*100));v(t,r),A.sliderPosition=r}});c.draggables.push(e),A.draggable=e[0];const n=e=>{if("split"!==A.mode)return;const n=u.getBoundingClientRect(),r=e.clientX-n.left,s=Math.max(0,Math.min(100,r/n.width*100)),o=r-n.width/2;A.draggable&&(i.set(d,{x:o}),A.draggable.update()),v(t,s),A.sliderPosition=s};u.addEventListener("click",n),c.handlers.push({element:u,event:"click",handler:n})}t.querySelectorAll(`[${e.attributes.properties.modeType}]`).forEach(t=>{const n=t.getAttribute(e.attributes.properties.modeType),r=s(p.clickable,"button"),o=t.querySelector(r)||t;n===A.mode&&t.classList.add(p.classes.active);const i=t=>{t.preventDefault(),function(t,n){const r=t.wrapper.querySelectorAll(`[${e.attributes.properties.modeType}]`),s=p.classes.active;r.forEach(t=>{t.getAttribute(e.attributes.properties.modeType)===n?t.classList.add(s):t.classList.remove(s)}),t.mode=n,y(t)}(A,n)};o.addEventListener("click",i),c.handlers.push({element:o,event:"click",handler:i})}),function(t,n){const r=n.querySelector(`[${e.attributes.properties.navType}="previous"]`),o=n.querySelector(`[${e.attributes.properties.navType}="next"]`);if(r){const e=s(p.clickable,"button"),n=r.querySelector(e)||r;n.setAttribute("aria-label","Previous image");const o=e=>{e.preventDefault(),b(t,-1)};n.addEventListener("click",o),c.handlers.push({element:n,event:"click",handler:o})}if(o){const e=s(p.clickable,"button"),n=o.querySelector(e)||o;n.setAttribute("aria-label","Next image");const r=e=>{e.preventDefault(),b(t,1)};n.addEventListener("click",r),c.handlers.push({element:n,event:"click",handler:r})}}(A,t);const E=o(e,"pagination",t);E&&l.length>1&&function(e,t){const n=t.children[0];if(!n)return;const r=p.classes.active;t.innerHTML="",e.templateItems.forEach((s,o)=>{const i=n.cloneNode(!0);i.classList.remove(r),0===o&&i.classList.add(r);const a=()=>{g(e,o)};i.addEventListener("click",a),c.handlers.push({element:i,event:"click",handler:a}),t.appendChild(i)})}(A,E),function(e){const t=t=>{"ArrowLeft"===t.key||"ArrowUp"===t.key?(t.preventDefault(),b(e,-1)):"ArrowRight"!==t.key&&"ArrowDown"!==t.key||(t.preventDefault(),b(e,1))};e.wrapper.addEventListener("keydown",t),e.wrapper.setAttribute("tabindex","0"),c.handlers.push({element:e.wrapper,event:"keydown",handler:t})}(A)}),{result:`comparison initialized (${l.length} instances)`,destroy:()=>{c.draggables.forEach(e=>{e&&e[0]&&e[0].kill&&e[0].kill()}),c.handlers.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),c.draggables.length=0,c.handlers.length=0}}}async function L(e){if(n())return{result:"marquee skipped - prefers-reduced-motion enabled"};const s=t("marquee");if(!s)return{result:"marquee skipped - GSAP not loaded"};const{gsap:o,ScrollTrigger:i}=s;i&&o.registerPlugin(i),u();const a=r(e,"wrapper"),l={timelines:[],scrollTriggers:[],tickers:[]};return a.forEach(t=>{const n=t.getAttribute(e.attributes.properties.direction),r=Array.from(t.children);if(0===r.length)return void console.warn("[marquee] No children found in marquee wrapper:",t);const s=t.getAttribute(e.attributes.properties.duration),i=s?parseFloat(s):parseFloat(e.defaults.duration),a=t.getAttribute(e.attributes.properties.scrollMultiplier),c=a?parseFloat(a):parseFloat(e.defaults.scrollMultiplier),u=t.getAttribute(e.attributes.properties.type);s||t.setAttribute(e.attributes.properties.duration,e.defaults.duration),a||t.setAttribute(e.attributes.properties.scrollMultiplier,e.defaults.scrollMultiplier),t.classList.add(p.classes.gsap);const m=o.timeline({repeat:-1});if(r.forEach(e=>{"left"===n?m.to(e,{xPercent:-100,duration:i,ease:"none"},0):"right"===n&&(o.set(e,{xPercent:-100}),m.to(e,{xPercent:0,duration:i,ease:"none"},0))}),l.timelines.push(m),c>0){let e=1;const t=()=>{const t=f(),n=d();let r=1;if("reverse"===u)if(1===n)r=1+t*c;else if(-1===n){const e=t*c;r=e>.5?-e:1}else r=1;else{r=1+t*c}Math.abs(r-e)>.001&&(m.timeScale(r),e=r)};o.ticker.add(t),l.tickers.push({tickerFunc:t,gsap:o})}}),{result:`marquee initialized (${a.length} instances)`,destroy:()=>{l.timelines.forEach(e=>{e&&e.kill()}),l.scrollTriggers.forEach(e=>{e&&e.kill()}),l.tickers.forEach(({tickerFunc:e,gsap:t})=>{t.ticker.remove(e)}),a.forEach(e=>{e.classList.remove(p.classes.gsap)}),l.timelines.length=0,l.scrollTriggers.length=0,l.tickers.length=0}}}const x=p.apiName;async function S(){const t={destroyFunctions:[]},n=e.default,s=[h(),w(n.navbar),A(),E(n.accordion),k(n.comparison),L(n.marquee)],i=(async()=>(await new Promise(e=>setTimeout(e,50)),async function(t){const n=t||e.default?.transition,s=o(n,"element");if(!s)return console.log("[transition] No transition element found, skipping initialization"),{result:"transition skipped - no element found",destroy:()=>{}};const i=n.attributes.elements.namespace.primary,a=s.getAttribute(i)||null,l=window[x]?.settings?.isSPA||!1,c=new Map;let u=null;const d=(e,t)=>{const s=r(n,"exit"===e?"exitTrigger":"enterTrigger");if(s.length>0){if(t){const e=Array.from(s).find(e=>e.getAttribute(i)===t);if(e)return e}return Array.from(s).find(e=>!e.hasAttribute(i))||s[0]}const o=document.querySelectorAll('[data-hs-transition="trigger"]');if(o.length>0){if(t){const e=Array.from(o).find(e=>e.getAttribute(i)===t);if(e)return e}return o[0]}return null},f=(e,t,r)=>{if(!e)return 0;const o="exit"===r?"time"===t?n.attributes.elements.exitTime.primary:n.attributes.elements.exitDelay.primary:"time"===t?n.attributes.elements.enterTime.primary:n.attributes.elements.enterDelay.primary;let i=e.getAttribute(o);return i||"exit"===r&&"time"===t&&(i=s.getAttribute("data-hs-exit-time"),i)||"enter"===r&&"delay"===t&&(i=s.getAttribute("data-hs-delay"),i)?1e3*parseFloat(i):0},p=(e=a)=>new Promise(t=>{const n=d("exit",e);if(!n)return void t();const r=f(n,"time","exit"),s=f(n,"delay","exit"),o=()=>{"undefined"!=typeof Webflow?Webflow.push(()=>{n.click()}):n.click(),setTimeout(t,r)};s>0?setTimeout(o,s):o()}),m=(e=a)=>new Promise(t=>{const n=d("enter",e);if(!n)return void t();const r=f(n,"time","enter"),s=f(n,"delay","enter"),o=!sessionStorage.getItem("transition-loaded"),i=()=>{"undefined"!=typeof Webflow?Webflow.push(()=>{n.click()}):n.click(),o&&sessionStorage.setItem("transition-loaded","true"),setTimeout(t,r)};o&&s>0?u=setTimeout(i,s):i()}),h=()=>p(),v=()=>m();if(c.set("hsmain:transition-exit",h),c.set("hsmain:transition-enter",v),window.addEventListener("hsmain:transition-exit",h),window.addEventListener("hsmain:transition-enter",v),!l){const e=e=>{const t=e.target.closest("a[href]");if(t&&t.hostname===window.location.hostname&&t.getAttribute("href")&&-1===t.getAttribute("href").indexOf("#")&&"_blank"!==t.getAttribute("target")){e.preventDefault();const n=t.href;p().then(()=>{window.location.href=n})}};c.set("click",e),document.addEventListener("click",e);const t=e=>{e.persisted&&window.location.reload()};c.set("pageshow",t),window.addEventListener("pageshow",t)}const g=()=>{s&&(s.style.display="none")};c.set("resize",g),window.addEventListener("resize",g);const y=()=>{m()};return c.set(`${x}:dom-ready`,y),window.addEventListener(`${x}:dom-ready`,y,{once:!0}),{result:"transition initialized",destroy:()=>{u&&clearTimeout(u),c.forEach((e,t)=>{"click"===t||"pageshow"===t||"resize"===t?("click"===t?document:window).removeEventListener(t,e):window.removeEventListener(t,e)}),c.clear()}}}(n.transition)))(),a=await Promise.allSettled([...s,i]);a.forEach(e=>{"fulfilled"===e.status&&e.value?.destroy&&t.destroyFunctions.push(e.value.destroy)});const l=a.filter(e=>"fulfilled"===e.status).length,c=a.length-l;return c>0&&console.warn(`[default] ${l}/${a.length} functions loaded successfully. ${c} 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{S as init};
2
- //# sourceMappingURL=default-CZ6vle49.js.map