@vanduo-oss/framework 1.3.8 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/css/components/collapsible.css +8 -0
- package/css/core/colors.css +27 -1
- package/css/core/tokens.css +1 -1
- package/css/core/typography.css +1 -1
- package/dist/build-info.json +3 -3
- package/dist/vanduo.cjs.js +8 -7
- package/dist/vanduo.cjs.js.map +2 -2
- package/dist/vanduo.cjs.min.js +3 -3
- package/dist/vanduo.cjs.min.js.map +2 -2
- package/dist/vanduo.css +32 -5
- package/dist/vanduo.css.map +1 -1
- package/dist/vanduo.esm.js +8 -7
- package/dist/vanduo.esm.js.map +2 -2
- package/dist/vanduo.esm.min.js +3 -3
- package/dist/vanduo.esm.min.js.map +2 -2
- package/dist/vanduo.js +8 -7
- package/dist/vanduo.js.map +2 -2
- package/dist/vanduo.min.css +2 -2
- package/dist/vanduo.min.css.map +1 -1
- package/dist/vanduo.min.js +3 -3
- package/dist/vanduo.min.js.map +2 -2
- package/js/components/font-switcher.js +3 -3
- package/js/components/theme-customizer.js +3 -2
- package/package.json +2 -4
package/dist/vanduo.min.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/*! Vanduo v1.3.
|
|
2
|
-
(()=>{(function(){"use strict";let m={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){m.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){m.unregister(n)})},getAll:function(){let e=[];return this.instances.forEach(function(t,n){e.push({element:n,component:t.component,registeredAt:t.registeredAt})}),e},has:function(e){return this.instances.has(e)}};window.addEventListener("beforeunload",function(){m.destroyAll()}),window.VanduoLifecycle=m,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",m)})();(function(){"use strict";let e={version:"1.3.
|
|
1
|
+
/*! Vanduo v1.3.9 | Built: 2026-05-10T18:54:59.798Z | git:2945a85 | production */
|
|
2
|
+
(()=>{(function(){"use strict";let m={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){m.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){m.unregister(n)})},getAll:function(){let e=[];return this.instances.forEach(function(t,n){e.push({element:n,component:t.component,registeredAt:t.registeredAt})}),e},has:function(e){return this.instances.has(e)}};window.addEventListener("beforeunload",function(){m.destroyAll()}),window.VanduoLifecycle=m,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",m)})();(function(){"use strict";let e={version:"1.3.9",components:{},init:function(){typeof ready<"u"?ready(()=>{this.initComponents()}):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{this.initComponents()}):this.initComponents()},initComponents:function(){Object.keys(this.components).forEach(t=>{let n=this.components[t];if(n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to initialize component "'+t+'":',s)}}),console.log("Vanduo Framework v"+this.version+" initialized")},register:function(t,n){this.components[t]=n},reinit:function(t){let n=this.components[t];if(n&&n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to reinitialize component "'+t+'":',s)}},destroyAll:function(){let t=Object.keys(this.components);for(let n=0;n<t.length;n++){let s=this.components[t[n]];if(s&&s.destroyAll&&typeof s.destroyAll=="function")try{s.destroyAll()}catch(o){console.warn('[Vanduo] Failed to destroy component "'+t[n]+'":',o)}}typeof window.VanduoLifecycle<"u"&&window.VanduoLifecycle.destroyAll()},getComponent:function(t){return this.components[t]||null}};window.Vanduo=e})();(function(){"use strict";let m={_snippetIdCounter:0,getSnippetInstanceId:function(e){if(e.dataset.codeSnippetId)return e.dataset.codeSnippetId;let t=(e.id||"").trim();return t?(e.dataset.codeSnippetId=`snippet-${t}`,e.dataset.codeSnippetId):(this._snippetIdCounter+=1,e.dataset.codeSnippetId=`snippet-auto-${this._snippetIdCounter}`,e.dataset.codeSnippetId)},addListener:function(e,t,n,s){t&&(t.addEventListener(n,s),e._codeSnippetCleanup||(e._codeSnippetCleanup=[]),e._codeSnippetCleanup.push(()=>t.removeEventListener(n,s)))},init:function(){document.querySelectorAll(".vd-code-snippet").forEach(t=>{t.dataset.initialized||this.initSnippet(t)})},initSnippet:function(e){e.dataset.initialized="true",e._codeSnippetCleanup=[];let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&n&&this.initCollapsible(e,t,n);let s=e.querySelectorAll(".vd-code-snippet-tab"),o=e.querySelectorAll(".vd-code-snippet-pane");s.length>0&&this.initTabs(e,s,o);let i=e.querySelector(".vd-code-snippet-copy");i&&this.initCopyButton(e,i),e.querySelectorAll("[data-extract]").forEach(c=>{this.extractHtml(c)}),e.querySelectorAll(".has-line-numbers").forEach(c=>{this.addLineNumbers(c)})},initCollapsible:function(e,t,n){let s=e.dataset.expanded==="true";t.setAttribute("aria-expanded",s),n.dataset.visible=s,this.addListener(e,t,"click",()=>{let o=e.dataset.expanded==="true";e.dataset.expanded=!o,t.setAttribute("aria-expanded",!o),n.dataset.visible=!o,o||n.querySelectorAll("[data-extract]:not([data-extracted])").forEach(r=>{this.extractHtml(r)});let i=new CustomEvent("codesnippet:toggle",{bubbles:!0,detail:{snippet:e,expanded:!o}});e.dispatchEvent(i)})},initTabs:function(e,t,n){let s=this.getSnippetInstanceId(e),o=e.querySelector(".vd-code-snippet-tabs");o&&o.setAttribute("role","tablist"),t.forEach((i,a)=>{let r=i.dataset.lang,c=i.classList.contains("is-active");i.setAttribute("role","tab"),i.setAttribute("aria-selected",c),i.setAttribute("tabindex",c?"0":"-1"),i.id=i.id||`code-tab-${s}-${r||"tab"}-${a}`;let l=e.querySelector(`.vd-code-snippet-pane[data-lang="${r}"]`);l&&(l.id=l.id||`code-pane-${s}-${r||"pane"}-${a}`,l.setAttribute("role","tabpanel"),i.setAttribute("aria-controls",l.id),l.setAttribute("aria-labelledby",i.id)),this.addListener(e,i,"click",()=>{this.switchTab(e,i,t,n)}),this.addListener(e,i,"keydown",f=>{this.handleTabKeydown(f,e,t,n)})})},switchTab:function(e,t,n,s){let o=t.dataset.lang;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1")}),s.forEach(r=>{r.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0");let i=e.querySelector(`.vd-code-snippet-pane[data-lang="${o}"]`);i&&i.classList.add("is-active");let a=new CustomEvent("codesnippet:tabchange",{bubbles:!0,detail:{snippet:e,tab:t,lang:o}});e.dispatchEvent(a)},handleTabKeydown:function(e,t,n,s){let o=Array.from(n),i=o.indexOf(e.target),a;switch(e.key){case"ArrowLeft":e.preventDefault(),a=i>0?i-1:o.length-1;break;case"ArrowRight":e.preventDefault(),a=i<o.length-1?i+1:0;break;case"Home":e.preventDefault(),a=0;break;case"End":e.preventDefault(),a=o.length-1;break;default:return}a!==i&&(o[a].focus(),this.switchTab(t,o[a],n,s))},initCopyButton:function(e,t){this.addListener(e,t,"click",async()=>{await this.copyCode(e,t)})},copyCode:async function(e,t){let n=e.querySelector(".vd-code-snippet-pane.is-active")||e.querySelector(".vd-code-snippet-pane");if(!n){console.warn("CodeSnippet: No code pane found");return}let o=(n.querySelector("code")||n).textContent,i;try{await navigator.clipboard.writeText(o),i=!0}catch{i=this.fallbackCopy(o)}this.showCopyFeedback(t,i);let a=new CustomEvent("codesnippet:copy",{bubbles:!0,detail:{snippet:e,code:o,success:i}});e.dispatchEvent(a)},fallbackCopy:function(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",t.style.top="-9999px",document.body.appendChild(t),t.focus(),t.select();let n=!1;try{n=document.execCommand("copy")}catch(s){console.warn("CodeSnippet: Fallback copy failed",s)}return document.body.removeChild(t),n},showCopyFeedback:function(e,t){if(t){e.classList.add("is-copied");let n=document.createElement("span");n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.className="sr-only",n.textContent="Code copied to clipboard",e.appendChild(n),setTimeout(()=>{e.classList.remove("is-copied"),n.parentNode&&n.parentNode.removeChild(n)},2e3)}},extractHtml:function(e){let t=e.dataset.extract;if(!t)return;let n=document.querySelector(t);if(!n){console.warn(`CodeSnippet: Source element not found: ${t}`);return}let s=n.innerHTML;s=this.formatHtml(s),s=this.escapeHtml(s),s=this.highlightHtml(s);let o=document.createElement("code");o.innerHTML=s,e.replaceChildren(o),e.dataset.extracted="true"},formatHtml:function(e){e=e.trim();let t=e.split(`
|
|
3
3
|
`),n=0,s=2,o=[];return t.forEach(i=>{if(i=i.trim(),!i)return;i.match(/^<\/\w/)&&(n=Math.max(0,n-s)),o.push(" ".repeat(n)+i);let a=/<[a-zA-Z]/.test(i),r=i.includes("/>");a&&!r&&(i.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)||i.match(/<\/\w+>$/)||(n+=s))}),o.join(`
|
|
4
4
|
`)},escapeHtml:function(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML},highlightHtml:function(e){return e=e.replace(/(<\/?)([\w-]+)/g,'$1<span class="code-tag">$2</span>'),e=e.replace(/([\w-]+)(=)("|')/g,'<span class="code-attr">$1</span>$2$3'),e=e.replace(/("|')([^&]*)("|')/g,'$1<span class="code-string">$2</span>$3'),e=e.replace(/(<!--)(.*?)(-->)/g,'<span class="code-comment">$1$2$3</span>'),e},highlightCss:function(e){return e=e.replace(/([.#]?[a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*\{)/g,'<span class="code-selector">$1</span>$2'),e=e.replace(/([a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*:)/g,'<span class="code-property">$1</span>$2'),e=e.replace(/:\s*([^;{}]+)(;)/g,': <span class="code-value">$1</span>$2'),e=e.replace(/(\d+)(px|rem|em|%|vh|vw|deg|s|ms)/g,'<span class="code-number">$1</span><span class="code-unit">$2</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},highlightJs:function(e){return["const","let","var","function","return","if","else","for","while","switch","case","break","continue","new","this","class","extends","import","export","default","async","await","try","catch","throw","typeof","instanceof"].forEach(n=>{let s=new RegExp(`\\b(${n})\\b`,"g");e=e.replace(s,'<span class="code-keyword">$1</span>')}),e=e.replace(/('(?:[^'\\]|\\.){0,10000}'|"(?:[^"\\]|\\.){0,10000}"|`(?:[^`\\]|\\.){0,10000}`)/g,'<span class="code-string">$1</span>'),e=e.replace(/\b(\d+\.?\d*)\b/g,'<span class="code-number">$1</span>'),e=e.replace(/\b([\w]+)(\s*\()/g,'<span class="code-function">$1</span>$2'),e=e.replace(/(\/\/.*$)/gm,'<span class="code-comment">$1</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},addLineNumbers:function(e){let t=e.querySelector("code");if(!t)return;let s=t.innerHTML.split(`
|
|
5
|
-
`).length,o=document.createElement("div");o.className="vd-code-snippet-line-numbers",o.setAttribute("aria-hidden","true");for(let a=1;a<=s;a++){let r=document.createElement("span");r.textContent=a,o.appendChild(r)}let i=document.createElement("div");i.className="vd-code-snippet-code",i.appendChild(t.cloneNode(!0)),t.parentNode.removeChild(t),e.appendChild(o),e.appendChild(i)},expand:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="true";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","true"),n&&(n.dataset.visible="true")},collapse:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="false";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","false"),n&&(n.dataset.visible="false")},showLang:function(e,t){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;let n=e.querySelector(`.vd-code-snippet-tab[data-lang="${t}"]`),s=e.querySelectorAll(".vd-code-snippet-tab"),o=e.querySelectorAll(".vd-code-snippet-pane");n&&this.switchTab(e,n,s,o)},destroy:function(e){typeof e=="string"&&(e=document.querySelector(e)),e&&(e._codeSnippetCleanup&&(e._codeSnippetCleanup.forEach(t=>t()),delete e._codeSnippetCleanup),delete e.dataset.initialized)},destroyAll:function(){document.querySelectorAll('.vd-code-snippet[data-initialized="true"]').forEach(t=>this.destroy(t))}};typeof window.Vanduo<"u"&&window.Vanduo.register("codeSnippet",m),window.CodeSnippet=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-collapsible, .accordion").forEach(t=>{this.instances.has(t)||this.initCollapsible(t)})},initCollapsible:function(e){let t=e.classList.contains("accordion"),n=e.querySelectorAll(".vd-collapsible-item, .accordion-item"),s=[];n.forEach(o=>{let i=o.querySelector(".vd-collapsible-header, .accordion-header"),a=o.querySelector(".vd-collapsible-body, .accordion-body"),r=o.querySelector(".vd-collapsible-trigger, .accordion-trigger")||i;if(!i||!a)return;o.classList.contains("is-open")?this.openItem(o,a,!1):this.closeItem(o,a,!1);let c=l=>{l.preventDefault(),this.toggleItem(o,a,e,t)};r.addEventListener("click",c),s.push(()=>r.removeEventListener("click",c))}),this.instances.set(e,{cleanup:s})},toggleItem:function(e,t,n,s){e.classList.contains("is-open")?this.closeItem(e,t):(s&&n.querySelectorAll(".vd-collapsible-item.is-open, .accordion-item.is-open").forEach(a=>{if(a!==e){let r=a.querySelector(".vd-collapsible-body, .accordion-body");this.closeItem(a,r)}}),this.openItem(e,t))},openItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.add("is-open"),e.setAttribute("aria-expanded","true");let s=t.scrollHeight;t.style.maxHeight=`${s}px`,n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:open",{bubbles:!0}))},closeItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),t.style.maxHeight="0",n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:close",{bubbles:!0}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.openItem(t,n)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.closeItem(t,n)}},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body"),s=t.closest(".vd-collapsible, .accordion"),o=s&&s.classList.contains("accordion");n&&this.toggleItem(t,n,s,o)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("collapsible",m),window.VanduoCollapsible=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-dropdown").forEach(t=>{this.instances.has(t)||this.initDropdown(t)})},initDropdown:function(e){let t=e.querySelector(".vd-dropdown-toggle"),n=e.querySelector(".vd-dropdown-menu");if(!t||!n)return;let s=[];t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),n.setAttribute("role","menu"),n.setAttribute("aria-hidden","true");let o=c=>{c.preventDefault(),c.stopPropagation(),this.toggleDropdown(e,t,n)};t.addEventListener("click",o),s.push(()=>t.removeEventListener("click",o));let i=c=>{!e.contains(c.target)&&n.classList.contains("is-open")&&this.closeDropdown(e,t,n)};document.addEventListener("click",i),s.push(()=>document.removeEventListener("click",i));let a=c=>{this.handleKeydown(c,e,t,n)};t.addEventListener("keydown",a),s.push(()=>t.removeEventListener("keydown",a)),n.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)").forEach(c=>{let l=h=>{h.preventDefault(),this.selectItem(c,e,t,n)};c.addEventListener("click",l),s.push(()=>c.removeEventListener("click",l));let f=h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),this.selectItem(c,e,t,n))};c.addEventListener("keydown",f),s.push(()=>c.removeEventListener("keydown",f))}),this.instances.set(e,{toggle:t,menu:n,cleanup:s,typeaheadBuffer:"",typeaheadTimer:null})},toggleDropdown:function(e,t,n){n.classList.contains("is-open")?this.closeDropdown(e,t,n):this.openDropdown(e,t,n)},openDropdown:function(e,t,n){document.querySelectorAll(".vd-dropdown-menu.is-open").forEach(i=>{if(i!==n){let a=i.closest(".vd-dropdown"),r=a.querySelector(".vd-dropdown-toggle");this.closeDropdown(a,r,i)}}),e.classList.add("is-open"),n.classList.add("is-open"),t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false"),this.positionMenu(e,n);let o=n.querySelector(".vd-dropdown-item:not(.disabled):not(.is-disabled)");o&&setTimeout(()=>o.focus(),0)},closeDropdown:function(e,t,n){e.classList.remove("is-open"),n.classList.remove("is-open"),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true"),t.focus()},positionMenu:function(e,t){let n=e.getBoundingClientRect(),s=t.getBoundingClientRect(),o=window.innerWidth,i=window.innerHeight,a=8;if(t.classList.remove("vd-dropdown-menu-end","vd-dropdown-menu-start","vd-dropdown-menu-top"),e.classList.contains("vd-dropdown-dropup")){t.classList.add("vd-dropdown-menu-top");return}e.classList.contains("vd-dropdown-dropright")||e.classList.contains("vd-dropdown-dropleft")||(n.left+s.width>o-a?t.classList.add("vd-dropdown-menu-end"):t.classList.add("vd-dropdown-menu-start"),n.bottom+s.height>i-a&&n.top-s.height>a&&t.classList.add("vd-dropdown-menu-top"))},handleKeydown:function(e,t,n,s){let o=s.classList.contains("is-open"),i=Array.from(s.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)")),a=i.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":case"ArrowDown":if(e.preventDefault(),!o)this.openDropdown(t,n,s);else if(e.key==="ArrowDown"){let r=a<i.length-1?a+1:0;i[r].focus()}break;case"ArrowUp":if(o){e.preventDefault();let r=a>0?a-1:i.length-1;i[r].focus()}break;case"Escape":o&&(e.preventDefault(),this.closeDropdown(t,n,s));break;case"Home":o&&(e.preventDefault(),i[0].focus());break;case"End":o&&(e.preventDefault(),i[i.length-1].focus());break;default:if(o&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let r=this.instances.get(t);if(!r)break;clearTimeout(r.typeaheadTimer),r.typeaheadBuffer+=e.key.toLowerCase();let c=i.find(l=>l.textContent.trim().toLowerCase().startsWith(r.typeaheadBuffer));c&&c.focus(),r.typeaheadTimer=setTimeout(()=>{r.typeaheadBuffer=""},500)}break}},selectItem:function(e,t,n,s){s.querySelectorAll(".vd-dropdown-item").forEach(o=>{o.classList.remove("active","is-active")}),e.classList.add("active","is-active"),(n.tagName==="BUTTON"||n.classList.contains("btn"))&&(n.textContent=e.textContent.trim()),this.closeDropdown(t,n,s),e.dispatchEvent(new CustomEvent("dropdown:select",{bubbles:!0,detail:{item:e,value:e.dataset.value||e.textContent}}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.openDropdown(t,n,s)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.closeDropdown(t,n,s)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("dropdown",m),window.VanduoDropdown=m})();(function(){"use strict";let m={STORAGE_KEY:"vanduo-font-preference",isInitialized:!1,fonts:{system:{name:"System Default",family:null},"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif",category:"sans-serif",description:"Friendly, humanist sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif",category:"sans-serif",description:"Neutral, highly readable"},lato:{name:"Lato",family:"'Lato', sans-serif",category:"sans-serif",description:"Friendly, rounded sans-serif"}},init:function(){if(this.state={preference:this.getPreference()},this.fonts[this.state.preference]||(this.state.preference="lato",this.setStorageValue(this.STORAGE_KEY,this.state.preference)),this.isInitialized){this.applyFont(),this.renderUI(),this.updateUI();return}this.isInitialized=!0,this.applyFont(),this.renderUI(),console.log("Vanduo Font Switcher initialized")},getPreference:function(){return this.getStorageValue(this.STORAGE_KEY,"lato")},setPreference:function(e){if(!this.fonts[e]){console.warn("Unknown font:",e);return}this.state.preference=e,this.setStorageValue(this.STORAGE_KEY,e),this.applyFont(),this.updateUI();let t=new CustomEvent("font:change",{bubbles:!0,detail:{font:e,fontData:this.fonts[e]}});document.dispatchEvent(t)},applyFont:function(){let e=this.state.preference;e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e)},renderUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.getAttribute("data-font-initialized")==="true"){t.tagName==="SELECT"&&(t.value=this.state.preference);return}if(t.tagName==="SELECT"){t.value=this.state.preference;let n=s=>{this.setPreference(s.target.value)};t.addEventListener("change",n),t._fontToggleHandler=n}else{let n=()=>{let s=Object.keys(this.fonts),i=(s.indexOf(this.state.preference)+1)%s.length;this.setPreference(s[i])};t.addEventListener("click",n),t._fontToggleHandler=n}t.setAttribute("data-font-initialized","true")})},updateUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.tagName==="SELECT")t.value=this.state.preference;else{let n=t.querySelector(".font-current-label");n&&(n.textContent=this.fonts[this.state.preference].name)}})},getCurrentFont:function(){return this.state.preference},getFontData:function(e){return this.fonts[e]||null},destroyAll:function(){document.querySelectorAll('[data-toggle="font"][data-font-initialized="true"]').forEach(t=>{if(t._fontToggleHandler){let n=t.tagName==="SELECT"?"change":"click";t.removeEventListener(n,t._fontToggleHandler),delete t._fontToggleHandler}t.removeAttribute("data-font-initialized")}),this.isInitialized=!1},getStorageValue:function(e,t){if(typeof window.safeStorageGet=="function")return window.safeStorageGet(e,t);try{let n=localStorage.getItem(e);return n!==null?n:t}catch{return t}},setStorageValue:function(e,t){if(typeof window.safeStorageSet=="function")return window.safeStorageSet(e,t);try{return localStorage.setItem(e,t),!0}catch{return!1}}};window.Vanduo&&window.Vanduo.register("fontSwitcher",m),window.FontSwitcher=m})();(function(){"use strict";let m=(function(){try{return CSS.supports("selector(:has(*))")}catch{return!1}})(),e={instances:new Map,init:function(){document.querySelectorAll("[data-layout-mode]").forEach(function(n){this.instances.has(n)||this.initContainer(n)}.bind(this)),this.initToggleButtons()},initContainer:function(t){let n=t.getAttribute("data-layout-mode")||"standard",s=[];this.applyMode(t,n),t.setAttribute("role","region"),t.setAttribute("aria-label","Grid layout: "+n+" mode"),this.instances.set(t,{cleanup:s,mode:n})},initToggleButtons:function(){document.querySelectorAll("[data-grid-toggle]").forEach(function(n){if(n.getAttribute("data-grid-initialized")==="true")return;let s=function(o){o.preventDefault();let i=n.getAttribute("data-grid-toggle"),a;i?a=document.querySelector(i):a=n.closest("[data-layout-mode]"),a&&this.toggle(a)}.bind(this);n.addEventListener("click",s),n.setAttribute("data-grid-initialized","true"),n.setAttribute("aria-pressed","false"),n._gridCleanup=function(){n.removeEventListener("click",s),n.removeAttribute("data-grid-initialized"),n.removeAttribute("aria-pressed")}}.bind(this))},applyFibFallback:function(t){if(m)return;t.querySelectorAll(".vd-row, .row").forEach(function(s){let i=s.querySelectorAll(':scope > [class*="vd-col-"], :scope > [class*="col-"]').length;i===1?s.style.gridTemplateColumns="1fr":i===2?s.style.gridTemplateColumns="1fr 1.618fr":i===3?s.style.gridTemplateColumns="2fr 3fr 5fr":i===4?s.style.gridTemplateColumns="1fr 2fr 3fr 5fr":s.style.gridTemplateColumns="repeat("+i+", 1fr)"})},removeFibFallback:function(t){t.querySelectorAll(".vd-row, .row").forEach(function(s){s.style.gridTemplateColumns=""})},applyMode:function(t,n){t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),n==="fibonacci"?(t.classList.add("vd-grid-fibonacci"),this.applyFibFallback(t)):(t.classList.add("vd-grid-standard"),this.removeFibFallback(t)),t.setAttribute("data-layout-mode",n),t.setAttribute("aria-label","Grid layout: "+n+" mode"),document.querySelectorAll("[data-grid-toggle]").forEach(function(a){let r=a.getAttribute("data-grid-toggle");if(r&&t.matches(r)){let c=n==="fibonacci";c?a.classList.add("is-active"):a.classList.remove("is-active"),a.setAttribute("aria-pressed",c?"true":"false")}});let o=this.instances.get(t);o&&(o.mode=n);let i;try{i=new CustomEvent("grid:modechange",{bubbles:!0,detail:{container:t,mode:n}})}catch{i=document.createEvent("CustomEvent"),i.initCustomEvent("grid:modechange",!0,!0,{container:t,mode:n})}t.dispatchEvent(i)},toggle:function(t){if(typeof t=="string"&&(t=document.querySelector(t)),!t)return;let s=(t.getAttribute("data-layout-mode")||"standard")==="fibonacci"?"standard":"fibonacci";this.applyMode(t,s)},setMode:function(t,n){typeof t=="string"&&(t=document.querySelector(t)),t&&(n!=="fibonacci"&&n!=="standard"||this.applyMode(t,n))},getMode:function(t){return typeof t=="string"&&(t=document.querySelector(t)),t?t.getAttribute("data-layout-mode")||"standard":null},destroy:function(t){let n=this.instances.get(t);n&&(n.cleanup.forEach(function(s){s()}),t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),t.removeAttribute("aria-label"),this.removeFibFallback(t),this.instances.delete(t))},destroyAll:function(){this.instances.forEach(function(n,s){this.destroy(s)}.bind(this)),document.querySelectorAll('[data-grid-initialized="true"]').forEach(function(n){n._gridCleanup&&(n._gridCleanup(),delete n._gridCleanup)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("gridLayout",e),window.VanduoGridLayout=e})();(function(){"use strict";let m={backdrop:null,container:null,img:null,closeBtn:null,caption:null,currentTrigger:null,scrollThreshold:50,initialScrollY:0,isOpen:!1,_cleanupFunctions:[],init:function(){this.createBackdrop(),this.bindTriggers()},createBackdrop:function(){if(this.backdrop||document.querySelector(".vd-image-box-backdrop")){this.backdrop||(this.backdrop=document.querySelector(".vd-image-box-backdrop"),this.container=this.backdrop.querySelector(".vd-image-box-container"),this.img=this.backdrop.querySelector(".vd-image-box-img"),this.closeBtn=this.backdrop.querySelector(".vd-image-box-close"),this.caption=this.backdrop.querySelector(".vd-image-box-caption"),this.bindBackdropEvents());return}this.backdrop=document.createElement("div"),this.backdrop.className="vd-image-box-backdrop",this.backdrop.setAttribute("role","dialog"),this.backdrop.setAttribute("aria-modal","true"),this.backdrop.setAttribute("aria-label","Image viewer"),this.backdrop.setAttribute("tabindex","-1"),this.container=document.createElement("div"),this.container.className="vd-image-box-container",this.img=document.createElement("img"),this.img.className="vd-image-box-img",this.img.alt="",this.closeBtn=document.createElement("button"),this.closeBtn.className="vd-image-box-close",this.closeBtn.setAttribute("aria-label","Close image viewer"),this.closeBtn.innerHTML="×",this.caption=document.createElement("div"),this.caption.className="vd-image-box-caption",this.container.appendChild(this.img),this.backdrop.appendChild(this.closeBtn),this.backdrop.appendChild(this.container),this.backdrop.appendChild(this.caption),document.body.appendChild(this.backdrop),this.bindBackdropEvents()},bindBackdropEvents:function(){let e=this,t=function(a){(a.target===e.backdrop||a.target===e.container)&&e.close()};this.backdrop.addEventListener("click",t),this._cleanupFunctions.push(()=>this.backdrop.removeEventListener("click",t));let n=function(){e.close()};this.img.addEventListener("click",n),this._cleanupFunctions.push(()=>this.img.removeEventListener("click",n));let s=function(){e.close()};this.closeBtn.addEventListener("click",s),this._cleanupFunctions.push(()=>this.closeBtn.removeEventListener("click",s));let o=function(a){a.key==="Escape"&&e.isOpen&&e.close()};document.addEventListener("keydown",o),this._cleanupFunctions.push(()=>document.removeEventListener("keydown",o));let i=function(){if(!e.isOpen)return;let a=window.scrollY;Math.abs(a-e.initialScrollY)>e.scrollThreshold&&e.close()};window.addEventListener("scroll",i,{passive:!0}),this._cleanupFunctions.push(()=>window.removeEventListener("scroll",i))},bindTriggers:function(){let e=this;document.querySelectorAll("[data-image-box]").forEach(function(n){if(n.dataset.imageBoxInitialized)return;if(n.dataset.imageBoxInitialized="true",n.classList.add("vd-image-box-trigger"),n.tagName==="IMG"){n.complete&&n.naturalWidth===0&&n.classList.add("is-broken");let o=function(){n.classList.add("is-broken")};n.addEventListener("error",o);let i=function(){n.classList.remove("is-broken")};n.addEventListener("load",i)}let s=function(o){o.preventDefault(),e.open(n)};if(n.addEventListener("click",s),n._imageBoxCleanup=()=>n.removeEventListener("click",s),n.tagName!=="BUTTON"&&n.tagName!=="A"){n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label","View enlarged image");let o=function(a){(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),e.open(n))};n.addEventListener("keydown",o);let i=n._imageBoxCleanup;n._imageBoxCleanup=()=>{i(),n.removeEventListener("keydown",o)}}})},open:function(e){if(this.isOpen)return;this.currentTrigger=e,this.isOpen=!0,this.initialScrollY=window.scrollY;let t=e.dataset.imageBoxFullSrc||e.dataset.imageBoxSrc||e.src||e.href;if(!t){console.warn("[Vanduo ImageBox] No image source found for trigger:",e);return}let n=e.dataset.imageBoxCaption||e.alt||"";this.img.src=t,this.img.alt=e.alt||"",n?(this.caption.textContent=n,this.caption.style.display="block"):this.caption.style.display="none";let s=window.innerWidth-document.documentElement.clientWidth;document.body.style.setProperty("--scrollbar-width",`${s}px`),document.body.classList.add("body-image-box-open"),this.backdrop.classList.add("is-visible"),this.backdrop.focus(),e.dispatchEvent(new CustomEvent("imageBox:open",{bubbles:!0,detail:{src:t}})),this.img.complete||(this.img.style.opacity="0",this._imgLoadHandler=()=>{this.img.style.opacity=""},this.img.addEventListener("load",this._imgLoadHandler,{once:!0}))},close:function(){this.isOpen&&(this.isOpen=!1,this.backdrop.classList.remove("is-visible"),document.body.classList.remove("body-image-box-open"),document.body.style.removeProperty("--scrollbar-width"),this.currentTrigger&&(this.currentTrigger.focus(),this.currentTrigger.dispatchEvent(new CustomEvent("imageBox:close",{bubbles:!0})),this.currentTrigger=null),setTimeout(()=>{this.isOpen||(this._imgLoadHandler&&(this.img.removeEventListener("load",this._imgLoadHandler),this._imgLoadHandler=null),this.img.src="",this.img.alt="")},300))},reinit:function(){this.bindTriggers()},destroy:function(){this.isOpen&&this.close(),this.backdrop&&this.backdrop.parentNode&&this.backdrop.parentNode.removeChild(this.backdrop),this._cleanupFunctions.forEach(t=>t()),this._cleanupFunctions=[],document.querySelectorAll("[data-image-box-initialized]").forEach(t=>{t.classList.remove("vd-image-box-trigger"),t._imageBoxCleanup&&(t._imageBoxCleanup(),delete t._imageBoxCleanup),delete t.dataset.imageBoxInitialized}),this.backdrop=null,this.container=null,this.img=null,this.closeBtn=null,this.caption=null,this.currentTrigger=null,this.isOpen=!1},destroyAll:function(){this.destroy()}};typeof window.Vanduo<"u"&&window.Vanduo.register("imageBox",m),window.VanduoImageBox=m})();(function(){"use strict";let m={modals:new Map,openModals:[],zIndexCounter:1050,_triggerCleanups:[],_sharedEscHandler:null,getPortalState:function(e){return e._vdPortalState||(e._vdPortalState={originalParent:null,originalNextSibling:null,placeholder:null}),e._vdPortalState},portalToBody:function(e){if(!e||e.parentNode===document.body)return;let t=this.getPortalState(e);t.originalParent=e.parentNode,t.originalNextSibling=e.nextSibling,t.placeholder||(t.placeholder=document.createComment("vd-modal-placeholder")),t.originalParent.insertBefore(t.placeholder,e),document.body.appendChild(e),e.dataset.vdPortaled="true"},restoreFromPortal:function(e){if(!e)return;let t=this.getPortalState(e);if(!t.placeholder){delete e.dataset.vdPortaled;return}t.placeholder.parentNode?(t.placeholder.parentNode.insertBefore(e,t.placeholder),t.placeholder.parentNode.removeChild(t.placeholder)):t.originalParent&&t.originalParent.isConnected&&(t.originalNextSibling&&t.originalNextSibling.parentNode===t.originalParent?t.originalParent.insertBefore(e,t.originalNextSibling):t.originalParent.appendChild(e)),t.originalParent=null,t.originalNextSibling=null,t.placeholder=null,delete e.dataset.vdPortaled},init:function(){document.querySelectorAll(".vd-modal").forEach(n=>{this.modals.has(n)||this.initModal(n)}),document.querySelectorAll("[data-modal]").forEach(n=>{if(n.dataset.modalTriggerInitialized)return;n.dataset.modalTriggerInitialized="true";let s=o=>{o.preventDefault();let i=n.dataset.modal,a=document.querySelector(i);a&&this.open(a)};n.addEventListener("click",s),this._triggerCleanups.push(()=>n.removeEventListener("click",s))})},initModal:function(e){let t=this.createBackdrop(e),n=e.querySelectorAll('.vd-modal-close, [data-dismiss="modal"]'),s=e.querySelector(".vd-modal-dialog");if(!s)return;let o=[];e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-hidden","true"),e.id||(e.id="modal-"+Math.random().toString(36).substr(2,9));let i=e.querySelector(".vd-modal-title");i&&!i.id&&(i.id=e.id+"-title",e.setAttribute("aria-labelledby",i.id)),n.forEach(r=>{let c=()=>{this.close(e)};r.addEventListener("click",c),o.push(()=>r.removeEventListener("click",c))});let a=r=>{r.target===t&&e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",a),o.push(()=>t.removeEventListener("click",a)),this._sharedEscHandler||(this._sharedEscHandler=r=>{if(r.key==="Escape"&&this.openModals.length>0){let c=this.openModals[this.openModals.length-1];c.dataset.keyboard!=="false"&&this.close(c)}},document.addEventListener("keydown",this._sharedEscHandler)),this.modals.set(e,{backdrop:t,dialog:s,trapHandler:null,cleanup:o})},createBackdrop:function(e){let t=e.querySelector(".vd-modal-backdrop");return t||(t=document.createElement("div"),t.className="vd-modal-backdrop",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,dialog:o}=n;if(this.portalToBody(t),this.zIndexCounter+=10,t.style.zIndex=this.zIndexCounter,s.style.zIndex=this.zIndexCounter-1,this.openModals.push(t),s.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),this.openModals.length===1){document.body.classList.add("body-modal-open");let a=window.innerWidth-document.documentElement.clientWidth;a>0&&(document.body.style.paddingRight=`${a}px`)}let i=this.trapFocus(t);n.trapHandler=i,setTimeout(()=>{let a=this.getFocusableElements(t)[0];a&&a.focus()},100),t.dispatchEvent(new CustomEvent("modal:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,trapHandler:o}=n;o&&(t.removeEventListener("keydown",o),n.trapHandler=null);let i=this.openModals.indexOf(t);if(i>-1&&this.openModals.splice(i,1),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),this.openModals.length===0)s.classList.remove("is-visible"),document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050;else{let r=this.openModals[this.openModals.length-1];this.modals.get(r).backdrop.classList.add("is-visible")}let a=document.querySelector(`[data-modal="#${t.id}"]`);a&&a.focus(),t.dispatchEvent(new CustomEvent("modal:close",{bubbles:!0})),this.restoreFromPortal(t)},trapFocus:function(e){let t=this,n=function(s){if(s.key!=="Tab")return;let o=t.getFocusableElements(e),i=o[0],a=o[o.length-1];s.shiftKey?document.activeElement===i&&(s.preventDefault(),a.focus()):document.activeElement===a&&(s.preventDefault(),i.focus())};return e.addEventListener("keydown",n),n},getFocusableElements:function(e){return Array.from(e.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(n=>!n.hasAttribute("disabled")&&n.offsetWidth>0&&n.offsetHeight>0)},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},destroy:function(e){let t=this.modals.get(e);if(t){if(e.classList.contains("is-open")){let n=this.openModals.indexOf(e);n>-1&&this.openModals.splice(n,1),t.backdrop.classList.remove("is-visible"),e.classList.remove("is-open"),e.setAttribute("aria-hidden","true"),this.openModals.length===0&&(document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050)}this.restoreFromPortal(e),t.cleanup&&t.cleanup.forEach(n=>n()),t.backdrop&&t.backdrop.parentNode&&t.backdrop.parentNode.removeChild(t.backdrop),this.modals.delete(e)}},destroyAll:function(){this.modals.forEach((e,t)=>{this.destroy(t)}),this._triggerCleanups.forEach(e=>e()),this._triggerCleanups=[],this._sharedEscHandler&&(document.removeEventListener("keydown",this._sharedEscHandler),this._sharedEscHandler=null)}};typeof window.Vanduo<"u"&&window.Vanduo.register("modals",m),window.VanduoModals=m})();(function(){"use strict";let m={instances:new Map,getBreakpoint:function(){let t=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-lg").trim(),n=parseInt(t,10);return isNaN(n)?992:n},init:function(){document.querySelectorAll(".vd-navbar").forEach(t=>{this.instances.has(t)||this.initNavbar(t)})},initScrollWatcher:function(e){let t=e.classList.contains("vd-navbar-glass"),n=e.classList.contains("vd-navbar-transparent");if(!t&&!n)return null;let s=()=>{let i=parseInt(e.dataset.scrollThreshold,10);return isNaN(i)?e.offsetHeight||60:i},o=()=>{let i=window.scrollY>s();e.classList.toggle("vd-navbar-scrolled",i)};return o(),window.addEventListener("scroll",o,{passive:!0}),()=>window.removeEventListener("scroll",o)},initNavbar:function(e){let t=e.querySelector(".vd-navbar-toggle, .vd-navbar-burger"),n=e.querySelector(".vd-navbar-menu"),s=e.querySelector(".vd-navbar-overlay")||this.createOverlay(e),o=[],i=this.initScrollWatcher(e);if(i&&o.push(i),!t||!n){o.length&&this.instances.set(e,{toggle:null,menu:null,overlay:null,cleanup:o});return}let a=u=>{u.preventDefault(),u.stopPropagation(),this.toggleMenu(e,t,n,s)};if(t.addEventListener("click",a),o.push(()=>t.removeEventListener("click",a)),s){let u=()=>{this.closeMenu(e,t,n,s)};s.addEventListener("click",u),o.push(()=>s.removeEventListener("click",u))}let r=u=>{u.key==="Escape"&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)};document.addEventListener("keydown",r),o.push(()=>document.removeEventListener("keydown",r));let c,l=()=>{clearTimeout(c),c=setTimeout(()=>{let u=this.getBreakpoint();window.innerWidth>=u&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)},250)};window.addEventListener("resize",l),o.push(()=>{clearTimeout(c),window.removeEventListener("resize",l)});let f=u=>{n.classList.contains("is-open")&&!e.contains(u.target)&&!n.contains(u.target)&&this.closeMenu(e,t,n,s)};document.addEventListener("click",f),o.push(()=>document.removeEventListener("click",f)),n.querySelectorAll(".vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link").forEach(u=>{let d=p=>{let b=this.getBreakpoint();if(window.innerWidth<b){p.preventDefault();let L=u.parentElement.querySelector(".vd-navbar-dropdown-menu");L&&L.classList.toggle("is-open")}};u.addEventListener("click",d),o.push(()=>u.removeEventListener("click",d))}),this.instances.set(e,{toggle:t,menu:n,overlay:s,cleanup:o})},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})},toggleMenu:function(e,t,n,s){n.classList.contains("is-open")?this.closeMenu(e,t,n,s):this.openMenu(e,t,n,s)},openMenu:function(e,t,n,s){n.classList.add("is-open"),t.classList.add("is-active"),s&&s.classList.add("is-active"),document.body.classList.add("body-navbar-open"),t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false")},closeMenu:function(e,t,n,s){n.classList.remove("is-open"),t.classList.remove("is-active"),s&&s.classList.remove("is-active"),document.body.classList.remove("body-navbar-open"),n.querySelectorAll(".vd-navbar-dropdown-menu.is-open").forEach(i=>{i.classList.remove("is-open")}),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true")},createOverlay:function(e){let t=document.createElement("div");return t.className="vd-navbar-overlay",document.body.appendChild(t),t}};typeof window.Vanduo<"u"&&window.Vanduo.register("navbar",m),window.VanduoNavbar=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-pagination[data-pagination]").forEach(t=>{this.instances.has(t)||this.initPagination(t)})},initPagination:function(e){let t=parseInt(e.dataset.totalPages)||1,n=parseInt(e.dataset.currentPage)||1,s=parseInt(e.dataset.maxVisible)||7;this.render(e,{totalPages:t,currentPage:n,maxVisible:s});let o=i=>{let a=i.target.closest(".vd-pagination-link");if(!a||a.closest(".vd-pagination-item.disabled")||a.closest(".vd-pagination-item.active"))return;i.preventDefault();let r=a.closest(".vd-pagination-item"),c=r.dataset.page;c?this.goToPage(e,parseInt(c)):r.classList.contains("pagination-prev")?this.prevPage(e):r.classList.contains("pagination-next")&&this.nextPage(e)};e.addEventListener("click",o),this.instances.set(e,{cleanup:[()=>e.removeEventListener("click",o)]})},render:function(e,t){let{totalPages:n,currentPage:s,maxVisible:o}=t;if(n<=1){e.innerHTML="";return}let i="";i+=`<li class="vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${s===1?"disabled":""}">`,i+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Previous">Previous</a>',i+="</li>";let a=this.calculatePages(s,n,o),r=0;a.forEach(c=>{if(c==="ellipsis")i+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>';else{c!==r+1&&r>0&&(i+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>');let l=Number(c);i+=`<li class="vd-pagination-item pagination-item ${l===s?"active":""}" data-page="${l}">`,i+=`<a class="vd-pagination-link pagination-link" href="#" aria-label="Page ${l}">${l}</a>`,i+="</li>",r=c}}),i+=`<li class="vd-pagination-item vd-pagination-next pagination-item pagination-next ${s===n?"disabled":""}">`,i+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Next">Next</a>',i+="</li>",e.innerHTML=i,e.dataset.currentPage=s},calculatePages:function(e,t,n){let s=[],o=Math.floor(n/2);if(t<=n)for(let i=1;i<=t;i++)s.push(i);else{s.push(1);let i=Math.max(2,e-o),a=Math.min(t-1,e+o);e<=o+1&&(a=Math.min(t-1,n-1)),e>=t-o&&(i=Math.max(2,t-n+2)),i>2&&s.push("ellipsis");for(let r=i;r<=a;r++)s.push(r);a<t-1&&s.push("ellipsis"),t>1&&s.push(t)}return s},goToPage:function(e,t){let n=parseInt(e.dataset.totalPages)||1,s=parseInt(e.dataset.maxVisible)||7;t<1||t>n||(this.render(e,{totalPages:n,currentPage:t,maxVisible:s}),e.dispatchEvent(new CustomEvent("pagination:change",{bubbles:!0,detail:{page:t,totalPages:n}})))},prevPage:function(e){let t=parseInt(e.dataset.currentPage)||1;t>1&&this.goToPage(e,t-1)},nextPage:function(e){let t=parseInt(e.dataset.currentPage)||1,n=parseInt(e.dataset.totalPages)||1;t<n&&this.goToPage(e,t+1)},update:function(e,t){let n=typeof e=="string"?document.querySelector(e):e;n&&(t.totalPages!==void 0&&(n.dataset.totalPages=t.totalPages),t.currentPage!==void 0&&(n.dataset.currentPage=t.currentPage),t.maxVisible!==void 0&&(n.dataset.maxVisible=t.maxVisible),this.render(n,{totalPages:parseInt(n.dataset.totalPages)||1,currentPage:parseInt(n.dataset.currentPage)||1,maxVisible:parseInt(n.dataset.maxVisible)||7}))},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("pagination",m),window.VanduoPagination=m})();(function(){"use strict";let m={parallaxElements:new Map,ticking:!1,isMobile:window.innerWidth<768,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,isInitialized:!1,_onScroll:null,_onResize:null,init:function(){if(this.isInitialized){this.refresh();return}if(this.isInitialized=!0,this.reducedMotion)return;document.querySelectorAll(".vd-parallax").forEach(t=>{t.dataset.parallaxInitialized||this.initParallax(t)}),this.handleScroll(),this._onScroll=()=>{this.handleScroll()},window.addEventListener("scroll",this._onScroll,{passive:!0}),this._onResize=()=>{this.isMobile=window.innerWidth<768,this.updateAll()},window.addEventListener("resize",this._onResize)},initParallax:function(e){e.dataset.parallaxInitialized="true";let t=e.classList.contains("parallax-disable-mobile");if(t&&this.isMobile)return;let n=e.querySelectorAll(".vd-parallax-layer, .vd-parallax-bg"),s=this.getSpeed(e),o=e.classList.contains("parallax-horizontal")?"horizontal":"vertical";this.parallaxElements.set(e,{layers:Array.from(n),speed:s,direction:o,disableMobile:t}),this.updateParallax(e)},getSpeed:function(e){return e.classList.contains("parallax-slow")?.5:e.classList.contains("parallax-fast")?1.5:1},handleScroll:function(){this.ticking||(window.requestAnimationFrame(()=>{this.updateAll(),this.ticking=!1}),this.ticking=!0)},updateAll:function(){this.parallaxElements.forEach((e,t)=>{e.disableMobile&&this.isMobile||this.updateParallax(t)})},updateParallax:function(e){let t=this.parallaxElements.get(e);if(!t)return;let n=e.getBoundingClientRect(),s=window.innerHeight,o=n.top,i=n.height,r=(Math.max(0,Math.min(1,(s-o)/(s+i)))-.5)*t.speed*100;t.layers.forEach((c,l)=>{let f=c.dataset.parallaxSpeed?parseFloat(c.dataset.parallaxSpeed):1,h=r*f;t.direction==="horizontal"?c.style.transform=`translateX(${h}px)`:c.style.transform=`translateY(${h}px)`})},destroy:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.parallaxElements.has(t)&&(this.parallaxElements.get(t).layers.forEach(s=>{s.style.transform=""}),this.parallaxElements.delete(t))},refresh:function(){this.updateAll()},destroyAll:function(){this.parallaxElements.forEach((e,t)=>{this.destroy(t)}),this.parallaxElements.clear(),this._onScroll&&(window.removeEventListener("scroll",this._onScroll),this._onScroll=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null),this.isInitialized=!1}};typeof window.Vanduo<"u"&&window.Vanduo.register("parallax",m),window.VanduoParallax=m})();(function(){"use strict";let m={init:function(){document.querySelectorAll(".vd-progress-bar[data-progress], .progress-bar[data-progress]").forEach(t=>{t.dataset.progressInitialized||this.initProgressBar(t)})},initProgressBar:function(e){e.dataset.progressInitialized="true";let t=parseInt(e.dataset.progress)||0;this.setProgress(e,t,!1)},setProgress:function(e,t,n=!0){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;t=Math.max(0,Math.min(100,t)),n?s.style.transition="width var(--transition-duration-slow) var(--transition-ease)":(s.style.transition="none",setTimeout(()=>{s.style.transition=""},0)),s.style.width=t+"%",s.setAttribute("aria-valuenow",t),s.setAttribute("aria-valuemin",0),s.setAttribute("aria-valuemax",100);let o=s.querySelector(".vd-progress-text, .progress-text");o&&(o.textContent=t+"%"),s.dispatchEvent(new CustomEvent("progress:update",{bubbles:!0,detail:{value:t,max:100}})),t>=100&&s.dispatchEvent(new CustomEvent("progress:complete",{bubbles:!0,detail:{value:t,max:100}}))},animateProgress:function(e,t,n=1e3){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;let o=parseInt(s.style.width)||0,i=t-o,a=performance.now(),r=c=>{let l=c-a,f=Math.min(l/n,1),h=1-Math.pow(1-f,3),u=o+i*h;this.setProgress(s,u,!1),f<1&&requestAnimationFrame(r)};requestAnimationFrame(r)},show:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="inline-block",t.setAttribute("aria-hidden","false"))},hide:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display==="none"||t.getAttribute("aria-hidden")==="true"?this.show(t):this.hide(t))},destroyAll:function(){document.querySelectorAll('.vd-progress-bar[data-progress-initialized="true"], .progress-bar[data-progress-initialized="true"]').forEach(t=>{delete t.dataset.progressInitialized})}};typeof window.Vanduo<"u"&&window.Vanduo.register("preloader",m),window.VanduoPreloader=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll("select.vd-custom-select-input, select[data-custom-select]").forEach(t=>{this.instances.has(t)||this.initSelect(t)})},initSelect:function(e){if(e.closest(".vd-custom-select-wrapper"))return;let t=[],n=document.createElement("div");n.className="custom-select-wrapper",e.parentNode.insertBefore(n,e),n.appendChild(e);let s=document.createElement("button");s.type="button",s.className="custom-select-button",s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-labelledby",e.id||this.generateId(e));let o=document.createElement("div");if(o.className="custom-select-dropdown",o.setAttribute("role","listbox"),e.dataset.searchable==="true"){let l=document.createElement("div");l.className="custom-select-search";let f=document.createElement("input");f.type="text",f.className="input input-sm",f.placeholder="Search...",f.setAttribute("aria-label","Search options"),l.appendChild(f),o.appendChild(l);let h=d=>{this.filterOptions(o,d.target.value)},u=typeof debounce=="function"?debounce(h,150):h;f.addEventListener("input",u),t.push(()=>f.removeEventListener("input",u))}this.buildOptions(e,o,s),n.appendChild(s),n.appendChild(o),this.updateButtonText(e,s);let i=l=>{l.preventDefault(),l.stopPropagation(),this.toggleDropdown(s,o)};s.addEventListener("click",i),t.push(()=>s.removeEventListener("click",i));let a=l=>{!n.contains(l.target)&&o.classList.contains("is-open")&&this.closeDropdown(s,o)};document.addEventListener("click",a),t.push(()=>document.removeEventListener("click",a));let r=l=>{this.handleKeydown(l,e,s,o)};s.addEventListener("keydown",r),t.push(()=>s.removeEventListener("keydown",r));let c=()=>{this.updateButtonText(e,s),this.updateSelectedOptions(e,o)};e.addEventListener("change",c),t.push(()=>e.removeEventListener("change",c)),this.instances.set(e,{wrapper:n,button:s,dropdown:o,cleanup:t,typeaheadBuffer:"",typeaheadTimer:null})},buildOptions:function(e,t,n){let s=e.querySelectorAll("option"),o=document.createDocumentFragment();s.forEach((i,a)=>{if(i.parentElement.tagName==="OPTGROUP"){let c=i.parentElement;if(!t.querySelector(`[data-group="${c.label}"]`)){let l=document.createElement("div");l.className="custom-select-option-group",l.textContent=c.label,l.dataset.group=c.label,o.appendChild(l)}}if(i.value===""&&!i.textContent.trim())return;let r=document.createElement("div");r.className="custom-select-option",r.textContent=i.textContent,r.setAttribute("role","option"),r.setAttribute("data-value",i.value),r.setAttribute("data-index",a),i.selected&&(r.classList.add("is-selected"),r.setAttribute("aria-selected","true")),i.disabled&&(r.classList.add("is-disabled"),r.setAttribute("aria-disabled","true")),r.addEventListener("click",c=>{i.disabled||this.selectOption(e,i,r,n,t)}),o.appendChild(r)}),t.appendChild(o)},selectOption:function(e,t,n,s,o){e.multiple?(t.selected=!t.selected,n.classList.toggle("is-selected"),n.setAttribute("aria-selected",t.selected)):(e.value=t.value,e.dispatchEvent(new Event("change",{bubbles:!0})),this.closeDropdown(s,o)),this.updateButtonText(e,s)},updateButtonText:function(e,t){if(e.multiple){let n=Array.from(e.selectedOptions);n.length===0?t.textContent=e.dataset.placeholder||"Select options...":n.length===1?t.textContent=n[0].textContent:t.textContent=`${n.length} selected`}else{let n=e.options[e.selectedIndex];t.textContent=n?n.textContent:e.dataset.placeholder||"Select..."}},updateSelectedOptions:function(e,t){let n=t.querySelectorAll(".custom-select-option"),s=Array.from(e.selectedOptions).map(o=>o.value);n.forEach(o=>{let i=o.dataset.value;s.includes(i)?(o.classList.add("is-selected"),o.setAttribute("aria-selected","true")):(o.classList.remove("is-selected"),o.setAttribute("aria-selected","false"))})},toggleDropdown:function(e,t){t.classList.contains("is-open")?this.closeDropdown(e,t):this.openDropdown(e,t)},openDropdown:function(e,t){t.classList.add("is-open"),e.setAttribute("aria-expanded","true");let n=t.querySelector(".custom-select-option:not(.is-disabled)");n&&n.focus()},closeDropdown:function(e,t){t.classList.remove("is-open"),e.setAttribute("aria-expanded","false")},handleKeydown:function(e,t,n,s){let o=s.classList.contains("is-open"),i=Array.from(s.querySelectorAll(".custom-select-option:not(.is-disabled)")),a=i.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":if(e.preventDefault(),o&&a>=0){let r=i[a],c=t.options[parseInt(r.dataset.index)];this.selectOption(t,c,r,n,s)}else this.openDropdown(n,s);break;case"Escape":o&&(e.preventDefault(),this.closeDropdown(n,s),n.focus());break;case"ArrowDown":if(e.preventDefault(),!o)this.openDropdown(n,s);else{let r=a<i.length-1?a+1:0;i[r].focus()}break;case"ArrowUp":if(e.preventDefault(),o){let r=a>0?a-1:i.length-1;i[r].focus()}break;case"Home":o&&(e.preventDefault(),i[0].focus());break;case"End":o&&(e.preventDefault(),i[i.length-1].focus());break;default:if(o&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let r=this.instances.get(t);if(!r)break;clearTimeout(r.typeaheadTimer),r.typeaheadBuffer+=e.key.toLowerCase();let c=i.find(l=>l.textContent.trim().toLowerCase().startsWith(r.typeaheadBuffer));c&&c.focus(),r.typeaheadTimer=setTimeout(()=>{r.typeaheadBuffer=""},500)}break}},filterOptions:function(e,t){let n=e.querySelectorAll(".vd-custom-select-option"),s=t.toLowerCase();n.forEach(o=>{o.textContent.toLowerCase().includes(s)?o.style.display="block":o.style.display="none"})},generateId:function(e){if(e.id)return e.id;let t="select-"+Math.random().toString(36).substr(2,9);return e.id=t,t},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.wrapper&&t.wrapper.parentNode&&(t.wrapper.parentNode.insertBefore(e,t.wrapper),t.wrapper.parentNode.removeChild(t.wrapper)),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("select",m)})();(function(){"use strict";let m={sidenavs:new Map,breakpoint:992,restoreDelayMs:450,_globalCleanups:[],isFixedVariant:function(e){return e.classList.contains("vd-sidenav-fixed")||e.classList.contains("sidenav-fixed")},isPushVariant:function(e){return e.classList.contains("vd-sidenav-push")||e.classList.contains("sidenav-push")},isRightVariant:function(e){return e.classList.contains("vd-sidenav-right")||e.classList.contains("sidenav-right")},getPortalState:function(e){return e._vdPortalState||(e._vdPortalState={originalParent:null,originalNextSibling:null,placeholder:null,restoreTimer:null,restoreHandler:null}),e._vdPortalState},cancelScheduledRestore:function(e){let t=this.getPortalState(e);t.restoreHandler&&(e.removeEventListener("transitionend",t.restoreHandler),t.restoreHandler=null),t.restoreTimer&&(window.clearTimeout(t.restoreTimer),t.restoreTimer=null)},portalToBody:function(e){if(!e)return;if(e.parentNode===document.body){this.cancelScheduledRestore(e);return}let t=this.getPortalState(e);this.cancelScheduledRestore(e),t.originalParent=e.parentNode,t.originalNextSibling=e.nextSibling,t.placeholder||(t.placeholder=document.createComment("vd-sidenav-placeholder")),t.originalParent.insertBefore(t.placeholder,e),document.body.appendChild(e),e.dataset.vdPortaled="true"},restoreFromPortal:function(e){if(!e)return;let t=this.getPortalState(e);if(this.cancelScheduledRestore(e),!t.placeholder){delete e.dataset.vdPortaled;return}t.placeholder.parentNode?(t.placeholder.parentNode.insertBefore(e,t.placeholder),t.placeholder.parentNode.removeChild(t.placeholder)):t.originalParent&&t.originalParent.isConnected&&(t.originalNextSibling&&t.originalNextSibling.parentNode===t.originalParent?t.originalParent.insertBefore(e,t.originalNextSibling):t.originalParent.appendChild(e)),t.originalParent=null,t.originalNextSibling=null,t.placeholder=null,delete e.dataset.vdPortaled},scheduleRestoreFromPortal:function(e){if(!e||e.parentNode!==document.body)return;let t=this.getPortalState(e);this.cancelScheduledRestore(e);let n=()=>{this.restoreFromPortal(e)},s=o=>{o.target!==e||o.propertyName!=="transform"||n()};t.restoreHandler=s,e.addEventListener("transitionend",s),t.restoreTimer=window.setTimeout(()=>{n()},this.restoreDelayMs)},init:function(){document.querySelectorAll(".vd-sidenav, .vd-offcanvas").forEach(s=>{this.sidenavs.has(s)||this.initSidenav(s)}),document.querySelectorAll("[data-sidenav-toggle]").forEach(s=>{if(s.dataset.sidenavToggleInitialized)return;s.dataset.sidenavToggleInitialized="true";let o=i=>{i.preventDefault();let a=s.dataset.sidenavToggle,r=document.querySelector(a);r&&this.toggle(r)};s.addEventListener("click",o),this._globalCleanups.push(()=>s.removeEventListener("click",o))}),this.handleResize();let n=()=>{this.handleResize()};window.addEventListener("resize",n),this._globalCleanups.push(()=>window.removeEventListener("resize",n))},initSidenav:function(e){let t=e.getAttribute("data-vd-position");if(t){let r=e.classList.contains("vd-offcanvas")?"vd-offcanvas":"vd-sidenav";e.classList.add(r+"-"+t)}let n=this.createOverlay(e),s=e.querySelector(".vd-sidenav-close, .vd-offcanvas-close"),o=[];if(e.setAttribute("role","navigation"),e.setAttribute("aria-hidden","true"),s){let r=()=>{this.close(e)};s.addEventListener("click",r),o.push(()=>s.removeEventListener("click",r))}let i=()=>{e.dataset.backdrop!=="static"&&this.close(e)};n.addEventListener("click",i),o.push(()=>n.removeEventListener("click",i));let a=r=>{r.key==="Escape"&&e.classList.contains("is-open")&&e.dataset.keyboard!=="false"&&this.close(e)};document.addEventListener("keydown",a),o.push(()=>document.removeEventListener("keydown",a)),this.sidenavs.set(e,{overlay:n,cleanup:o})},createOverlay:function(e){let t=e.querySelector(".vd-sidenav-overlay");return t||(t=document.createElement("div"),t.className="vd-sidenav-overlay",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);this.portalToBody(t),this.isFixedVariant(t)||n.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),document.body.classList.add("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!0),t.dispatchEvent(new CustomEvent("sidenav:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);n.classList.remove("is-visible"),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),document.body.classList.remove("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!1),t.dispatchEvent(new CustomEvent("sidenav:close",{bubbles:!0})),this.scheduleRestoreFromPortal(t)},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},handlePushVariant:function(e,t){let n=document.querySelector('main, .main-content, .content, [role="main"]')||document.body;t?window.innerWidth>=this.breakpoint&&(this.isRightVariant(e)?n.style.marginRight=e.offsetWidth+"px":n.style.marginLeft=e.offsetWidth+"px"):(n.style.marginLeft="",n.style.marginRight="")},handleResize:function(){this.sidenavs.forEach(({overlay:e},t)=>{window.innerWidth>=this.breakpoint?this.isFixedVariant(t)&&!t.classList.contains("is-open")&&(t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),e.classList.remove("is-visible")):this.isFixedVariant(t)&&t.classList.contains("is-open")&&this.close(t)})},destroy:function(e){let t=this.sidenavs.get(e);t&&(e.classList.contains("is-open")&&(t.overlay.classList.remove("is-visible"),e.classList.remove("is-open"),e.setAttribute("aria-hidden","true"),document.body.classList.remove("body-sidenav-open")),this.restoreFromPortal(e),t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.sidenavs.delete(e))},destroyAll:function(){this.sidenavs.forEach((e,t)=>{this.destroy(t)}),this._globalCleanups.forEach(e=>e()),this._globalCleanups=[]}};typeof window.Vanduo<"u"&&window.Vanduo.register("sidenav",m),window.VanduoSidenav=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-tabs, [data-tabs]").forEach(t=>{this.instances.has(t)||this.initTabs(t)})},initTabs:function(e){let t=e.querySelector('.vd-tab-list, [role="tablist"]'),n=e.querySelectorAll(".vd-tab-link, [data-tab]"),s=e.querySelectorAll(".vd-tab-pane, [data-tab-pane]");if(!t||n.length===0)return;let o=[];t.setAttribute("role","tablist"),n.forEach((a,r)=>{let c=this.getTabId(a,r),l=this.findPane(e,c,s);a.setAttribute("role","tab"),a.setAttribute("aria-selected",a.classList.contains("is-active")?"true":"false"),a.setAttribute("tabindex",a.classList.contains("is-active")?"0":"-1"),a.id||(a.id=`tab-btn-${c}`),l&&(l.setAttribute("role","tabpanel"),l.setAttribute("aria-labelledby",a.id),l.id||(l.id=`tab-pane-${c}`),a.setAttribute("aria-controls",l.id));let f=u=>{u.preventDefault(),!a.classList.contains("disabled")&&!a.disabled&&this.activateTab(e,a,n,s)};a.addEventListener("click",f),o.push(()=>a.removeEventListener("click",f));let h=u=>{this.handleKeydown(u,e,a,n,s)};a.addEventListener("keydown",h),o.push(()=>a.removeEventListener("keydown",h))}),!e.querySelector(".vd-tab-link.is-active, [data-tab].is-active")&&n.length>0&&this.activateTab(e,n[0],n,s),this.instances.set(e,{cleanup:o})},getTabId:function(e,t){return e.dataset.tabTarget||e.dataset.tab||e.getAttribute("href")?.replace("#","")||(typeof t=="number"?`tab-${t}`:e.id)},findPane:function(e,t,n){let s=e.querySelector(`[data-tab-pane="${t}"]`);return s||(s=e.querySelector(`#${t}`)),s||e.querySelectorAll(".vd-tab-link, [data-tab]").forEach((i,a)=>{this.getTabId(i,a)===t&&n[a]&&(s=n[a])}),s},activateTab:function(e,t,n,s){let o=Array.from(n).indexOf(t),i=this.getTabId(t,o);n.forEach(c=>{c.classList.remove("is-active"),c.setAttribute("aria-selected","false"),c.setAttribute("tabindex","-1"),c.parentElement&&c.parentElement.classList.contains("tab-item")&&c.parentElement.classList.remove("is-active")}),s.forEach(c=>{c.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),t.parentElement&&t.parentElement.classList.contains("tab-item")&&t.parentElement.classList.add("is-active");let a=this.findPane(e,i,s);a&&a.classList.add("is-active");let r=new CustomEvent("tab:change",{bubbles:!0,detail:{tab:t,pane:a,tabId:i}});e.dispatchEvent(r)},handleKeydown:function(e,t,n,s,o){let i=t.classList.contains("vd-tabs-vertical")||t.classList.contains("tabs-vertical"),a=Array.from(s).filter(l=>!l.classList.contains("disabled")&&!l.disabled),r=a.indexOf(n),c=r;switch(e.key){case"ArrowLeft":i||(e.preventDefault(),c=r>0?r-1:a.length-1);break;case"ArrowRight":i||(e.preventDefault(),c=r<a.length-1?r+1:0);break;case"ArrowUp":i&&(e.preventDefault(),c=r>0?r-1:a.length-1);break;case"ArrowDown":i&&(e.preventDefault(),c=r<a.length-1?r+1:0);break;case"Home":e.preventDefault(),c=0;break;case"End":e.preventDefault(),c=a.length-1;break;case"Enter":case" ":e.preventDefault(),this.activateTab(t,n,s,o);return;default:return}c!==r&&(a[c].focus(),this.activateTab(t,a[c],s,o))},show:function(e){let t;if(typeof e=="string"?t=document.querySelector(`[data-tab-target="${e}"], [data-tab="${e}"], [href="#${e}"]`):t=e,!t)return;let n=t.closest(".vd-tabs, [data-tabs]");if(!n)return;let s=n.querySelectorAll(".vd-tab-link, [data-tab]"),o=n.querySelectorAll(".vd-tab-pane, [data-tab-pane]");this.activateTab(n,t,s,o)},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("tabs",m)})();(function(){"use strict";let m={STORAGE_KEYS:{PRIMARY:"vanduo-primary-color",NEUTRAL:"vanduo-neutral-color",RADIUS:"vanduo-radius",FONT:"vanduo-font-preference",THEME:"vanduo-theme-preference"},DEFAULTS:{PRIMARY_LIGHT:"black",PRIMARY_DARK:"amber",NEUTRAL:"neutral",RADIUS:"0.5",FONT:"lato",THEME:"system"},PRIMARY_COLORS:{black:{name:"Black",color:"#000000"},red:{name:"Red",color:"#fa5252"},orange:{name:"Orange",color:"#fd7e14"},amber:{name:"Amber",color:"#f59f00"},yellow:{name:"Yellow",color:"#fcc419"},lime:{name:"Lime",color:"#82c91e"},green:{name:"Green",color:"#40c057"},emerald:{name:"Emerald",color:"#20c997"},teal:{name:"Teal",color:"#12b886"},cyan:{name:"Cyan",color:"#22b8cf"},sky:{name:"Sky",color:"#3bc9db"},blue:{name:"Blue",color:"#228be6"},indigo:{name:"Indigo",color:"#4c6ef5"},violet:{name:"Violet",color:"#7950f2"},purple:{name:"Purple",color:"#be4bdb"},fuchsia:{name:"Fuchsia",color:"#f06595"},pink:{name:"Pink",color:"#e64980"},rose:{name:"Rose",color:"#ff8787"}},NEUTRAL_COLORS:{slate:{name:"Slate",color:"#64748b"},gray:{name:"Gray",color:"#6b7280"},zinc:{name:"Zinc",color:"#71717a"},neutral:{name:"Neutral",color:"#737373"},stone:{name:"Stone",color:"#78716c"}},RADIUS_OPTIONS:["0","0.125","0.25","0.375","0.5"],FONT_OPTIONS:{"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},system:{name:"System Default",family:null},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif"},lato:{name:"Lato",family:"'Lato', sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif"}},THEME_MODES:["system","dark","light"],state:{primary:null,neutral:null,radius:null,font:null,theme:null,isOpen:!1},isInitialized:!1,_cleanup:[],elements:{customizer:null,trigger:null,triggers:[],panel:null,overlay:null},init:function(){if(this.isInitialized){this.bindExistingElements(),this.bindTriggerEvents(),this.bindPanelEvents(),this.updateUI();return}this.isInitialized=!0,this._cleanup=[],this.loadPreferences(),this.applyAllPreferences(),this.bindExistingElements(),this.bindEvents(),console.log("Vanduo Theme Customizer initialized")},addListener:function(e,t,n,s){e&&(e.addEventListener(t,n,s),this._cleanup.push(()=>e.removeEventListener(t,n,s)))},getDefaultPrimary:function(e){return e==="system"?window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT:e==="dark"?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT},loadPreferences:function(){this.state.theme=this.getStorageValue(this.STORAGE_KEYS.THEME,this.DEFAULTS.THEME),this.state.primary=this.getStorageValue(this.STORAGE_KEYS.PRIMARY,this.getDefaultPrimary(this.state.theme)),this._normalizeDefaultPrimaryIfStaleWithStoredTheme(),this.state.neutral=this.getStorageValue(this.STORAGE_KEYS.NEUTRAL,this.DEFAULTS.NEUTRAL),this.state.radius=this.getStorageValue(this.STORAGE_KEYS.RADIUS,this.DEFAULTS.RADIUS),this.state.font=this.getStorageValue(this.STORAGE_KEYS.FONT,this.DEFAULTS.FONT)},savePreference:function(e,t){this.setStorageValue(e,t)},applyAllPreferences:function(){this.applyPrimary(this.state.primary),this.applyNeutral(this.state.neutral),this.applyRadius(this.state.radius),this.applyFont(this.state.font),this.applyTheme(this.state.theme)},applyPrimary:function(e){this.PRIMARY_COLORS[e]||(e=this.getDefaultPrimary(this.state.theme)),this.state.primary=e,document.documentElement.setAttribute("data-primary",e),this.savePreference(this.STORAGE_KEYS.PRIMARY,e),this.dispatchEvent("primary-change",{color:e})},applyNeutral:function(e){this.NEUTRAL_COLORS[e]||(e=this.DEFAULTS.NEUTRAL),this.state.neutral=e,document.documentElement.setAttribute("data-neutral",e),this.savePreference(this.STORAGE_KEYS.NEUTRAL,e),this.dispatchEvent("neutral-change",{neutral:e})},applyRadius:function(e){this.RADIUS_OPTIONS.includes(e)||(e=this.DEFAULTS.RADIUS),this.state.radius=e,document.documentElement.setAttribute("data-radius",e),document.documentElement.style.setProperty("--radius-scale",e),this.savePreference(this.STORAGE_KEYS.RADIUS,e),this.dispatchEvent("radius-change",{radius:e})},applyFont:function(e){this.FONT_OPTIONS[e]||(e=this.DEFAULTS.FONT),this.state.font=e,e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e),this.savePreference(this.STORAGE_KEYS.FONT,e),window.FontSwitcher&&window.FontSwitcher.setPreference&&(window.FontSwitcher.state.preference=e,window.FontSwitcher.applyFont()),this.dispatchEvent("font-change",{font:e})},applyTheme:function(e){if(this.THEME_MODES.includes(e)||(e=this.DEFAULTS.THEME),this._isApplying=!0,this.isUsingDefaultPrimary()){let t=this.getDefaultPrimary(e);this.state.primary!==t&&this.applyPrimary(t)}if(this.state.theme=e,e==="system"?document.documentElement.removeAttribute("data-theme"):document.documentElement.setAttribute("data-theme",e),this.savePreference(this.STORAGE_KEYS.THEME,e),window.Vanduo&&window.Vanduo.components.themeSwitcher){let t=window.Vanduo.components.themeSwitcher;t.state&&t.state.preference!==e&&(t.state.preference=e,typeof t.setStorageValue=="function"&&t.setStorageValue(t.STORAGE_KEY,e),typeof t.updateUI=="function"&&t.updateUI())}this._isApplying=!1,this.dispatchEvent("mode-change",{mode:e})},dispatchEvent:function(e,t){let n=new CustomEvent("theme:"+e,{bubbles:!0,detail:t});document.dispatchEvent(n);let s=new CustomEvent("theme:change",{bubbles:!0,detail:{type:e,value:t[Object.keys(t)[0]],state:{...this.state}}});document.dispatchEvent(s)},bindExistingElements:function(){this.elements.customizer=document.querySelector(".vd-theme-customizer"),this.elements.triggers=Array.from(document.querySelectorAll("[data-theme-customizer-trigger]")),!this.elements.trigger&&this.elements.triggers.length&&(this.elements.trigger=this.elements.triggers[0]),this.elements.customizer?(this.elements.trigger=this.elements.customizer.querySelector(".vd-theme-customizer-trigger")||this.elements.trigger,this.elements.panel=this.elements.customizer.querySelector(".vd-theme-customizer-panel"),this.elements.overlay=this.elements.customizer.querySelector(".vd-theme-customizer-overlay")):this.elements.triggers.length&&this.createDynamicPanel(),this.updateUI()},createDynamicPanel:function(){if(!this.elements.triggers.length)return;this.elements.trigger=this.elements.triggers[0];let e=document.createElement("div");e.className="vd-theme-customizer-overlay";let t=document.createElement("div");t.className="vd-theme-customizer-panel",t.innerHTML=this.getPanelHTML(),document.body.appendChild(e),document.body.appendChild(t),this.elements.panel=t,this.elements.overlay=e,this.elements.customizer={contains:n=>t.contains(n)||this.elements.triggers.some(s=>s.contains(n))},this.positionPanel(),this.bindPanelEvents(),this.addListener(window,"resize",()=>this.positionPanel())},positionPanel:function(){if(!this.elements.panel||!this.elements.trigger)return;let e=this.elements.activeTrigger||this.elements.trigger;if(window.innerWidth<768)this.elements.panel.style.top="",this.elements.panel.style.right="",this.elements.panel.style.left="",this.elements.panel.style.height="",this.elements.panel.style.maxHeight="";else{let n=e.getBoundingClientRect(),s=320,o=n.bottom+8,i=window.innerWidth,a=i-n.right;i-a-s<8&&(a=i-s-8),this.elements.panel.style.top=o+"px",this.elements.panel.style.right=a+"px",this.elements.panel.style.left="",this.elements.panel.style.height="auto",this.elements.panel.style.maxHeight="calc(100vh - "+o+"px)"}},bindPanelEvents:function(){if(!this.elements.panel||this.elements.panel.getAttribute("data-customizer-initialized")==="true")return;this.elements.panel.setAttribute("data-customizer-initialized","true"),this.elements.panel.querySelectorAll("[data-color]").forEach(s=>{this.addListener(s,"click",()=>{this.applyPrimary(s.dataset.color),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(s=>{this.addListener(s,"click",()=>{this.applyNeutral(s.dataset.neutral),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-radius]").forEach(s=>{this.addListener(s,"click",()=>{this.applyRadius(s.dataset.radius),this.updateUI()})});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&this.addListener(e,"change",s=>{this.applyFont(s.target.value),this.updateUI()});let t=this.elements.panel.querySelector(".customizer-reset");t&&this.addListener(t,"click",()=>{this.reset()});let n=this.elements.panel.querySelector(".customizer-mobile-close");n&&this.addListener(n,"click",()=>{this.close()}),this.elements.overlay&&this.addListener(this.elements.overlay,"click",()=>{this.close()})},getPanelHTML:function(){let e=typeof escapeHtml=="function"?escapeHtml:function(a){let r=document.createElement("div");return r.textContent=String(a??""),r.innerHTML},t=function(a){let r=String(a??"").trim();return/^(#[0-9a-fA-F]{3,8}|rgb[a]?\([^)]{1,60}\)|hsl[a]?\([^)]{1,60}\)|var\(--[a-zA-Z0-9_-]{1,40}\))$/.test(r)?r:"#000000"},n="";for(let[a,r]of Object.entries(this.PRIMARY_COLORS))n+=`<button class="tc-color-swatch${a===this.state.primary?" is-active":""}" data-color="${e(a)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"></button>`;let s="";for(let[a,r]of Object.entries(this.NEUTRAL_COLORS))s+=`<button class="tc-neutral-swatch${a===this.state.neutral?" is-active":""}" data-neutral="${e(a)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"><span>${e(r.name)}</span></button>`;let o="";this.RADIUS_OPTIONS.forEach(a=>{o+=`<button class="tc-radius-btn${a===this.state.radius?" is-active":""}" data-radius="${e(a)}">${e(a)}</button>`});let i="";for(let[a,r]of Object.entries(this.FONT_OPTIONS))i+=`<option value="${e(a)}"${a===this.state.font?" selected":""}>${e(r.name)}</option>`;return`
|
|
5
|
+
`).length,o=document.createElement("div");o.className="vd-code-snippet-line-numbers",o.setAttribute("aria-hidden","true");for(let a=1;a<=s;a++){let r=document.createElement("span");r.textContent=a,o.appendChild(r)}let i=document.createElement("div");i.className="vd-code-snippet-code",i.appendChild(t.cloneNode(!0)),t.parentNode.removeChild(t),e.appendChild(o),e.appendChild(i)},expand:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="true";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","true"),n&&(n.dataset.visible="true")},collapse:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="false";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","false"),n&&(n.dataset.visible="false")},showLang:function(e,t){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;let n=e.querySelector(`.vd-code-snippet-tab[data-lang="${t}"]`),s=e.querySelectorAll(".vd-code-snippet-tab"),o=e.querySelectorAll(".vd-code-snippet-pane");n&&this.switchTab(e,n,s,o)},destroy:function(e){typeof e=="string"&&(e=document.querySelector(e)),e&&(e._codeSnippetCleanup&&(e._codeSnippetCleanup.forEach(t=>t()),delete e._codeSnippetCleanup),delete e.dataset.initialized)},destroyAll:function(){document.querySelectorAll('.vd-code-snippet[data-initialized="true"]').forEach(t=>this.destroy(t))}};typeof window.Vanduo<"u"&&window.Vanduo.register("codeSnippet",m),window.CodeSnippet=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-collapsible, .accordion").forEach(t=>{this.instances.has(t)||this.initCollapsible(t)})},initCollapsible:function(e){let t=e.classList.contains("accordion"),n=e.querySelectorAll(".vd-collapsible-item, .accordion-item"),s=[];n.forEach(o=>{let i=o.querySelector(".vd-collapsible-header, .accordion-header"),a=o.querySelector(".vd-collapsible-body, .accordion-body"),r=o.querySelector(".vd-collapsible-trigger, .accordion-trigger")||i;if(!i||!a)return;o.classList.contains("is-open")?this.openItem(o,a,!1):this.closeItem(o,a,!1);let c=l=>{l.preventDefault(),this.toggleItem(o,a,e,t)};r.addEventListener("click",c),s.push(()=>r.removeEventListener("click",c))}),this.instances.set(e,{cleanup:s})},toggleItem:function(e,t,n,s){e.classList.contains("is-open")?this.closeItem(e,t):(s&&n.querySelectorAll(".vd-collapsible-item.is-open, .accordion-item.is-open").forEach(a=>{if(a!==e){let r=a.querySelector(".vd-collapsible-body, .accordion-body");this.closeItem(a,r)}}),this.openItem(e,t))},openItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.add("is-open"),e.setAttribute("aria-expanded","true");let s=t.scrollHeight;t.style.maxHeight=`${s}px`,n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:open",{bubbles:!0}))},closeItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),t.style.maxHeight="0",n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:close",{bubbles:!0}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.openItem(t,n)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.closeItem(t,n)}},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body"),s=t.closest(".vd-collapsible, .accordion"),o=s&&s.classList.contains("accordion");n&&this.toggleItem(t,n,s,o)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("collapsible",m),window.VanduoCollapsible=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-dropdown").forEach(t=>{this.instances.has(t)||this.initDropdown(t)})},initDropdown:function(e){let t=e.querySelector(".vd-dropdown-toggle"),n=e.querySelector(".vd-dropdown-menu");if(!t||!n)return;let s=[];t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),n.setAttribute("role","menu"),n.setAttribute("aria-hidden","true");let o=c=>{c.preventDefault(),c.stopPropagation(),this.toggleDropdown(e,t,n)};t.addEventListener("click",o),s.push(()=>t.removeEventListener("click",o));let i=c=>{!e.contains(c.target)&&n.classList.contains("is-open")&&this.closeDropdown(e,t,n)};document.addEventListener("click",i),s.push(()=>document.removeEventListener("click",i));let a=c=>{this.handleKeydown(c,e,t,n)};t.addEventListener("keydown",a),s.push(()=>t.removeEventListener("keydown",a)),n.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)").forEach(c=>{let l=h=>{h.preventDefault(),this.selectItem(c,e,t,n)};c.addEventListener("click",l),s.push(()=>c.removeEventListener("click",l));let f=h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),this.selectItem(c,e,t,n))};c.addEventListener("keydown",f),s.push(()=>c.removeEventListener("keydown",f))}),this.instances.set(e,{toggle:t,menu:n,cleanup:s,typeaheadBuffer:"",typeaheadTimer:null})},toggleDropdown:function(e,t,n){n.classList.contains("is-open")?this.closeDropdown(e,t,n):this.openDropdown(e,t,n)},openDropdown:function(e,t,n){document.querySelectorAll(".vd-dropdown-menu.is-open").forEach(i=>{if(i!==n){let a=i.closest(".vd-dropdown"),r=a.querySelector(".vd-dropdown-toggle");this.closeDropdown(a,r,i)}}),e.classList.add("is-open"),n.classList.add("is-open"),t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false"),this.positionMenu(e,n);let o=n.querySelector(".vd-dropdown-item:not(.disabled):not(.is-disabled)");o&&setTimeout(()=>o.focus(),0)},closeDropdown:function(e,t,n){e.classList.remove("is-open"),n.classList.remove("is-open"),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true"),t.focus()},positionMenu:function(e,t){let n=e.getBoundingClientRect(),s=t.getBoundingClientRect(),o=window.innerWidth,i=window.innerHeight,a=8;if(t.classList.remove("vd-dropdown-menu-end","vd-dropdown-menu-start","vd-dropdown-menu-top"),e.classList.contains("vd-dropdown-dropup")){t.classList.add("vd-dropdown-menu-top");return}e.classList.contains("vd-dropdown-dropright")||e.classList.contains("vd-dropdown-dropleft")||(n.left+s.width>o-a?t.classList.add("vd-dropdown-menu-end"):t.classList.add("vd-dropdown-menu-start"),n.bottom+s.height>i-a&&n.top-s.height>a&&t.classList.add("vd-dropdown-menu-top"))},handleKeydown:function(e,t,n,s){let o=s.classList.contains("is-open"),i=Array.from(s.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)")),a=i.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":case"ArrowDown":if(e.preventDefault(),!o)this.openDropdown(t,n,s);else if(e.key==="ArrowDown"){let r=a<i.length-1?a+1:0;i[r].focus()}break;case"ArrowUp":if(o){e.preventDefault();let r=a>0?a-1:i.length-1;i[r].focus()}break;case"Escape":o&&(e.preventDefault(),this.closeDropdown(t,n,s));break;case"Home":o&&(e.preventDefault(),i[0].focus());break;case"End":o&&(e.preventDefault(),i[i.length-1].focus());break;default:if(o&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let r=this.instances.get(t);if(!r)break;clearTimeout(r.typeaheadTimer),r.typeaheadBuffer+=e.key.toLowerCase();let c=i.find(l=>l.textContent.trim().toLowerCase().startsWith(r.typeaheadBuffer));c&&c.focus(),r.typeaheadTimer=setTimeout(()=>{r.typeaheadBuffer=""},500)}break}},selectItem:function(e,t,n,s){s.querySelectorAll(".vd-dropdown-item").forEach(o=>{o.classList.remove("active","is-active")}),e.classList.add("active","is-active"),(n.tagName==="BUTTON"||n.classList.contains("btn"))&&(n.textContent=e.textContent.trim()),this.closeDropdown(t,n,s),e.dispatchEvent(new CustomEvent("dropdown:select",{bubbles:!0,detail:{item:e,value:e.dataset.value||e.textContent}}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.openDropdown(t,n,s)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.closeDropdown(t,n,s)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("dropdown",m),window.VanduoDropdown=m})();(function(){"use strict";let m={STORAGE_KEY:"vanduo-font-preference",isInitialized:!1,fonts:{system:{name:"System Default",family:null},"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif",category:"sans-serif",description:"Friendly, humanist sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif",category:"sans-serif",description:"Neutral, highly readable"},lato:{name:"Lato",family:"'Lato', sans-serif",category:"sans-serif",description:"Friendly, rounded sans-serif"}},init:function(){if(this.state={preference:this.getPreference()},this.fonts[this.state.preference]||(this.state.preference="ubuntu",this.setStorageValue(this.STORAGE_KEY,this.state.preference)),this.isInitialized){this.applyFont(),this.renderUI(),this.updateUI();return}this.isInitialized=!0,this.applyFont(),this.renderUI(),console.log("Vanduo Font Switcher initialized")},getPreference:function(){return this.getStorageValue(this.STORAGE_KEY,"ubuntu")},setPreference:function(e){if(!this.fonts[e]){console.warn("Unknown font:",e);return}this.state.preference=e,this.setStorageValue(this.STORAGE_KEY,e),this.applyFont(),this.updateUI();let t=new CustomEvent("font:change",{bubbles:!0,detail:{font:e,fontData:this.fonts[e]}});document.dispatchEvent(t)},applyFont:function(){let e=this.state.preference;e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e)},renderUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.getAttribute("data-font-initialized")==="true"){t.tagName==="SELECT"&&(t.value=this.state.preference);return}if(t.tagName==="SELECT"){t.value=this.state.preference;let n=s=>{this.setPreference(s.target.value)};t.addEventListener("change",n),t._fontToggleHandler=n}else{let n=()=>{let s=Object.keys(this.fonts),i=(s.indexOf(this.state.preference)+1)%s.length;this.setPreference(s[i])};t.addEventListener("click",n),t._fontToggleHandler=n}t.setAttribute("data-font-initialized","true")})},updateUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.tagName==="SELECT")t.value=this.state.preference;else{let n=t.querySelector(".font-current-label");n&&(n.textContent=this.fonts[this.state.preference].name)}})},getCurrentFont:function(){return this.state.preference},getFontData:function(e){return this.fonts[e]||null},destroyAll:function(){document.querySelectorAll('[data-toggle="font"][data-font-initialized="true"]').forEach(t=>{if(t._fontToggleHandler){let n=t.tagName==="SELECT"?"change":"click";t.removeEventListener(n,t._fontToggleHandler),delete t._fontToggleHandler}t.removeAttribute("data-font-initialized")}),this.isInitialized=!1},getStorageValue:function(e,t){if(typeof window.safeStorageGet=="function")return window.safeStorageGet(e,t);try{let n=localStorage.getItem(e);return n!==null?n:t}catch{return t}},setStorageValue:function(e,t){if(typeof window.safeStorageSet=="function")return window.safeStorageSet(e,t);try{return localStorage.setItem(e,t),!0}catch{return!1}}};window.Vanduo&&window.Vanduo.register("fontSwitcher",m),window.FontSwitcher=m})();(function(){"use strict";let m=(function(){try{return CSS.supports("selector(:has(*))")}catch{return!1}})(),e={instances:new Map,init:function(){document.querySelectorAll("[data-layout-mode]").forEach(function(n){this.instances.has(n)||this.initContainer(n)}.bind(this)),this.initToggleButtons()},initContainer:function(t){let n=t.getAttribute("data-layout-mode")||"standard",s=[];this.applyMode(t,n),t.setAttribute("role","region"),t.setAttribute("aria-label","Grid layout: "+n+" mode"),this.instances.set(t,{cleanup:s,mode:n})},initToggleButtons:function(){document.querySelectorAll("[data-grid-toggle]").forEach(function(n){if(n.getAttribute("data-grid-initialized")==="true")return;let s=function(o){o.preventDefault();let i=n.getAttribute("data-grid-toggle"),a;i?a=document.querySelector(i):a=n.closest("[data-layout-mode]"),a&&this.toggle(a)}.bind(this);n.addEventListener("click",s),n.setAttribute("data-grid-initialized","true"),n.setAttribute("aria-pressed","false"),n._gridCleanup=function(){n.removeEventListener("click",s),n.removeAttribute("data-grid-initialized"),n.removeAttribute("aria-pressed")}}.bind(this))},applyFibFallback:function(t){if(m)return;t.querySelectorAll(".vd-row, .row").forEach(function(s){let i=s.querySelectorAll(':scope > [class*="vd-col-"], :scope > [class*="col-"]').length;i===1?s.style.gridTemplateColumns="1fr":i===2?s.style.gridTemplateColumns="1fr 1.618fr":i===3?s.style.gridTemplateColumns="2fr 3fr 5fr":i===4?s.style.gridTemplateColumns="1fr 2fr 3fr 5fr":s.style.gridTemplateColumns="repeat("+i+", 1fr)"})},removeFibFallback:function(t){t.querySelectorAll(".vd-row, .row").forEach(function(s){s.style.gridTemplateColumns=""})},applyMode:function(t,n){t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),n==="fibonacci"?(t.classList.add("vd-grid-fibonacci"),this.applyFibFallback(t)):(t.classList.add("vd-grid-standard"),this.removeFibFallback(t)),t.setAttribute("data-layout-mode",n),t.setAttribute("aria-label","Grid layout: "+n+" mode"),document.querySelectorAll("[data-grid-toggle]").forEach(function(a){let r=a.getAttribute("data-grid-toggle");if(r&&t.matches(r)){let c=n==="fibonacci";c?a.classList.add("is-active"):a.classList.remove("is-active"),a.setAttribute("aria-pressed",c?"true":"false")}});let o=this.instances.get(t);o&&(o.mode=n);let i;try{i=new CustomEvent("grid:modechange",{bubbles:!0,detail:{container:t,mode:n}})}catch{i=document.createEvent("CustomEvent"),i.initCustomEvent("grid:modechange",!0,!0,{container:t,mode:n})}t.dispatchEvent(i)},toggle:function(t){if(typeof t=="string"&&(t=document.querySelector(t)),!t)return;let s=(t.getAttribute("data-layout-mode")||"standard")==="fibonacci"?"standard":"fibonacci";this.applyMode(t,s)},setMode:function(t,n){typeof t=="string"&&(t=document.querySelector(t)),t&&(n!=="fibonacci"&&n!=="standard"||this.applyMode(t,n))},getMode:function(t){return typeof t=="string"&&(t=document.querySelector(t)),t?t.getAttribute("data-layout-mode")||"standard":null},destroy:function(t){let n=this.instances.get(t);n&&(n.cleanup.forEach(function(s){s()}),t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),t.removeAttribute("aria-label"),this.removeFibFallback(t),this.instances.delete(t))},destroyAll:function(){this.instances.forEach(function(n,s){this.destroy(s)}.bind(this)),document.querySelectorAll('[data-grid-initialized="true"]').forEach(function(n){n._gridCleanup&&(n._gridCleanup(),delete n._gridCleanup)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("gridLayout",e),window.VanduoGridLayout=e})();(function(){"use strict";let m={backdrop:null,container:null,img:null,closeBtn:null,caption:null,currentTrigger:null,scrollThreshold:50,initialScrollY:0,isOpen:!1,_cleanupFunctions:[],init:function(){this.createBackdrop(),this.bindTriggers()},createBackdrop:function(){if(this.backdrop||document.querySelector(".vd-image-box-backdrop")){this.backdrop||(this.backdrop=document.querySelector(".vd-image-box-backdrop"),this.container=this.backdrop.querySelector(".vd-image-box-container"),this.img=this.backdrop.querySelector(".vd-image-box-img"),this.closeBtn=this.backdrop.querySelector(".vd-image-box-close"),this.caption=this.backdrop.querySelector(".vd-image-box-caption"),this.bindBackdropEvents());return}this.backdrop=document.createElement("div"),this.backdrop.className="vd-image-box-backdrop",this.backdrop.setAttribute("role","dialog"),this.backdrop.setAttribute("aria-modal","true"),this.backdrop.setAttribute("aria-label","Image viewer"),this.backdrop.setAttribute("tabindex","-1"),this.container=document.createElement("div"),this.container.className="vd-image-box-container",this.img=document.createElement("img"),this.img.className="vd-image-box-img",this.img.alt="",this.closeBtn=document.createElement("button"),this.closeBtn.className="vd-image-box-close",this.closeBtn.setAttribute("aria-label","Close image viewer"),this.closeBtn.innerHTML="×",this.caption=document.createElement("div"),this.caption.className="vd-image-box-caption",this.container.appendChild(this.img),this.backdrop.appendChild(this.closeBtn),this.backdrop.appendChild(this.container),this.backdrop.appendChild(this.caption),document.body.appendChild(this.backdrop),this.bindBackdropEvents()},bindBackdropEvents:function(){let e=this,t=function(a){(a.target===e.backdrop||a.target===e.container)&&e.close()};this.backdrop.addEventListener("click",t),this._cleanupFunctions.push(()=>this.backdrop.removeEventListener("click",t));let n=function(){e.close()};this.img.addEventListener("click",n),this._cleanupFunctions.push(()=>this.img.removeEventListener("click",n));let s=function(){e.close()};this.closeBtn.addEventListener("click",s),this._cleanupFunctions.push(()=>this.closeBtn.removeEventListener("click",s));let o=function(a){a.key==="Escape"&&e.isOpen&&e.close()};document.addEventListener("keydown",o),this._cleanupFunctions.push(()=>document.removeEventListener("keydown",o));let i=function(){if(!e.isOpen)return;let a=window.scrollY;Math.abs(a-e.initialScrollY)>e.scrollThreshold&&e.close()};window.addEventListener("scroll",i,{passive:!0}),this._cleanupFunctions.push(()=>window.removeEventListener("scroll",i))},bindTriggers:function(){let e=this;document.querySelectorAll("[data-image-box]").forEach(function(n){if(n.dataset.imageBoxInitialized)return;if(n.dataset.imageBoxInitialized="true",n.classList.add("vd-image-box-trigger"),n.tagName==="IMG"){n.complete&&n.naturalWidth===0&&n.classList.add("is-broken");let o=function(){n.classList.add("is-broken")};n.addEventListener("error",o);let i=function(){n.classList.remove("is-broken")};n.addEventListener("load",i)}let s=function(o){o.preventDefault(),e.open(n)};if(n.addEventListener("click",s),n._imageBoxCleanup=()=>n.removeEventListener("click",s),n.tagName!=="BUTTON"&&n.tagName!=="A"){n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label","View enlarged image");let o=function(a){(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),e.open(n))};n.addEventListener("keydown",o);let i=n._imageBoxCleanup;n._imageBoxCleanup=()=>{i(),n.removeEventListener("keydown",o)}}})},open:function(e){if(this.isOpen)return;this.currentTrigger=e,this.isOpen=!0,this.initialScrollY=window.scrollY;let t=e.dataset.imageBoxFullSrc||e.dataset.imageBoxSrc||e.src||e.href;if(!t){console.warn("[Vanduo ImageBox] No image source found for trigger:",e);return}let n=e.dataset.imageBoxCaption||e.alt||"";this.img.src=t,this.img.alt=e.alt||"",n?(this.caption.textContent=n,this.caption.style.display="block"):this.caption.style.display="none";let s=window.innerWidth-document.documentElement.clientWidth;document.body.style.setProperty("--scrollbar-width",`${s}px`),document.body.classList.add("body-image-box-open"),this.backdrop.classList.add("is-visible"),this.backdrop.focus(),e.dispatchEvent(new CustomEvent("imageBox:open",{bubbles:!0,detail:{src:t}})),this.img.complete||(this.img.style.opacity="0",this._imgLoadHandler=()=>{this.img.style.opacity=""},this.img.addEventListener("load",this._imgLoadHandler,{once:!0}))},close:function(){this.isOpen&&(this.isOpen=!1,this.backdrop.classList.remove("is-visible"),document.body.classList.remove("body-image-box-open"),document.body.style.removeProperty("--scrollbar-width"),this.currentTrigger&&(this.currentTrigger.focus(),this.currentTrigger.dispatchEvent(new CustomEvent("imageBox:close",{bubbles:!0})),this.currentTrigger=null),setTimeout(()=>{this.isOpen||(this._imgLoadHandler&&(this.img.removeEventListener("load",this._imgLoadHandler),this._imgLoadHandler=null),this.img.src="",this.img.alt="")},300))},reinit:function(){this.bindTriggers()},destroy:function(){this.isOpen&&this.close(),this.backdrop&&this.backdrop.parentNode&&this.backdrop.parentNode.removeChild(this.backdrop),this._cleanupFunctions.forEach(t=>t()),this._cleanupFunctions=[],document.querySelectorAll("[data-image-box-initialized]").forEach(t=>{t.classList.remove("vd-image-box-trigger"),t._imageBoxCleanup&&(t._imageBoxCleanup(),delete t._imageBoxCleanup),delete t.dataset.imageBoxInitialized}),this.backdrop=null,this.container=null,this.img=null,this.closeBtn=null,this.caption=null,this.currentTrigger=null,this.isOpen=!1},destroyAll:function(){this.destroy()}};typeof window.Vanduo<"u"&&window.Vanduo.register("imageBox",m),window.VanduoImageBox=m})();(function(){"use strict";let m={modals:new Map,openModals:[],zIndexCounter:1050,_triggerCleanups:[],_sharedEscHandler:null,getPortalState:function(e){return e._vdPortalState||(e._vdPortalState={originalParent:null,originalNextSibling:null,placeholder:null}),e._vdPortalState},portalToBody:function(e){if(!e||e.parentNode===document.body)return;let t=this.getPortalState(e);t.originalParent=e.parentNode,t.originalNextSibling=e.nextSibling,t.placeholder||(t.placeholder=document.createComment("vd-modal-placeholder")),t.originalParent.insertBefore(t.placeholder,e),document.body.appendChild(e),e.dataset.vdPortaled="true"},restoreFromPortal:function(e){if(!e)return;let t=this.getPortalState(e);if(!t.placeholder){delete e.dataset.vdPortaled;return}t.placeholder.parentNode?(t.placeholder.parentNode.insertBefore(e,t.placeholder),t.placeholder.parentNode.removeChild(t.placeholder)):t.originalParent&&t.originalParent.isConnected&&(t.originalNextSibling&&t.originalNextSibling.parentNode===t.originalParent?t.originalParent.insertBefore(e,t.originalNextSibling):t.originalParent.appendChild(e)),t.originalParent=null,t.originalNextSibling=null,t.placeholder=null,delete e.dataset.vdPortaled},init:function(){document.querySelectorAll(".vd-modal").forEach(n=>{this.modals.has(n)||this.initModal(n)}),document.querySelectorAll("[data-modal]").forEach(n=>{if(n.dataset.modalTriggerInitialized)return;n.dataset.modalTriggerInitialized="true";let s=o=>{o.preventDefault();let i=n.dataset.modal,a=document.querySelector(i);a&&this.open(a)};n.addEventListener("click",s),this._triggerCleanups.push(()=>n.removeEventListener("click",s))})},initModal:function(e){let t=this.createBackdrop(e),n=e.querySelectorAll('.vd-modal-close, [data-dismiss="modal"]'),s=e.querySelector(".vd-modal-dialog");if(!s)return;let o=[];e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-hidden","true"),e.id||(e.id="modal-"+Math.random().toString(36).substr(2,9));let i=e.querySelector(".vd-modal-title");i&&!i.id&&(i.id=e.id+"-title",e.setAttribute("aria-labelledby",i.id)),n.forEach(r=>{let c=()=>{this.close(e)};r.addEventListener("click",c),o.push(()=>r.removeEventListener("click",c))});let a=r=>{r.target===t&&e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",a),o.push(()=>t.removeEventListener("click",a)),this._sharedEscHandler||(this._sharedEscHandler=r=>{if(r.key==="Escape"&&this.openModals.length>0){let c=this.openModals[this.openModals.length-1];c.dataset.keyboard!=="false"&&this.close(c)}},document.addEventListener("keydown",this._sharedEscHandler)),this.modals.set(e,{backdrop:t,dialog:s,trapHandler:null,cleanup:o})},createBackdrop:function(e){let t=e.querySelector(".vd-modal-backdrop");return t||(t=document.createElement("div"),t.className="vd-modal-backdrop",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,dialog:o}=n;if(this.portalToBody(t),this.zIndexCounter+=10,t.style.zIndex=this.zIndexCounter,s.style.zIndex=this.zIndexCounter-1,this.openModals.push(t),s.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),this.openModals.length===1){document.body.classList.add("body-modal-open");let a=window.innerWidth-document.documentElement.clientWidth;a>0&&(document.body.style.paddingRight=`${a}px`)}let i=this.trapFocus(t);n.trapHandler=i,setTimeout(()=>{let a=this.getFocusableElements(t)[0];a&&a.focus()},100),t.dispatchEvent(new CustomEvent("modal:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,trapHandler:o}=n;o&&(t.removeEventListener("keydown",o),n.trapHandler=null);let i=this.openModals.indexOf(t);if(i>-1&&this.openModals.splice(i,1),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),this.openModals.length===0)s.classList.remove("is-visible"),document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050;else{let r=this.openModals[this.openModals.length-1];this.modals.get(r).backdrop.classList.add("is-visible")}let a=document.querySelector(`[data-modal="#${t.id}"]`);a&&a.focus(),t.dispatchEvent(new CustomEvent("modal:close",{bubbles:!0})),this.restoreFromPortal(t)},trapFocus:function(e){let t=this,n=function(s){if(s.key!=="Tab")return;let o=t.getFocusableElements(e),i=o[0],a=o[o.length-1];s.shiftKey?document.activeElement===i&&(s.preventDefault(),a.focus()):document.activeElement===a&&(s.preventDefault(),i.focus())};return e.addEventListener("keydown",n),n},getFocusableElements:function(e){return Array.from(e.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(n=>!n.hasAttribute("disabled")&&n.offsetWidth>0&&n.offsetHeight>0)},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},destroy:function(e){let t=this.modals.get(e);if(t){if(e.classList.contains("is-open")){let n=this.openModals.indexOf(e);n>-1&&this.openModals.splice(n,1),t.backdrop.classList.remove("is-visible"),e.classList.remove("is-open"),e.setAttribute("aria-hidden","true"),this.openModals.length===0&&(document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050)}this.restoreFromPortal(e),t.cleanup&&t.cleanup.forEach(n=>n()),t.backdrop&&t.backdrop.parentNode&&t.backdrop.parentNode.removeChild(t.backdrop),this.modals.delete(e)}},destroyAll:function(){this.modals.forEach((e,t)=>{this.destroy(t)}),this._triggerCleanups.forEach(e=>e()),this._triggerCleanups=[],this._sharedEscHandler&&(document.removeEventListener("keydown",this._sharedEscHandler),this._sharedEscHandler=null)}};typeof window.Vanduo<"u"&&window.Vanduo.register("modals",m),window.VanduoModals=m})();(function(){"use strict";let m={instances:new Map,getBreakpoint:function(){let t=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-lg").trim(),n=parseInt(t,10);return isNaN(n)?992:n},init:function(){document.querySelectorAll(".vd-navbar").forEach(t=>{this.instances.has(t)||this.initNavbar(t)})},initScrollWatcher:function(e){let t=e.classList.contains("vd-navbar-glass"),n=e.classList.contains("vd-navbar-transparent");if(!t&&!n)return null;let s=()=>{let i=parseInt(e.dataset.scrollThreshold,10);return isNaN(i)?e.offsetHeight||60:i},o=()=>{let i=window.scrollY>s();e.classList.toggle("vd-navbar-scrolled",i)};return o(),window.addEventListener("scroll",o,{passive:!0}),()=>window.removeEventListener("scroll",o)},initNavbar:function(e){let t=e.querySelector(".vd-navbar-toggle, .vd-navbar-burger"),n=e.querySelector(".vd-navbar-menu"),s=e.querySelector(".vd-navbar-overlay")||this.createOverlay(e),o=[],i=this.initScrollWatcher(e);if(i&&o.push(i),!t||!n){o.length&&this.instances.set(e,{toggle:null,menu:null,overlay:null,cleanup:o});return}let a=u=>{u.preventDefault(),u.stopPropagation(),this.toggleMenu(e,t,n,s)};if(t.addEventListener("click",a),o.push(()=>t.removeEventListener("click",a)),s){let u=()=>{this.closeMenu(e,t,n,s)};s.addEventListener("click",u),o.push(()=>s.removeEventListener("click",u))}let r=u=>{u.key==="Escape"&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)};document.addEventListener("keydown",r),o.push(()=>document.removeEventListener("keydown",r));let c,l=()=>{clearTimeout(c),c=setTimeout(()=>{let u=this.getBreakpoint();window.innerWidth>=u&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)},250)};window.addEventListener("resize",l),o.push(()=>{clearTimeout(c),window.removeEventListener("resize",l)});let f=u=>{n.classList.contains("is-open")&&!e.contains(u.target)&&!n.contains(u.target)&&this.closeMenu(e,t,n,s)};document.addEventListener("click",f),o.push(()=>document.removeEventListener("click",f)),n.querySelectorAll(".vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link").forEach(u=>{let d=p=>{let b=this.getBreakpoint();if(window.innerWidth<b){p.preventDefault();let L=u.parentElement.querySelector(".vd-navbar-dropdown-menu");L&&L.classList.toggle("is-open")}};u.addEventListener("click",d),o.push(()=>u.removeEventListener("click",d))}),this.instances.set(e,{toggle:t,menu:n,overlay:s,cleanup:o})},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})},toggleMenu:function(e,t,n,s){n.classList.contains("is-open")?this.closeMenu(e,t,n,s):this.openMenu(e,t,n,s)},openMenu:function(e,t,n,s){n.classList.add("is-open"),t.classList.add("is-active"),s&&s.classList.add("is-active"),document.body.classList.add("body-navbar-open"),t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false")},closeMenu:function(e,t,n,s){n.classList.remove("is-open"),t.classList.remove("is-active"),s&&s.classList.remove("is-active"),document.body.classList.remove("body-navbar-open"),n.querySelectorAll(".vd-navbar-dropdown-menu.is-open").forEach(i=>{i.classList.remove("is-open")}),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true")},createOverlay:function(e){let t=document.createElement("div");return t.className="vd-navbar-overlay",document.body.appendChild(t),t}};typeof window.Vanduo<"u"&&window.Vanduo.register("navbar",m),window.VanduoNavbar=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-pagination[data-pagination]").forEach(t=>{this.instances.has(t)||this.initPagination(t)})},initPagination:function(e){let t=parseInt(e.dataset.totalPages)||1,n=parseInt(e.dataset.currentPage)||1,s=parseInt(e.dataset.maxVisible)||7;this.render(e,{totalPages:t,currentPage:n,maxVisible:s});let o=i=>{let a=i.target.closest(".vd-pagination-link");if(!a||a.closest(".vd-pagination-item.disabled")||a.closest(".vd-pagination-item.active"))return;i.preventDefault();let r=a.closest(".vd-pagination-item"),c=r.dataset.page;c?this.goToPage(e,parseInt(c)):r.classList.contains("pagination-prev")?this.prevPage(e):r.classList.contains("pagination-next")&&this.nextPage(e)};e.addEventListener("click",o),this.instances.set(e,{cleanup:[()=>e.removeEventListener("click",o)]})},render:function(e,t){let{totalPages:n,currentPage:s,maxVisible:o}=t;if(n<=1){e.innerHTML="";return}let i="";i+=`<li class="vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${s===1?"disabled":""}">`,i+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Previous">Previous</a>',i+="</li>";let a=this.calculatePages(s,n,o),r=0;a.forEach(c=>{if(c==="ellipsis")i+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>';else{c!==r+1&&r>0&&(i+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>');let l=Number(c);i+=`<li class="vd-pagination-item pagination-item ${l===s?"active":""}" data-page="${l}">`,i+=`<a class="vd-pagination-link pagination-link" href="#" aria-label="Page ${l}">${l}</a>`,i+="</li>",r=c}}),i+=`<li class="vd-pagination-item vd-pagination-next pagination-item pagination-next ${s===n?"disabled":""}">`,i+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Next">Next</a>',i+="</li>",e.innerHTML=i,e.dataset.currentPage=s},calculatePages:function(e,t,n){let s=[],o=Math.floor(n/2);if(t<=n)for(let i=1;i<=t;i++)s.push(i);else{s.push(1);let i=Math.max(2,e-o),a=Math.min(t-1,e+o);e<=o+1&&(a=Math.min(t-1,n-1)),e>=t-o&&(i=Math.max(2,t-n+2)),i>2&&s.push("ellipsis");for(let r=i;r<=a;r++)s.push(r);a<t-1&&s.push("ellipsis"),t>1&&s.push(t)}return s},goToPage:function(e,t){let n=parseInt(e.dataset.totalPages)||1,s=parseInt(e.dataset.maxVisible)||7;t<1||t>n||(this.render(e,{totalPages:n,currentPage:t,maxVisible:s}),e.dispatchEvent(new CustomEvent("pagination:change",{bubbles:!0,detail:{page:t,totalPages:n}})))},prevPage:function(e){let t=parseInt(e.dataset.currentPage)||1;t>1&&this.goToPage(e,t-1)},nextPage:function(e){let t=parseInt(e.dataset.currentPage)||1,n=parseInt(e.dataset.totalPages)||1;t<n&&this.goToPage(e,t+1)},update:function(e,t){let n=typeof e=="string"?document.querySelector(e):e;n&&(t.totalPages!==void 0&&(n.dataset.totalPages=t.totalPages),t.currentPage!==void 0&&(n.dataset.currentPage=t.currentPage),t.maxVisible!==void 0&&(n.dataset.maxVisible=t.maxVisible),this.render(n,{totalPages:parseInt(n.dataset.totalPages)||1,currentPage:parseInt(n.dataset.currentPage)||1,maxVisible:parseInt(n.dataset.maxVisible)||7}))},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("pagination",m),window.VanduoPagination=m})();(function(){"use strict";let m={parallaxElements:new Map,ticking:!1,isMobile:window.innerWidth<768,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,isInitialized:!1,_onScroll:null,_onResize:null,init:function(){if(this.isInitialized){this.refresh();return}if(this.isInitialized=!0,this.reducedMotion)return;document.querySelectorAll(".vd-parallax").forEach(t=>{t.dataset.parallaxInitialized||this.initParallax(t)}),this.handleScroll(),this._onScroll=()=>{this.handleScroll()},window.addEventListener("scroll",this._onScroll,{passive:!0}),this._onResize=()=>{this.isMobile=window.innerWidth<768,this.updateAll()},window.addEventListener("resize",this._onResize)},initParallax:function(e){e.dataset.parallaxInitialized="true";let t=e.classList.contains("parallax-disable-mobile");if(t&&this.isMobile)return;let n=e.querySelectorAll(".vd-parallax-layer, .vd-parallax-bg"),s=this.getSpeed(e),o=e.classList.contains("parallax-horizontal")?"horizontal":"vertical";this.parallaxElements.set(e,{layers:Array.from(n),speed:s,direction:o,disableMobile:t}),this.updateParallax(e)},getSpeed:function(e){return e.classList.contains("parallax-slow")?.5:e.classList.contains("parallax-fast")?1.5:1},handleScroll:function(){this.ticking||(window.requestAnimationFrame(()=>{this.updateAll(),this.ticking=!1}),this.ticking=!0)},updateAll:function(){this.parallaxElements.forEach((e,t)=>{e.disableMobile&&this.isMobile||this.updateParallax(t)})},updateParallax:function(e){let t=this.parallaxElements.get(e);if(!t)return;let n=e.getBoundingClientRect(),s=window.innerHeight,o=n.top,i=n.height,r=(Math.max(0,Math.min(1,(s-o)/(s+i)))-.5)*t.speed*100;t.layers.forEach((c,l)=>{let f=c.dataset.parallaxSpeed?parseFloat(c.dataset.parallaxSpeed):1,h=r*f;t.direction==="horizontal"?c.style.transform=`translateX(${h}px)`:c.style.transform=`translateY(${h}px)`})},destroy:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.parallaxElements.has(t)&&(this.parallaxElements.get(t).layers.forEach(s=>{s.style.transform=""}),this.parallaxElements.delete(t))},refresh:function(){this.updateAll()},destroyAll:function(){this.parallaxElements.forEach((e,t)=>{this.destroy(t)}),this.parallaxElements.clear(),this._onScroll&&(window.removeEventListener("scroll",this._onScroll),this._onScroll=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null),this.isInitialized=!1}};typeof window.Vanduo<"u"&&window.Vanduo.register("parallax",m),window.VanduoParallax=m})();(function(){"use strict";let m={init:function(){document.querySelectorAll(".vd-progress-bar[data-progress], .progress-bar[data-progress]").forEach(t=>{t.dataset.progressInitialized||this.initProgressBar(t)})},initProgressBar:function(e){e.dataset.progressInitialized="true";let t=parseInt(e.dataset.progress)||0;this.setProgress(e,t,!1)},setProgress:function(e,t,n=!0){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;t=Math.max(0,Math.min(100,t)),n?s.style.transition="width var(--transition-duration-slow) var(--transition-ease)":(s.style.transition="none",setTimeout(()=>{s.style.transition=""},0)),s.style.width=t+"%",s.setAttribute("aria-valuenow",t),s.setAttribute("aria-valuemin",0),s.setAttribute("aria-valuemax",100);let o=s.querySelector(".vd-progress-text, .progress-text");o&&(o.textContent=t+"%"),s.dispatchEvent(new CustomEvent("progress:update",{bubbles:!0,detail:{value:t,max:100}})),t>=100&&s.dispatchEvent(new CustomEvent("progress:complete",{bubbles:!0,detail:{value:t,max:100}}))},animateProgress:function(e,t,n=1e3){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;let o=parseInt(s.style.width)||0,i=t-o,a=performance.now(),r=c=>{let l=c-a,f=Math.min(l/n,1),h=1-Math.pow(1-f,3),u=o+i*h;this.setProgress(s,u,!1),f<1&&requestAnimationFrame(r)};requestAnimationFrame(r)},show:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="inline-block",t.setAttribute("aria-hidden","false"))},hide:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display==="none"||t.getAttribute("aria-hidden")==="true"?this.show(t):this.hide(t))},destroyAll:function(){document.querySelectorAll('.vd-progress-bar[data-progress-initialized="true"], .progress-bar[data-progress-initialized="true"]').forEach(t=>{delete t.dataset.progressInitialized})}};typeof window.Vanduo<"u"&&window.Vanduo.register("preloader",m),window.VanduoPreloader=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll("select.vd-custom-select-input, select[data-custom-select]").forEach(t=>{this.instances.has(t)||this.initSelect(t)})},initSelect:function(e){if(e.closest(".vd-custom-select-wrapper"))return;let t=[],n=document.createElement("div");n.className="custom-select-wrapper",e.parentNode.insertBefore(n,e),n.appendChild(e);let s=document.createElement("button");s.type="button",s.className="custom-select-button",s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-labelledby",e.id||this.generateId(e));let o=document.createElement("div");if(o.className="custom-select-dropdown",o.setAttribute("role","listbox"),e.dataset.searchable==="true"){let l=document.createElement("div");l.className="custom-select-search";let f=document.createElement("input");f.type="text",f.className="input input-sm",f.placeholder="Search...",f.setAttribute("aria-label","Search options"),l.appendChild(f),o.appendChild(l);let h=d=>{this.filterOptions(o,d.target.value)},u=typeof debounce=="function"?debounce(h,150):h;f.addEventListener("input",u),t.push(()=>f.removeEventListener("input",u))}this.buildOptions(e,o,s),n.appendChild(s),n.appendChild(o),this.updateButtonText(e,s);let i=l=>{l.preventDefault(),l.stopPropagation(),this.toggleDropdown(s,o)};s.addEventListener("click",i),t.push(()=>s.removeEventListener("click",i));let a=l=>{!n.contains(l.target)&&o.classList.contains("is-open")&&this.closeDropdown(s,o)};document.addEventListener("click",a),t.push(()=>document.removeEventListener("click",a));let r=l=>{this.handleKeydown(l,e,s,o)};s.addEventListener("keydown",r),t.push(()=>s.removeEventListener("keydown",r));let c=()=>{this.updateButtonText(e,s),this.updateSelectedOptions(e,o)};e.addEventListener("change",c),t.push(()=>e.removeEventListener("change",c)),this.instances.set(e,{wrapper:n,button:s,dropdown:o,cleanup:t,typeaheadBuffer:"",typeaheadTimer:null})},buildOptions:function(e,t,n){let s=e.querySelectorAll("option"),o=document.createDocumentFragment();s.forEach((i,a)=>{if(i.parentElement.tagName==="OPTGROUP"){let c=i.parentElement;if(!t.querySelector(`[data-group="${c.label}"]`)){let l=document.createElement("div");l.className="custom-select-option-group",l.textContent=c.label,l.dataset.group=c.label,o.appendChild(l)}}if(i.value===""&&!i.textContent.trim())return;let r=document.createElement("div");r.className="custom-select-option",r.textContent=i.textContent,r.setAttribute("role","option"),r.setAttribute("data-value",i.value),r.setAttribute("data-index",a),i.selected&&(r.classList.add("is-selected"),r.setAttribute("aria-selected","true")),i.disabled&&(r.classList.add("is-disabled"),r.setAttribute("aria-disabled","true")),r.addEventListener("click",c=>{i.disabled||this.selectOption(e,i,r,n,t)}),o.appendChild(r)}),t.appendChild(o)},selectOption:function(e,t,n,s,o){e.multiple?(t.selected=!t.selected,n.classList.toggle("is-selected"),n.setAttribute("aria-selected",t.selected)):(e.value=t.value,e.dispatchEvent(new Event("change",{bubbles:!0})),this.closeDropdown(s,o)),this.updateButtonText(e,s)},updateButtonText:function(e,t){if(e.multiple){let n=Array.from(e.selectedOptions);n.length===0?t.textContent=e.dataset.placeholder||"Select options...":n.length===1?t.textContent=n[0].textContent:t.textContent=`${n.length} selected`}else{let n=e.options[e.selectedIndex];t.textContent=n?n.textContent:e.dataset.placeholder||"Select..."}},updateSelectedOptions:function(e,t){let n=t.querySelectorAll(".custom-select-option"),s=Array.from(e.selectedOptions).map(o=>o.value);n.forEach(o=>{let i=o.dataset.value;s.includes(i)?(o.classList.add("is-selected"),o.setAttribute("aria-selected","true")):(o.classList.remove("is-selected"),o.setAttribute("aria-selected","false"))})},toggleDropdown:function(e,t){t.classList.contains("is-open")?this.closeDropdown(e,t):this.openDropdown(e,t)},openDropdown:function(e,t){t.classList.add("is-open"),e.setAttribute("aria-expanded","true");let n=t.querySelector(".custom-select-option:not(.is-disabled)");n&&n.focus()},closeDropdown:function(e,t){t.classList.remove("is-open"),e.setAttribute("aria-expanded","false")},handleKeydown:function(e,t,n,s){let o=s.classList.contains("is-open"),i=Array.from(s.querySelectorAll(".custom-select-option:not(.is-disabled)")),a=i.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":if(e.preventDefault(),o&&a>=0){let r=i[a],c=t.options[parseInt(r.dataset.index)];this.selectOption(t,c,r,n,s)}else this.openDropdown(n,s);break;case"Escape":o&&(e.preventDefault(),this.closeDropdown(n,s),n.focus());break;case"ArrowDown":if(e.preventDefault(),!o)this.openDropdown(n,s);else{let r=a<i.length-1?a+1:0;i[r].focus()}break;case"ArrowUp":if(e.preventDefault(),o){let r=a>0?a-1:i.length-1;i[r].focus()}break;case"Home":o&&(e.preventDefault(),i[0].focus());break;case"End":o&&(e.preventDefault(),i[i.length-1].focus());break;default:if(o&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let r=this.instances.get(t);if(!r)break;clearTimeout(r.typeaheadTimer),r.typeaheadBuffer+=e.key.toLowerCase();let c=i.find(l=>l.textContent.trim().toLowerCase().startsWith(r.typeaheadBuffer));c&&c.focus(),r.typeaheadTimer=setTimeout(()=>{r.typeaheadBuffer=""},500)}break}},filterOptions:function(e,t){let n=e.querySelectorAll(".vd-custom-select-option"),s=t.toLowerCase();n.forEach(o=>{o.textContent.toLowerCase().includes(s)?o.style.display="block":o.style.display="none"})},generateId:function(e){if(e.id)return e.id;let t="select-"+Math.random().toString(36).substr(2,9);return e.id=t,t},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.wrapper&&t.wrapper.parentNode&&(t.wrapper.parentNode.insertBefore(e,t.wrapper),t.wrapper.parentNode.removeChild(t.wrapper)),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("select",m)})();(function(){"use strict";let m={sidenavs:new Map,breakpoint:992,restoreDelayMs:450,_globalCleanups:[],isFixedVariant:function(e){return e.classList.contains("vd-sidenav-fixed")||e.classList.contains("sidenav-fixed")},isPushVariant:function(e){return e.classList.contains("vd-sidenav-push")||e.classList.contains("sidenav-push")},isRightVariant:function(e){return e.classList.contains("vd-sidenav-right")||e.classList.contains("sidenav-right")},getPortalState:function(e){return e._vdPortalState||(e._vdPortalState={originalParent:null,originalNextSibling:null,placeholder:null,restoreTimer:null,restoreHandler:null}),e._vdPortalState},cancelScheduledRestore:function(e){let t=this.getPortalState(e);t.restoreHandler&&(e.removeEventListener("transitionend",t.restoreHandler),t.restoreHandler=null),t.restoreTimer&&(window.clearTimeout(t.restoreTimer),t.restoreTimer=null)},portalToBody:function(e){if(!e)return;if(e.parentNode===document.body){this.cancelScheduledRestore(e);return}let t=this.getPortalState(e);this.cancelScheduledRestore(e),t.originalParent=e.parentNode,t.originalNextSibling=e.nextSibling,t.placeholder||(t.placeholder=document.createComment("vd-sidenav-placeholder")),t.originalParent.insertBefore(t.placeholder,e),document.body.appendChild(e),e.dataset.vdPortaled="true"},restoreFromPortal:function(e){if(!e)return;let t=this.getPortalState(e);if(this.cancelScheduledRestore(e),!t.placeholder){delete e.dataset.vdPortaled;return}t.placeholder.parentNode?(t.placeholder.parentNode.insertBefore(e,t.placeholder),t.placeholder.parentNode.removeChild(t.placeholder)):t.originalParent&&t.originalParent.isConnected&&(t.originalNextSibling&&t.originalNextSibling.parentNode===t.originalParent?t.originalParent.insertBefore(e,t.originalNextSibling):t.originalParent.appendChild(e)),t.originalParent=null,t.originalNextSibling=null,t.placeholder=null,delete e.dataset.vdPortaled},scheduleRestoreFromPortal:function(e){if(!e||e.parentNode!==document.body)return;let t=this.getPortalState(e);this.cancelScheduledRestore(e);let n=()=>{this.restoreFromPortal(e)},s=o=>{o.target!==e||o.propertyName!=="transform"||n()};t.restoreHandler=s,e.addEventListener("transitionend",s),t.restoreTimer=window.setTimeout(()=>{n()},this.restoreDelayMs)},init:function(){document.querySelectorAll(".vd-sidenav, .vd-offcanvas").forEach(s=>{this.sidenavs.has(s)||this.initSidenav(s)}),document.querySelectorAll("[data-sidenav-toggle]").forEach(s=>{if(s.dataset.sidenavToggleInitialized)return;s.dataset.sidenavToggleInitialized="true";let o=i=>{i.preventDefault();let a=s.dataset.sidenavToggle,r=document.querySelector(a);r&&this.toggle(r)};s.addEventListener("click",o),this._globalCleanups.push(()=>s.removeEventListener("click",o))}),this.handleResize();let n=()=>{this.handleResize()};window.addEventListener("resize",n),this._globalCleanups.push(()=>window.removeEventListener("resize",n))},initSidenav:function(e){let t=e.getAttribute("data-vd-position");if(t){let r=e.classList.contains("vd-offcanvas")?"vd-offcanvas":"vd-sidenav";e.classList.add(r+"-"+t)}let n=this.createOverlay(e),s=e.querySelector(".vd-sidenav-close, .vd-offcanvas-close"),o=[];if(e.setAttribute("role","navigation"),e.setAttribute("aria-hidden","true"),s){let r=()=>{this.close(e)};s.addEventListener("click",r),o.push(()=>s.removeEventListener("click",r))}let i=()=>{e.dataset.backdrop!=="static"&&this.close(e)};n.addEventListener("click",i),o.push(()=>n.removeEventListener("click",i));let a=r=>{r.key==="Escape"&&e.classList.contains("is-open")&&e.dataset.keyboard!=="false"&&this.close(e)};document.addEventListener("keydown",a),o.push(()=>document.removeEventListener("keydown",a)),this.sidenavs.set(e,{overlay:n,cleanup:o})},createOverlay:function(e){let t=e.querySelector(".vd-sidenav-overlay");return t||(t=document.createElement("div"),t.className="vd-sidenav-overlay",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);this.portalToBody(t),this.isFixedVariant(t)||n.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),document.body.classList.add("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!0),t.dispatchEvent(new CustomEvent("sidenav:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);n.classList.remove("is-visible"),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),document.body.classList.remove("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!1),t.dispatchEvent(new CustomEvent("sidenav:close",{bubbles:!0})),this.scheduleRestoreFromPortal(t)},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},handlePushVariant:function(e,t){let n=document.querySelector('main, .main-content, .content, [role="main"]')||document.body;t?window.innerWidth>=this.breakpoint&&(this.isRightVariant(e)?n.style.marginRight=e.offsetWidth+"px":n.style.marginLeft=e.offsetWidth+"px"):(n.style.marginLeft="",n.style.marginRight="")},handleResize:function(){this.sidenavs.forEach(({overlay:e},t)=>{window.innerWidth>=this.breakpoint?this.isFixedVariant(t)&&!t.classList.contains("is-open")&&(t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),e.classList.remove("is-visible")):this.isFixedVariant(t)&&t.classList.contains("is-open")&&this.close(t)})},destroy:function(e){let t=this.sidenavs.get(e);t&&(e.classList.contains("is-open")&&(t.overlay.classList.remove("is-visible"),e.classList.remove("is-open"),e.setAttribute("aria-hidden","true"),document.body.classList.remove("body-sidenav-open")),this.restoreFromPortal(e),t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.sidenavs.delete(e))},destroyAll:function(){this.sidenavs.forEach((e,t)=>{this.destroy(t)}),this._globalCleanups.forEach(e=>e()),this._globalCleanups=[]}};typeof window.Vanduo<"u"&&window.Vanduo.register("sidenav",m),window.VanduoSidenav=m})();(function(){"use strict";let m={instances:new Map,init:function(){document.querySelectorAll(".vd-tabs, [data-tabs]").forEach(t=>{this.instances.has(t)||this.initTabs(t)})},initTabs:function(e){let t=e.querySelector('.vd-tab-list, [role="tablist"]'),n=e.querySelectorAll(".vd-tab-link, [data-tab]"),s=e.querySelectorAll(".vd-tab-pane, [data-tab-pane]");if(!t||n.length===0)return;let o=[];t.setAttribute("role","tablist"),n.forEach((a,r)=>{let c=this.getTabId(a,r),l=this.findPane(e,c,s);a.setAttribute("role","tab"),a.setAttribute("aria-selected",a.classList.contains("is-active")?"true":"false"),a.setAttribute("tabindex",a.classList.contains("is-active")?"0":"-1"),a.id||(a.id=`tab-btn-${c}`),l&&(l.setAttribute("role","tabpanel"),l.setAttribute("aria-labelledby",a.id),l.id||(l.id=`tab-pane-${c}`),a.setAttribute("aria-controls",l.id));let f=u=>{u.preventDefault(),!a.classList.contains("disabled")&&!a.disabled&&this.activateTab(e,a,n,s)};a.addEventListener("click",f),o.push(()=>a.removeEventListener("click",f));let h=u=>{this.handleKeydown(u,e,a,n,s)};a.addEventListener("keydown",h),o.push(()=>a.removeEventListener("keydown",h))}),!e.querySelector(".vd-tab-link.is-active, [data-tab].is-active")&&n.length>0&&this.activateTab(e,n[0],n,s),this.instances.set(e,{cleanup:o})},getTabId:function(e,t){return e.dataset.tabTarget||e.dataset.tab||e.getAttribute("href")?.replace("#","")||(typeof t=="number"?`tab-${t}`:e.id)},findPane:function(e,t,n){let s=e.querySelector(`[data-tab-pane="${t}"]`);return s||(s=e.querySelector(`#${t}`)),s||e.querySelectorAll(".vd-tab-link, [data-tab]").forEach((i,a)=>{this.getTabId(i,a)===t&&n[a]&&(s=n[a])}),s},activateTab:function(e,t,n,s){let o=Array.from(n).indexOf(t),i=this.getTabId(t,o);n.forEach(c=>{c.classList.remove("is-active"),c.setAttribute("aria-selected","false"),c.setAttribute("tabindex","-1"),c.parentElement&&c.parentElement.classList.contains("tab-item")&&c.parentElement.classList.remove("is-active")}),s.forEach(c=>{c.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),t.parentElement&&t.parentElement.classList.contains("tab-item")&&t.parentElement.classList.add("is-active");let a=this.findPane(e,i,s);a&&a.classList.add("is-active");let r=new CustomEvent("tab:change",{bubbles:!0,detail:{tab:t,pane:a,tabId:i}});e.dispatchEvent(r)},handleKeydown:function(e,t,n,s,o){let i=t.classList.contains("vd-tabs-vertical")||t.classList.contains("tabs-vertical"),a=Array.from(s).filter(l=>!l.classList.contains("disabled")&&!l.disabled),r=a.indexOf(n),c=r;switch(e.key){case"ArrowLeft":i||(e.preventDefault(),c=r>0?r-1:a.length-1);break;case"ArrowRight":i||(e.preventDefault(),c=r<a.length-1?r+1:0);break;case"ArrowUp":i&&(e.preventDefault(),c=r>0?r-1:a.length-1);break;case"ArrowDown":i&&(e.preventDefault(),c=r<a.length-1?r+1:0);break;case"Home":e.preventDefault(),c=0;break;case"End":e.preventDefault(),c=a.length-1;break;case"Enter":case" ":e.preventDefault(),this.activateTab(t,n,s,o);return;default:return}c!==r&&(a[c].focus(),this.activateTab(t,a[c],s,o))},show:function(e){let t;if(typeof e=="string"?t=document.querySelector(`[data-tab-target="${e}"], [data-tab="${e}"], [href="#${e}"]`):t=e,!t)return;let n=t.closest(".vd-tabs, [data-tabs]");if(!n)return;let s=n.querySelectorAll(".vd-tab-link, [data-tab]"),o=n.querySelectorAll(".vd-tab-pane, [data-tab-pane]");this.activateTab(n,t,s,o)},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("tabs",m)})();(function(){"use strict";let m={STORAGE_KEYS:{PRIMARY:"vanduo-primary-color",NEUTRAL:"vanduo-neutral-color",RADIUS:"vanduo-radius",FONT:"vanduo-font-preference",THEME:"vanduo-theme-preference"},DEFAULTS:{PRIMARY_LIGHT:"black",PRIMARY_DARK:"amber",NEUTRAL:"charcoal",RADIUS:"0.5",FONT:"ubuntu",THEME:"system"},PRIMARY_COLORS:{black:{name:"Black",color:"#000000"},red:{name:"Red",color:"#fa5252"},orange:{name:"Orange",color:"#fd7e14"},amber:{name:"Amber",color:"#f59f00"},yellow:{name:"Yellow",color:"#fcc419"},lime:{name:"Lime",color:"#82c91e"},green:{name:"Green",color:"#40c057"},emerald:{name:"Emerald",color:"#20c997"},teal:{name:"Teal",color:"#12b886"},cyan:{name:"Cyan",color:"#22b8cf"},sky:{name:"Sky",color:"#3bc9db"},blue:{name:"Blue",color:"#228be6"},indigo:{name:"Indigo",color:"#4c6ef5"},violet:{name:"Violet",color:"#7950f2"},purple:{name:"Purple",color:"#be4bdb"},fuchsia:{name:"Fuchsia",color:"#f06595"},pink:{name:"Pink",color:"#e64980"},rose:{name:"Rose",color:"#ff8787"}},NEUTRAL_COLORS:{charcoal:{name:"Charcoal",color:"#0d1117"},slate:{name:"Slate",color:"#64748b"},gray:{name:"Gray",color:"#6b7280"},zinc:{name:"Zinc",color:"#71717a"},neutral:{name:"Neutral",color:"#737373"},stone:{name:"Stone",color:"#78716c"}},RADIUS_OPTIONS:["0","0.125","0.25","0.375","0.5"],FONT_OPTIONS:{"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},system:{name:"System Default",family:null},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif"},lato:{name:"Lato",family:"'Lato', sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif"}},THEME_MODES:["system","dark","light"],state:{primary:null,neutral:null,radius:null,font:null,theme:null,isOpen:!1},isInitialized:!1,_cleanup:[],elements:{customizer:null,trigger:null,triggers:[],panel:null,overlay:null},init:function(){if(this.isInitialized){this.bindExistingElements(),this.bindTriggerEvents(),this.bindPanelEvents(),this.updateUI();return}this.isInitialized=!0,this._cleanup=[],this.loadPreferences(),this.applyAllPreferences(),this.bindExistingElements(),this.bindEvents(),console.log("Vanduo Theme Customizer initialized")},addListener:function(e,t,n,s){e&&(e.addEventListener(t,n,s),this._cleanup.push(()=>e.removeEventListener(t,n,s)))},getDefaultPrimary:function(e){return e==="system"?window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT:e==="dark"?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT},loadPreferences:function(){this.state.theme=this.getStorageValue(this.STORAGE_KEYS.THEME,this.DEFAULTS.THEME),this.state.primary=this.getStorageValue(this.STORAGE_KEYS.PRIMARY,this.getDefaultPrimary(this.state.theme)),this._normalizeDefaultPrimaryIfStaleWithStoredTheme(),this.state.neutral=this.getStorageValue(this.STORAGE_KEYS.NEUTRAL,this.DEFAULTS.NEUTRAL),this.state.radius=this.getStorageValue(this.STORAGE_KEYS.RADIUS,this.DEFAULTS.RADIUS),this.state.font=this.getStorageValue(this.STORAGE_KEYS.FONT,this.DEFAULTS.FONT)},savePreference:function(e,t){this.setStorageValue(e,t)},applyAllPreferences:function(){this.applyPrimary(this.state.primary),this.applyNeutral(this.state.neutral),this.applyRadius(this.state.radius),this.applyFont(this.state.font),this.applyTheme(this.state.theme)},applyPrimary:function(e){this.PRIMARY_COLORS[e]||(e=this.getDefaultPrimary(this.state.theme)),this.state.primary=e,document.documentElement.setAttribute("data-primary",e),this.savePreference(this.STORAGE_KEYS.PRIMARY,e),this.dispatchEvent("primary-change",{color:e})},applyNeutral:function(e){this.NEUTRAL_COLORS[e]||(e=this.DEFAULTS.NEUTRAL),this.state.neutral=e,document.documentElement.setAttribute("data-neutral",e),this.savePreference(this.STORAGE_KEYS.NEUTRAL,e),this.dispatchEvent("neutral-change",{neutral:e})},applyRadius:function(e){this.RADIUS_OPTIONS.includes(e)||(e=this.DEFAULTS.RADIUS),this.state.radius=e,document.documentElement.setAttribute("data-radius",e),document.documentElement.style.setProperty("--radius-scale",e),this.savePreference(this.STORAGE_KEYS.RADIUS,e),this.dispatchEvent("radius-change",{radius:e})},applyFont:function(e){this.FONT_OPTIONS[e]||(e=this.DEFAULTS.FONT),this.state.font=e,e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e),this.savePreference(this.STORAGE_KEYS.FONT,e),window.FontSwitcher&&window.FontSwitcher.setPreference&&(window.FontSwitcher.state.preference=e,window.FontSwitcher.applyFont()),this.dispatchEvent("font-change",{font:e})},applyTheme:function(e){if(this.THEME_MODES.includes(e)||(e=this.DEFAULTS.THEME),this._isApplying=!0,this.isUsingDefaultPrimary()){let t=this.getDefaultPrimary(e);this.state.primary!==t&&this.applyPrimary(t)}if(this.state.theme=e,e==="system"?document.documentElement.removeAttribute("data-theme"):document.documentElement.setAttribute("data-theme",e),this.savePreference(this.STORAGE_KEYS.THEME,e),window.Vanduo&&window.Vanduo.components.themeSwitcher){let t=window.Vanduo.components.themeSwitcher;t.state&&t.state.preference!==e&&(t.state.preference=e,typeof t.setStorageValue=="function"&&t.setStorageValue(t.STORAGE_KEY,e),typeof t.updateUI=="function"&&t.updateUI())}this._isApplying=!1,this.dispatchEvent("mode-change",{mode:e})},dispatchEvent:function(e,t){let n=new CustomEvent("theme:"+e,{bubbles:!0,detail:t});document.dispatchEvent(n);let s=new CustomEvent("theme:change",{bubbles:!0,detail:{type:e,value:t[Object.keys(t)[0]],state:{...this.state}}});document.dispatchEvent(s)},bindExistingElements:function(){this.elements.customizer=document.querySelector(".vd-theme-customizer"),this.elements.triggers=Array.from(document.querySelectorAll("[data-theme-customizer-trigger]")),!this.elements.trigger&&this.elements.triggers.length&&(this.elements.trigger=this.elements.triggers[0]),this.elements.customizer?(this.elements.trigger=this.elements.customizer.querySelector(".vd-theme-customizer-trigger")||this.elements.trigger,this.elements.panel=this.elements.customizer.querySelector(".vd-theme-customizer-panel"),this.elements.overlay=this.elements.customizer.querySelector(".vd-theme-customizer-overlay")):this.elements.triggers.length&&this.createDynamicPanel(),this.updateUI()},createDynamicPanel:function(){if(!this.elements.triggers.length)return;this.elements.trigger=this.elements.triggers[0];let e=document.createElement("div");e.className="vd-theme-customizer-overlay";let t=document.createElement("div");t.className="vd-theme-customizer-panel",t.innerHTML=this.getPanelHTML(),document.body.appendChild(e),document.body.appendChild(t),this.elements.panel=t,this.elements.overlay=e,this.elements.customizer={contains:n=>t.contains(n)||this.elements.triggers.some(s=>s.contains(n))},this.positionPanel(),this.bindPanelEvents(),this.addListener(window,"resize",()=>this.positionPanel())},positionPanel:function(){if(!this.elements.panel||!this.elements.trigger)return;let e=this.elements.activeTrigger||this.elements.trigger;if(window.innerWidth<768)this.elements.panel.style.top="",this.elements.panel.style.right="",this.elements.panel.style.left="",this.elements.panel.style.height="",this.elements.panel.style.maxHeight="";else{let n=e.getBoundingClientRect(),s=320,o=n.bottom+8,i=window.innerWidth,a=i-n.right;i-a-s<8&&(a=i-s-8),this.elements.panel.style.top=o+"px",this.elements.panel.style.right=a+"px",this.elements.panel.style.left="",this.elements.panel.style.height="auto",this.elements.panel.style.maxHeight="calc(100vh - "+o+"px)"}},bindPanelEvents:function(){if(!this.elements.panel||this.elements.panel.getAttribute("data-customizer-initialized")==="true")return;this.elements.panel.setAttribute("data-customizer-initialized","true"),this.elements.panel.querySelectorAll("[data-color]").forEach(s=>{this.addListener(s,"click",()=>{this.applyPrimary(s.dataset.color),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(s=>{this.addListener(s,"click",()=>{this.applyNeutral(s.dataset.neutral),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-radius]").forEach(s=>{this.addListener(s,"click",()=>{this.applyRadius(s.dataset.radius),this.updateUI()})});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&this.addListener(e,"change",s=>{this.applyFont(s.target.value),this.updateUI()});let t=this.elements.panel.querySelector(".customizer-reset");t&&this.addListener(t,"click",()=>{this.reset()});let n=this.elements.panel.querySelector(".customizer-mobile-close");n&&this.addListener(n,"click",()=>{this.close()}),this.elements.overlay&&this.addListener(this.elements.overlay,"click",()=>{this.close()})},getPanelHTML:function(){let e=typeof escapeHtml=="function"?escapeHtml:function(a){let r=document.createElement("div");return r.textContent=String(a??""),r.innerHTML},t=function(a){let r=String(a??"").trim();return/^(#[0-9a-fA-F]{3,8}|rgb[a]?\([^)]{1,60}\)|hsl[a]?\([^)]{1,60}\)|var\(--[a-zA-Z0-9_-]{1,40}\))$/.test(r)?r:"#000000"},n="";for(let[a,r]of Object.entries(this.PRIMARY_COLORS))n+=`<button class="tc-color-swatch${a===this.state.primary?" is-active":""}" data-color="${e(a)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"></button>`;let s="";for(let[a,r]of Object.entries(this.NEUTRAL_COLORS))s+=`<button class="tc-neutral-swatch${a===this.state.neutral?" is-active":""}" data-neutral="${e(a)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"><span>${e(r.name)}</span></button>`;let o="";this.RADIUS_OPTIONS.forEach(a=>{o+=`<button class="tc-radius-btn${a===this.state.radius?" is-active":""}" data-radius="${e(a)}">${e(a)}</button>`});let i="";for(let[a,r]of Object.entries(this.FONT_OPTIONS))i+=`<option value="${e(a)}"${a===this.state.font?" selected":""}>${e(r.name)}</option>`;return`
|
|
6
6
|
<div class="tc-header">
|
|
7
7
|
<h3 class="tc-title">Customize Theme</h3>
|
|
8
8
|
<button class="customizer-mobile-close" aria-label="Close">
|