vanduo-framework 1.1.8
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/LICENSE +35 -0
- package/README.md +205 -0
- package/css/components/alerts.css +224 -0
- package/css/components/avatar.css +275 -0
- package/css/components/badges.css +230 -0
- package/css/components/breadcrumbs.css +146 -0
- package/css/components/button-group.css +82 -0
- package/css/components/buttons.css +530 -0
- package/css/components/cards.css +304 -0
- package/css/components/chips.css +259 -0
- package/css/components/code-snippet.css +555 -0
- package/css/components/collapsible.css +267 -0
- package/css/components/collections.css +253 -0
- package/css/components/doc-search.css +464 -0
- package/css/components/doc-tabs.css +38 -0
- package/css/components/draggable.css +317 -0
- package/css/components/dropdown.css +266 -0
- package/css/components/footer.css +375 -0
- package/css/components/forms.css +1774 -0
- package/css/components/image-box.css +279 -0
- package/css/components/modals.css +285 -0
- package/css/components/navbar.css +530 -0
- package/css/components/pagination.css +186 -0
- package/css/components/preloader.css +340 -0
- package/css/components/progress.css +107 -0
- package/css/components/sidenav.css +301 -0
- package/css/components/skeleton.css +241 -0
- package/css/components/spinner.css +144 -0
- package/css/components/tabs.css +327 -0
- package/css/components/theme-customizer.css +835 -0
- package/css/components/toast.css +357 -0
- package/css/components/tooltips.css +270 -0
- package/css/core/colors.css +1017 -0
- package/css/core/fonts.css +266 -0
- package/css/core/grid.css +1699 -0
- package/css/core/helpers.css +2202 -0
- package/css/core/reset.css +128 -0
- package/css/core/tokens.css +213 -0
- package/css/core/typography.css +405 -0
- package/css/core/vd-aliases.css +47 -0
- package/css/effects/parallax.css +113 -0
- package/css/icons/icons-all.css +23 -0
- package/css/icons/icons.css +25 -0
- package/css/utilities/media.css +167 -0
- package/css/utilities/print.css +111 -0
- package/css/utilities/shadow.css +243 -0
- package/css/utilities/table.css +381 -0
- package/css/utilities/transforms.css +71 -0
- package/css/utilities/transitions.css +87 -0
- package/css/vanduo.css +80 -0
- package/dist/build-info.json +6 -0
- package/dist/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
- package/dist/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
- package/dist/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
- package/dist/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
- package/dist/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
- package/dist/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
- package/dist/fonts/inter/inter-bold.woff2 +0 -0
- package/dist/fonts/inter/inter-medium.woff2 +0 -0
- package/dist/fonts/inter/inter-regular.woff2 +0 -0
- package/dist/fonts/inter/inter-semibold.woff2 +0 -0
- package/dist/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
- package/dist/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
- package/dist/fonts/open-sans/open-sans-bold.woff2 +0 -0
- package/dist/fonts/open-sans/open-sans-medium.woff2 +0 -0
- package/dist/fonts/open-sans/open-sans-regular.woff2 +0 -0
- package/dist/fonts/rubik/rubik-bold.woff2 +0 -0
- package/dist/fonts/rubik/rubik-medium.woff2 +0 -0
- package/dist/fonts/rubik/rubik-regular.woff2 +0 -0
- package/dist/fonts/source-sans/source-sans-bold.woff2 +0 -0
- package/dist/fonts/source-sans/source-sans-regular.woff2 +0 -0
- package/dist/fonts/source-sans/source-sans-semibold.woff2 +0 -0
- package/dist/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
- package/dist/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
- package/dist/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
- package/dist/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
- package/dist/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
- package/dist/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
- package/dist/icons/phosphor/LICENSE +21 -0
- package/dist/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
- package/dist/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
- package/dist/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
- package/dist/icons/phosphor/bold/style.css +4627 -0
- package/dist/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
- package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
- package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
- package/dist/icons/phosphor/duotone/style.css +12115 -0
- package/dist/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
- package/dist/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
- package/dist/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
- package/dist/icons/phosphor/fill/style.css +4627 -0
- package/dist/icons/phosphor/light/Phosphor-Light.ttf +0 -0
- package/dist/icons/phosphor/light/Phosphor-Light.woff +0 -0
- package/dist/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
- package/dist/icons/phosphor/light/style.css +4627 -0
- package/dist/icons/phosphor/regular/Phosphor.ttf +0 -0
- package/dist/icons/phosphor/regular/Phosphor.woff +0 -0
- package/dist/icons/phosphor/regular/Phosphor.woff2 +0 -0
- package/dist/icons/phosphor/regular/style.css +4627 -0
- package/dist/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
- package/dist/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
- package/dist/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
- package/dist/icons/phosphor/thin/style.css +4627 -0
- package/dist/vanduo.cjs.js +5569 -0
- package/dist/vanduo.cjs.js.map +7 -0
- package/dist/vanduo.cjs.min.js +48 -0
- package/dist/vanduo.cjs.min.js.map +7 -0
- package/dist/vanduo.css +60666 -0
- package/dist/vanduo.css.map +1 -0
- package/dist/vanduo.esm.js +5548 -0
- package/dist/vanduo.esm.js.map +7 -0
- package/dist/vanduo.esm.min.js +48 -0
- package/dist/vanduo.esm.min.js.map +7 -0
- package/dist/vanduo.js +5545 -0
- package/dist/vanduo.js.map +7 -0
- package/dist/vanduo.min.css +2 -0
- package/dist/vanduo.min.css.map +1 -0
- package/dist/vanduo.min.js +48 -0
- package/dist/vanduo.min.js.map +7 -0
- package/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
- package/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
- package/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
- package/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
- package/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
- package/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
- package/fonts/inter/inter-bold.woff2 +0 -0
- package/fonts/inter/inter-medium.woff2 +0 -0
- package/fonts/inter/inter-regular.woff2 +0 -0
- package/fonts/inter/inter-semibold.woff2 +0 -0
- package/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
- package/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
- package/fonts/open-sans/open-sans-bold.woff2 +0 -0
- package/fonts/open-sans/open-sans-medium.woff2 +0 -0
- package/fonts/open-sans/open-sans-regular.woff2 +0 -0
- package/fonts/rubik/rubik-bold.woff2 +0 -0
- package/fonts/rubik/rubik-medium.woff2 +0 -0
- package/fonts/rubik/rubik-regular.woff2 +0 -0
- package/fonts/source-sans/source-sans-bold.woff2 +0 -0
- package/fonts/source-sans/source-sans-regular.woff2 +0 -0
- package/fonts/source-sans/source-sans-semibold.woff2 +0 -0
- package/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
- package/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
- package/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
- package/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
- package/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
- package/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
- package/icons/phosphor/LICENSE +21 -0
- package/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
- package/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
- package/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
- package/icons/phosphor/bold/style.css +4627 -0
- package/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
- package/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
- package/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
- package/icons/phosphor/duotone/style.css +12115 -0
- package/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
- package/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
- package/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
- package/icons/phosphor/fill/style.css +4627 -0
- package/icons/phosphor/light/Phosphor-Light.ttf +0 -0
- package/icons/phosphor/light/Phosphor-Light.woff +0 -0
- package/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
- package/icons/phosphor/light/style.css +4627 -0
- package/icons/phosphor/regular/Phosphor.ttf +0 -0
- package/icons/phosphor/regular/Phosphor.woff +0 -0
- package/icons/phosphor/regular/Phosphor.woff2 +0 -0
- package/icons/phosphor/regular/style.css +4627 -0
- package/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
- package/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
- package/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
- package/icons/phosphor/thin/style.css +4627 -0
- package/js/components/code-snippet.js +639 -0
- package/js/components/collapsible.js +226 -0
- package/js/components/doc-search.js +936 -0
- package/js/components/draggable.js +725 -0
- package/js/components/dropdown.js +362 -0
- package/js/components/font-switcher.js +253 -0
- package/js/components/grid.js +279 -0
- package/js/components/image-box.js +372 -0
- package/js/components/modals.js +367 -0
- package/js/components/navbar.js +264 -0
- package/js/components/pagination.js +286 -0
- package/js/components/parallax.js +216 -0
- package/js/components/preloader.js +183 -0
- package/js/components/select.js +444 -0
- package/js/components/sidenav.js +303 -0
- package/js/components/tabs.js +303 -0
- package/js/components/theme-customizer.js +784 -0
- package/js/components/theme-switcher.js +183 -0
- package/js/components/toast.js +343 -0
- package/js/components/tooltips.js +306 -0
- package/js/index.js +52 -0
- package/js/utils/helpers.js +306 -0
- package/js/utils/lifecycle.js +135 -0
- package/js/vanduo.js +120 -0
- package/package.json +78 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*! Vanduo v1.1.8 | Built: 2026-02-22T08:35:53.100Z | git:2f8bfd5 | production */
|
|
2
|
+
(function(){"use strict";let u={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let i=this.instances.get(e);i.cleanup=i.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(i){console.warn("[Vanduo Lifecycle] Cleanup error:",i)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,i){(!e||n.component===e)&&t.push(i)}),t.forEach(function(n){u.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,i){e.contains(i)&&t.push(i)}),t.forEach(function(n){u.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(){u.destroyAll()}),window.VanduoLifecycle=u,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",u)})();(function(){"use strict";let u={version:"1.1.6",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(e=>{let t=this.components[e];if(t.init&&typeof t.init=="function")try{t.init()}catch(n){console.warn('[Vanduo] Failed to initialize component "'+e+'":',n)}}),console.log("Vanduo Framework v1.1.6 initialized")},register:function(e,t){this.components[e]=t},reinit:function(e){var t=this.components[e];if(t&&t.init&&typeof t.init=="function")try{t.init()}catch(n){console.warn('[Vanduo] Failed to reinitialize component "'+e+'":',n)}},destroyAll:function(){for(var e=Object.keys(this.components),t=0;t<e.length;t++){var n=this.components[e[t]];if(n&&n.destroyAll&&typeof n.destroyAll=="function")try{n.destroyAll()}catch(i){console.warn('[Vanduo] Failed to destroy component "'+e[t]+'":',i)}}typeof window.VanduoLifecycle<"u"&&window.VanduoLifecycle.destroyAll()},getComponent:function(e){return this.components[e]||null}};window.Vanduo=u})();(function(){"use strict";let u={_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,i){t&&(t.addEventListener(n,i),e._codeSnippetCleanup||(e._codeSnippetCleanup=[]),e._codeSnippetCleanup.push(()=>t.removeEventListener(n,i)))},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 i=e.querySelectorAll(".vd-code-snippet-tab"),s=e.querySelectorAll(".vd-code-snippet-pane");i.length>0&&this.initTabs(e,i,s);let a=e.querySelector(".vd-code-snippet-copy");a&&this.initCopyButton(e,a),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 i=e.dataset.expanded==="true";t.setAttribute("aria-expanded",i),n.dataset.visible=i,this.addListener(e,t,"click",()=>{let s=e.dataset.expanded==="true";e.dataset.expanded=!s,t.setAttribute("aria-expanded",!s),n.dataset.visible=!s,s||n.querySelectorAll("[data-extract]:not([data-extracted])").forEach(r=>{this.extractHtml(r)});let a=new CustomEvent("codesnippet:toggle",{bubbles:!0,detail:{snippet:e,expanded:!s}});e.dispatchEvent(a)})},initTabs:function(e,t,n){let i=this.getSnippetInstanceId(e),s=e.querySelector(".vd-code-snippet-tabs");s&&s.setAttribute("role","tablist"),t.forEach((a,o)=>{let r=a.dataset.lang,c=a.classList.contains("is-active");a.setAttribute("role","tab"),a.setAttribute("aria-selected",c),a.setAttribute("tabindex",c?"0":"-1"),a.id=a.id||`code-tab-${i}-${r||"tab"}-${o}`;let l=e.querySelector(`.vd-code-snippet-pane[data-lang="${r}"]`);l&&(l.id=l.id||`code-pane-${i}-${r||"pane"}-${o}`,l.setAttribute("role","tabpanel"),a.setAttribute("aria-controls",l.id),l.setAttribute("aria-labelledby",a.id)),this.addListener(e,a,"click",()=>{this.switchTab(e,a,t,n)}),this.addListener(e,a,"keydown",m=>{this.handleTabKeydown(m,e,t,n)})})},switchTab:function(e,t,n,i){let s=t.dataset.lang;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1")}),i.forEach(r=>{r.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0");let a=e.querySelector(`.vd-code-snippet-pane[data-lang="${s}"]`);a&&a.classList.add("is-active");let o=new CustomEvent("codesnippet:tabchange",{bubbles:!0,detail:{snippet:e,tab:t,lang:s}});e.dispatchEvent(o)},handleTabKeydown:function(e,t,n,i){let s=Array.from(n),a=s.indexOf(e.target),o;switch(e.key){case"ArrowLeft":e.preventDefault(),o=a>0?a-1:s.length-1;break;case"ArrowRight":e.preventDefault(),o=a<s.length-1?a+1:0;break;case"Home":e.preventDefault(),o=0;break;case"End":e.preventDefault(),o=s.length-1;break;default:return}o!==a&&(s[o].focus(),this.switchTab(t,s[o],n,i))},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 s=(n.querySelector("code")||n).textContent;try{await navigator.clipboard.writeText(s),this.showCopyFeedback(t,!0)}catch{let r=this.fallbackCopy(s);this.showCopyFeedback(t,r)}let a=new CustomEvent("codesnippet:copy",{bubbles:!0,detail:{snippet:e,code:s,success:!0}});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(i){console.warn("CodeSnippet: Fallback copy failed",i)}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 i=n.innerHTML;i=this.formatHtml(i),i=this.escapeHtml(i),i=this.highlightHtml(i),e.innerHTML="<code>"+i+"</code>",e.dataset.extracted="true"},formatHtml:function(e){e=e.trim();let t=e.split(`
|
|
3
|
+
`),n=0,i=2,s=[];return t.forEach(a=>{if(a=a.trim(),!a)return;a.match(/^<\/\w/)&&(n=Math.max(0,n-i)),s.push(" ".repeat(n)+a);let o=/<[a-zA-Z]/.test(a),r=a.includes("/>");o&&!r&&(a.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)||a.match(/<\/\w+>$/)||(n+=i))}),s.join(`
|
|
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 i=new RegExp(`\\b(${n})\\b`,"g");e=e.replace(i,'<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 i=t.innerHTML.split(`
|
|
5
|
+
`).length,s=document.createElement("div");s.className="vd-code-snippet-line-numbers",s.setAttribute("aria-hidden","true");for(let o=1;o<=i;o++){let r=document.createElement("span");r.textContent=o,s.appendChild(r)}let a=document.createElement("div");a.className="vd-code-snippet-code",a.innerHTML=t.outerHTML,t.parentNode.removeChild(t),e.appendChild(s),e.appendChild(a)},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}"]`),i=e.querySelectorAll(".vd-code-snippet-tab"),s=e.querySelectorAll(".vd-code-snippet-pane");n&&this.switchTab(e,n,i,s)},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",u),window.CodeSnippet=u})();(function(){"use strict";let u={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"),i=[];n.forEach(s=>{let a=s.querySelector(".vd-collapsible-header, .accordion-header"),o=s.querySelector(".vd-collapsible-body, .accordion-body"),r=s.querySelector(".vd-collapsible-trigger, .accordion-trigger")||a;if(!a||!o)return;s.classList.contains("is-open")?this.openItem(s,o,!1):this.closeItem(s,o,!1);let c=l=>{l.preventDefault(),this.toggleItem(s,o,e,t)};r.addEventListener("click",c),i.push(()=>r.removeEventListener("click",c))}),this.instances.set(e,{cleanup:i})},toggleItem:function(e,t,n,i){e.classList.contains("is-open")?this.closeItem(e,t):(i&&n.querySelectorAll(".vd-collapsible-item.is-open, .accordion-item.is-open").forEach(o=>{if(o!==e){let r=o.querySelector(".vd-collapsible-body, .accordion-body");this.closeItem(o,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 i=t.scrollHeight;t.style.maxHeight=`${i}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"),i=t.closest(".vd-collapsible, .accordion"),s=i&&i.classList.contains("accordion");n&&this.toggleItem(t,n,i,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("collapsible",u),window.VanduoCollapsible=u})();(function(){"use strict";let u={instances:new Map,_typeaheadBuffer:"",_typeaheadTimer:null,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 i=[];t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),n.setAttribute("role","menu"),n.setAttribute("aria-hidden","true");let s=c=>{c.preventDefault(),c.stopPropagation(),this.toggleDropdown(e,t,n)};t.addEventListener("click",s),i.push(()=>t.removeEventListener("click",s));let a=c=>{!e.contains(c.target)&&n.classList.contains("is-open")&&this.closeDropdown(e,t,n)};document.addEventListener("click",a),i.push(()=>document.removeEventListener("click",a));let o=c=>{this.handleKeydown(c,e,t,n)};t.addEventListener("keydown",o),i.push(()=>t.removeEventListener("keydown",o)),n.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)").forEach(c=>{let l=p=>{p.preventDefault(),this.selectItem(c,e,t,n)};c.addEventListener("click",l),i.push(()=>c.removeEventListener("click",l));let m=p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),this.selectItem(c,e,t,n))};c.addEventListener("keydown",m),i.push(()=>c.removeEventListener("keydown",m))}),this.instances.set(e,{toggle:t,menu:n,cleanup:i})},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(a=>{if(a!==n){let o=a.closest(".vd-dropdown"),r=o.querySelector(".vd-dropdown-toggle");this.closeDropdown(o,r,a)}}),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 s=n.querySelector(".vd-dropdown-item:not(.disabled):not(.is-disabled)");s&&setTimeout(()=>s.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(),i=t.getBoundingClientRect(),s=window.innerWidth,a=window.innerHeight,o=8;n.left+i.width>s-o&&(t.classList.add("vd-dropdown-menu-end"),t.classList.remove("vd-dropdown-menu-start")),t.classList.contains("dropdown-menu-top")?n.top-i.height<o&&t.classList.remove("vd-dropdown-menu-top"):n.bottom+i.height>a-o&&t.classList.add("vd-dropdown-menu-top")},handleKeydown:function(e,t,n,i){let s=i.classList.contains("is-open"),a=Array.from(i.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)")),o=a.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":case"ArrowDown":if(e.preventDefault(),!s)this.openDropdown(t,n,i);else if(e.key==="ArrowDown"){let r=o<a.length-1?o+1:0;a[r].focus()}break;case"ArrowUp":if(s){e.preventDefault();let r=o>0?o-1:a.length-1;a[r].focus()}break;case"Escape":s&&(e.preventDefault(),this.closeDropdown(t,n,i));break;case"Home":s&&(e.preventDefault(),a[0].focus());break;case"End":s&&(e.preventDefault(),a[a.length-1].focus());break;default:if(s&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let r=a.find(c=>c.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));r&&r.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},selectItem:function(e,t,n,i){i.querySelectorAll(".vd-dropdown-item").forEach(s=>{s.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,i),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"),i=t.querySelector(".vd-dropdown-menu");n&&i&&this.openDropdown(t,n,i)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),i=t.querySelector(".vd-dropdown-menu");n&&i&&this.closeDropdown(t,n,i)}},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",u),window.VanduoDropdown=u})();(function(){"use strict";let u={STORAGE_KEY:"vanduo-font-preference",isInitialized:!1,fonts:{system:{name:"System Default",family:null},inter:{name:"Inter",family:"'Inter', sans-serif"},"source-sans":{name:"Source Sans 3",family:"'Source Sans 3', sans-serif"},"fira-sans":{name:"Fira Sans",family:"'Fira Sans', sans-serif"},"ibm-plex":{name:"IBM Plex Sans",family:"'IBM Plex Sans', sans-serif"},"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"},rubik:{name:"Rubik",family:"'Rubik', sans-serif",category:"sans-serif",description:"Modern, geometric"},"titillium-web":{name:"Titillium Web",family:"'Titillium Web', sans-serif",category:"sans-serif",description:"Technical, elegant"}},init:function(){if(this.state={preference:this.getPreference()},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=i=>{this.setPreference(i.target.value)};t.addEventListener("change",n),t._fontToggleHandler=n}else{let n=()=>{let i=Object.keys(this.fonts),a=(i.indexOf(this.state.preference)+1)%i.length;this.setPreference(i[a])};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",u),window.FontSwitcher=u})();(function(){"use strict";var u=(function(){try{return CSS.supports("selector(:has(*))")}catch{return!1}})(),e={instances:new Map,init:function(){var t=document.querySelectorAll("[data-layout-mode]");t.forEach(function(n){this.instances.has(n)||this.initContainer(n)}.bind(this)),this.initToggleButtons()},initContainer:function(t){var n=t.getAttribute("data-layout-mode")||"standard",i=[];this.applyMode(t,n),t.setAttribute("role","region"),t.setAttribute("aria-label","Grid layout: "+n+" mode"),this.instances.set(t,{cleanup:i,mode:n})},initToggleButtons:function(){var t=document.querySelectorAll("[data-grid-toggle]");t.forEach(function(n){if(n.getAttribute("data-grid-initialized")!=="true"){var i=function(s){s.preventDefault();var a=n.getAttribute("data-grid-toggle"),o;a?o=document.querySelector(a):o=n.closest("[data-layout-mode]"),o&&this.toggle(o)}.bind(this);n.addEventListener("click",i),n.setAttribute("data-grid-initialized","true"),n.setAttribute("aria-pressed","false"),n._gridCleanup=function(){n.removeEventListener("click",i),n.removeAttribute("data-grid-initialized"),n.removeAttribute("aria-pressed")}}}.bind(this))},applyFibFallback:function(t){if(!u){var n=t.querySelectorAll(".vd-row, .row");n.forEach(function(i){var s=i.querySelectorAll(':scope > [class*="vd-col-"], :scope > [class*="col-"]'),a=s.length;a===1?i.style.gridTemplateColumns="1fr":a===2?i.style.gridTemplateColumns="1fr 1.618fr":a===3?i.style.gridTemplateColumns="2fr 3fr 5fr":a===4?i.style.gridTemplateColumns="1fr 2fr 3fr 5fr":i.style.gridTemplateColumns="repeat("+a+", 1fr)"})}},removeFibFallback:function(t){var n=t.querySelectorAll(".vd-row, .row");n.forEach(function(i){i.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");var i=document.querySelectorAll("[data-grid-toggle]");i.forEach(function(o){var r=o.getAttribute("data-grid-toggle");if(r&&t.matches(r)){var c=n==="fibonacci";c?o.classList.add("is-active"):o.classList.remove("is-active"),o.setAttribute("aria-pressed",c?"true":"false")}});var s=this.instances.get(t);s&&(s.mode=n);var a;try{a=new CustomEvent("grid:modechange",{bubbles:!0,detail:{container:t,mode:n}})}catch{a=document.createEvent("CustomEvent"),a.initCustomEvent("grid:modechange",!0,!0,{container:t,mode:n})}t.dispatchEvent(a)},toggle:function(t){if(typeof t=="string"&&(t=document.querySelector(t)),!!t){var n=t.getAttribute("data-layout-mode")||"standard",i=n==="fibonacci"?"standard":"fibonacci";this.applyMode(t,i)}},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){var n=this.instances.get(t);n&&(n.cleanup.forEach(function(i){i()}),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,i){this.destroy(i)}.bind(this));var t=document.querySelectorAll('[data-grid-initialized="true"]');t.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 u={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(o){(o.target===e.backdrop||o.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 i=function(){e.close()};this.closeBtn.addEventListener("click",i),this._cleanupFunctions.push(()=>this.closeBtn.removeEventListener("click",i));let s=function(o){o.key==="Escape"&&e.isOpen&&e.close()};document.addEventListener("keydown",s),this._cleanupFunctions.push(()=>document.removeEventListener("keydown",s));let a=function(){if(!e.isOpen)return;let o=window.scrollY;Math.abs(o-e.initialScrollY)>e.scrollThreshold&&e.close()};window.addEventListener("scroll",a,{passive:!0}),this._cleanupFunctions.push(()=>window.removeEventListener("scroll",a))},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 s=function(){n.classList.add("is-broken")};n.addEventListener("error",s);let a=function(){n.classList.remove("is-broken")};n.addEventListener("load",a)}let i=function(s){s.preventDefault(),e.open(n)};if(n.addEventListener("click",i),n._imageBoxCleanup=()=>n.removeEventListener("click",i),n.tagName!=="BUTTON"&&n.tagName!=="A"){n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label","View enlarged image");let s=function(o){(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),e.open(n))};n.addEventListener("keydown",s);let a=n._imageBoxCleanup;n._imageBoxCleanup=()=>{a(),n.removeEventListener("keydown",s)}}})},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 i=window.innerWidth-document.documentElement.clientWidth;document.body.style.setProperty("--scrollbar-width",`${i}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.img.onload=()=>{this.img.style.opacity=""})},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.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",u),window.VanduoImageBox=u})();(function(){"use strict";let u={modals:new Map,openModals:[],zIndexCounter:1050,_triggerCleanups:[],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 i=s=>{s.preventDefault();let a=n.dataset.modal,o=document.querySelector(a);o&&this.open(o)};n.addEventListener("click",i),this._triggerCleanups.push(()=>n.removeEventListener("click",i))})},initModal:function(e){let t=this.createBackdrop(e),n=e.querySelectorAll('.vd-modal-close, [data-dismiss="modal"]'),i=e.querySelector(".vd-modal-dialog");if(!i)return;let s=[];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 a=e.querySelector(".vd-modal-title");a&&!a.id&&(a.id=e.id+"-title",e.setAttribute("aria-labelledby",a.id)),n.forEach(c=>{let l=()=>{this.close(e)};c.addEventListener("click",l),s.push(()=>c.removeEventListener("click",l))});let o=c=>{c.target===t&&e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",o),s.push(()=>t.removeEventListener("click",o));let r=c=>{if(c.key==="Escape"&&this.openModals.length>0){let l=this.openModals[this.openModals.length-1];l===e&&l.dataset.keyboard!=="false"&&this.close(l)}};document.addEventListener("keydown",r),s.push(()=>document.removeEventListener("keydown",r)),this.modals.set(e,{backdrop:t,dialog:i,trapHandler:null,cleanup:s})},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:i,dialog:s}=n;if(this.zIndexCounter+=10,t.style.zIndex=this.zIndexCounter,i.style.zIndex=this.zIndexCounter-1,this.openModals.push(t),i.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 o=window.innerWidth-document.documentElement.clientWidth;o>0&&(document.body.style.paddingRight=`${o}px`)}let a=this.trapFocus(t);n.trapHandler=a,setTimeout(()=>{let o=this.getFocusableElements(t)[0];o&&o.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:i,trapHandler:s}=n;s&&(t.removeEventListener("keydown",s),n.trapHandler=null);let a=this.openModals.indexOf(t);if(a>-1&&this.openModals.splice(a,1),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),this.openModals.length===0)i.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 o=document.querySelector(`[data-modal="#${t.id}"]`);o&&o.focus(),t.dispatchEvent(new CustomEvent("modal:close",{bubbles:!0}))},trapFocus:function(e){let t=this,n=function(i){if(i.key!=="Tab")return;let s=t.getFocusableElements(e),a=s[0],o=s[s.length-1];i.shiftKey?document.activeElement===a&&(i.preventDefault(),o.focus()):document.activeElement===o&&(i.preventDefault(),a.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);t&&(e.classList.contains("is-open")&&this.close(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=[]}};typeof window.Vanduo<"u"&&window.Vanduo.register("modals",u),window.VanduoModals=u})();(function(){"use strict";let u={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)})},initNavbar:function(e){let t=e.querySelector(".vd-navbar-toggle, .vd-navbar-burger"),n=e.querySelector(".vd-navbar-menu"),i=e.querySelector(".vd-navbar-overlay")||this.createOverlay(e);if(!t||!n)return;let s=[],a=p=>{p.preventDefault(),p.stopPropagation(),this.toggleMenu(e,t,n,i)};if(t.addEventListener("click",a),s.push(()=>t.removeEventListener("click",a)),i){let p=()=>{this.closeMenu(e,t,n,i)};i.addEventListener("click",p),s.push(()=>i.removeEventListener("click",p))}let o=p=>{p.key==="Escape"&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,i)};document.addEventListener("keydown",o),s.push(()=>document.removeEventListener("keydown",o));let r,c=()=>{clearTimeout(r),r=setTimeout(()=>{let p=this.getBreakpoint();window.innerWidth>=p&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,i)},250)};window.addEventListener("resize",c),s.push(()=>{clearTimeout(r),window.removeEventListener("resize",c)});let l=p=>{n.classList.contains("is-open")&&!e.contains(p.target)&&!n.contains(p.target)&&this.closeMenu(e,t,n,i)};document.addEventListener("click",l),s.push(()=>document.removeEventListener("click",l)),n.querySelectorAll(".vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link").forEach(p=>{let E=C=>{let y=this.getBreakpoint();if(window.innerWidth<y){C.preventDefault();let I=p.parentElement.querySelector(".vd-navbar-dropdown-menu");I&&I.classList.toggle("is-open")}};p.addEventListener("click",E),s.push(()=>p.removeEventListener("click",E))}),this.instances.set(e,{toggle:t,menu:n,overlay:i,cleanup:s})},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,i){n.classList.contains("is-open")?this.closeMenu(e,t,n,i):this.openMenu(e,t,n,i)},openMenu:function(e,t,n,i){n.classList.add("is-open"),t.classList.add("is-active"),i&&i.classList.add("is-active"),document.body.style.overflow="hidden",t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false")},closeMenu:function(e,t,n,i){n.classList.remove("is-open"),t.classList.remove("is-active"),i&&i.classList.remove("is-active"),document.body.style.overflow="",n.querySelectorAll(".vd-navbar-dropdown-menu.is-open").forEach(a=>{a.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",u),window.VanduoNavbar=u})();(function(){"use strict";let u={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,i=parseInt(e.dataset.maxVisible)||7;this.render(e,{totalPages:t,currentPage:n,maxVisible:i});let s=a=>{let o=a.target.closest(".vd-pagination-link");if(!o||o.closest(".vd-pagination-item.disabled")||o.closest(".vd-pagination-item.active"))return;a.preventDefault();let r=o.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",s),this.instances.set(e,{cleanup:[()=>e.removeEventListener("click",s)]})},render:function(e,t){let{totalPages:n,currentPage:i,maxVisible:s}=t;if(n<=1){e.innerHTML="";return}let a="";a+=`<li class="vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${i===1?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Previous">Previous</a>',a+="</li>";let o=this.calculatePages(i,n,s),r=0;o.forEach(c=>{if(c==="ellipsis")a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>';else{c!==r+1&&r>0&&(a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>');let l=Number(c);a+=`<li class="vd-pagination-item pagination-item ${l===i?"active":""}" data-page="${l}">`,a+=`<a class="vd-pagination-link pagination-link" href="#" aria-label="Page ${l}">${l}</a>`,a+="</li>",r=c}}),a+=`<li class="vd-pagination-item vd-pagination-next pagination-item pagination-next ${i===n?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Next">Next</a>',a+="</li>",e.innerHTML=a,e.dataset.currentPage=i},calculatePages:function(e,t,n){let i=[],s=Math.floor(n/2);if(t<=n)for(let a=1;a<=t;a++)i.push(a);else{i.push(1);let a=Math.max(2,e-s),o=Math.min(t-1,e+s);e<=s+1&&(o=Math.min(t-1,n-1)),e>=t-s&&(a=Math.max(2,t-n+2)),a>2&&i.push("ellipsis");for(let r=a;r<=o;r++)i.push(r);o<t-1&&i.push("ellipsis"),t>1&&i.push(t)}return i},goToPage:function(e,t){let n=parseInt(e.dataset.totalPages)||1,i=parseInt(e.dataset.maxVisible)||7;t<1||t>n||(this.render(e,{totalPages:n,currentPage:t,maxVisible:i}),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",u),window.VanduoPagination=u})();(function(){"use strict";let u={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"),i=this.getSpeed(e),s=e.classList.contains("parallax-horizontal")?"horizontal":"vertical";this.parallaxElements.set(e,{layers:Array.from(n),speed:i,direction:s,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(),i=window.innerHeight,s=n.top,a=n.height,r=(Math.max(0,Math.min(1,(i-s)/(i+a)))-.5)*t.speed*100;t.layers.forEach((c,l)=>{let m=c.dataset.parallaxSpeed?parseFloat(c.dataset.parallaxSpeed):1,p=r*m;t.direction==="horizontal"?c.style.transform=`translateX(${p}px)`:c.style.transform=`translateY(${p}px)`})},destroy:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.parallaxElements.has(t)&&(this.parallaxElements.get(t).layers.forEach(i=>{i.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",u),window.VanduoParallax=u})();(function(){"use strict";let u={init:function(){document.querySelectorAll(".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 i=typeof e=="string"?document.querySelector(e):e;if(!i)return;t=Math.max(0,Math.min(100,t)),n?i.style.transition="width var(--transition-duration-slow) var(--transition-ease)":(i.style.transition="none",setTimeout(()=>{i.style.transition=""},0)),i.style.width=t+"%",i.setAttribute("aria-valuenow",t),i.setAttribute("aria-valuemin",0),i.setAttribute("aria-valuemax",100);let s=i.querySelector(".progress-text");s&&(s.textContent=t+"%"),i.dispatchEvent(new CustomEvent("progress:update",{bubbles:!0,detail:{value:t,max:100}})),t>=100&&i.dispatchEvent(new CustomEvent("progress:complete",{bubbles:!0,detail:{value:t,max:100}}))},animateProgress:function(e,t,n=1e3){let i=typeof e=="string"?document.querySelector(e):e;if(!i)return;let s=parseInt(i.style.width)||0,a=t-s,o=performance.now(),r=c=>{let l=c-o,m=Math.min(l/n,1),p=1-Math.pow(1-m,3),E=s+a*p;this.setProgress(i,E,!1),m<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('.progress-bar[data-progress-initialized="true"]').forEach(t=>{delete t.dataset.progressInitialized})}};typeof window.Vanduo<"u"&&window.Vanduo.register("preloader",u),window.VanduoPreloader=u})();(function(){"use strict";let u={instances:new Map,_typeaheadBuffer:"",_typeaheadTimer:null,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 i=document.createElement("button");i.type="button",i.className="custom-select-button",i.setAttribute("aria-haspopup","listbox"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-labelledby",e.id||this.generateId(e));let s=document.createElement("div");if(s.className="custom-select-dropdown",s.setAttribute("role","listbox"),e.dataset.searchable==="true"){let l=document.createElement("div");l.className="custom-select-search";let m=document.createElement("input");m.type="text",m.className="input input-sm",m.placeholder="Search...",m.setAttribute("aria-label","Search options"),l.appendChild(m),s.appendChild(l);let p=C=>{this.filterOptions(s,C.target.value)},E=typeof debounce=="function"?debounce(p,150):p;m.addEventListener("input",E),t.push(()=>m.removeEventListener("input",E))}this.buildOptions(e,s,i),n.appendChild(i),n.appendChild(s),this.updateButtonText(e,i);let a=l=>{l.preventDefault(),l.stopPropagation(),this.toggleDropdown(i,s)};i.addEventListener("click",a),t.push(()=>i.removeEventListener("click",a));let o=l=>{!n.contains(l.target)&&s.classList.contains("is-open")&&this.closeDropdown(i,s)};document.addEventListener("click",o),t.push(()=>document.removeEventListener("click",o));let r=l=>{this.handleKeydown(l,e,i,s)};i.addEventListener("keydown",r),t.push(()=>i.removeEventListener("keydown",r));let c=()=>{this.updateButtonText(e,i),this.updateSelectedOptions(e,s)};e.addEventListener("change",c),t.push(()=>e.removeEventListener("change",c)),this.instances.set(e,{wrapper:n,button:i,dropdown:s,cleanup:t})},buildOptions:function(e,t,n){let i=e.querySelectorAll("option"),s=document.createDocumentFragment();i.forEach((a,o)=>{if(a.parentElement.tagName==="OPTGROUP"){let c=a.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,s.appendChild(l)}}if(a.value===""&&!a.textContent.trim())return;let r=document.createElement("div");r.className="custom-select-option",r.textContent=a.textContent,r.setAttribute("role","option"),r.setAttribute("data-value",a.value),r.setAttribute("data-index",o),a.selected&&(r.classList.add("is-selected"),r.setAttribute("aria-selected","true")),a.disabled&&(r.classList.add("is-disabled"),r.setAttribute("aria-disabled","true")),r.addEventListener("click",c=>{a.disabled||this.selectOption(e,a,r,n,t)}),s.appendChild(r)}),t.appendChild(s)},selectOption:function(e,t,n,i,s){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(i,s)),this.updateButtonText(e,i)},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(".vd-custom-select-option"),i=Array.from(e.selectedOptions).map(s=>s.value);n.forEach(s=>{let a=s.dataset.value;i.includes(a)?(s.classList.add("is-selected"),s.setAttribute("aria-selected","true")):(s.classList.remove("is-selected"),s.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(".vd-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,i){let s=i.classList.contains("is-open"),a=Array.from(i.querySelectorAll(".vd-custom-select-option:not(.is-disabled)")),o=a.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":if(e.preventDefault(),s&&o>=0){let r=a[o],c=t.options[parseInt(r.dataset.index)];this.selectOption(t,c,r,n,i)}else this.openDropdown(n,i);break;case"Escape":s&&(e.preventDefault(),this.closeDropdown(n,i),n.focus());break;case"ArrowDown":if(e.preventDefault(),!s)this.openDropdown(n,i);else{let r=o<a.length-1?o+1:0;a[r].focus()}break;case"ArrowUp":if(e.preventDefault(),s){let r=o>0?o-1:a.length-1;a[r].focus()}break;case"Home":s&&(e.preventDefault(),a[0].focus());break;case"End":s&&(e.preventDefault(),a[a.length-1].focus());break;default:if(s&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let r=a.find(c=>c.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));r&&r.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},filterOptions:function(e,t){let n=e.querySelectorAll(".vd-custom-select-option"),i=t.toLowerCase();n.forEach(s=>{s.textContent.toLowerCase().includes(i)?s.style.display="block":s.style.display="none"})},generateId:function(e){return e.id?e.id:"select-"+Math.random().toString(36).substr(2,9)},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",u)})();(function(){"use strict";let u={sidenavs:new Map,breakpoint:992,_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")},init:function(){document.querySelectorAll(".vd-sidenav").forEach(i=>{this.sidenavs.has(i)||this.initSidenav(i)}),document.querySelectorAll("[data-sidenav-toggle]").forEach(i=>{if(i.dataset.sidenavToggleInitialized)return;i.dataset.sidenavToggleInitialized="true";let s=a=>{a.preventDefault();let o=i.dataset.sidenavToggle,r=document.querySelector(o);r&&this.toggle(r)};i.addEventListener("click",s),this._globalCleanups.push(()=>i.removeEventListener("click",s))}),this.handleResize();let n=()=>{this.handleResize()};window.addEventListener("resize",n),this._globalCleanups.push(()=>window.removeEventListener("resize",n))},initSidenav:function(e){let t=this.createOverlay(e),n=e.querySelector(".vd-sidenav-close"),i=[];if(e.setAttribute("role","navigation"),e.setAttribute("aria-hidden","true"),n){let o=()=>{this.close(e)};n.addEventListener("click",o),i.push(()=>n.removeEventListener("click",o))}let s=()=>{e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",s),i.push(()=>t.removeEventListener("click",s));let a=o=>{o.key==="Escape"&&e.classList.contains("is-open")&&e.dataset.keyboard!=="false"&&this.close(e)};document.addEventListener("keydown",a),i.push(()=>document.removeEventListener("keydown",a)),this.sidenavs.set(e,{overlay:t,cleanup:i})},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.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}))},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")&&this.close(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",u),window.VanduoSidenav=u})();(function(){"use strict";let u={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]"),i=e.querySelectorAll(".vd-tab-pane, [data-tab-pane]");if(!t||n.length===0)return;let s=[];t.setAttribute("role","tablist"),n.forEach((o,r)=>{let c=o.dataset.tab||o.getAttribute("href")?.replace("#","")||`tab-${r}`,l=this.findPane(e,c,i);o.setAttribute("role","tab"),o.setAttribute("aria-selected",o.classList.contains("is-active")?"true":"false"),o.setAttribute("tabindex",o.classList.contains("is-active")?"0":"-1"),o.id||(o.id=`tab-btn-${c}`),l&&(l.setAttribute("role","tabpanel"),l.setAttribute("aria-labelledby",o.id),l.id||(l.id=`tab-pane-${c}`),o.setAttribute("aria-controls",l.id));let m=E=>{E.preventDefault(),!o.classList.contains("disabled")&&!o.disabled&&this.activateTab(e,o,n,i)};o.addEventListener("click",m),s.push(()=>o.removeEventListener("click",m));let p=E=>{this.handleKeydown(E,e,o,n,i)};o.addEventListener("keydown",p),s.push(()=>o.removeEventListener("keydown",p))}),!e.querySelector(".vd-tab-link.is-active, [data-tab].is-active")&&n.length>0&&this.activateTab(e,n[0],n,i),this.instances.set(e,{cleanup:s})},findPane:function(e,t,n){let i=e.querySelector(`[data-tab-pane="${t}"]`);return i||(i=e.querySelector(`#${t}`)),i||e.querySelectorAll(".vd-tab-link, [data-tab]").forEach((a,o)=>{(a.dataset.tab||a.getAttribute("href")?.replace("#",""))===t&&n[o]&&(i=n[o])}),i},activateTab:function(e,t,n,i){let s=t.dataset.tab||t.getAttribute("href")?.replace("#","")||t.id;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1"),r.parentElement&&r.parentElement.classList.contains("tab-item")&&r.parentElement.classList.remove("is-active")}),i.forEach(r=>{r.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,s,i);a&&a.classList.add("is-active");let o=new CustomEvent("tab:change",{bubbles:!0,detail:{tab:t,pane:a,tabId:s}});e.dispatchEvent(o)},handleKeydown:function(e,t,n,i,s){let a=t.classList.contains("tabs-vertical"),o=Array.from(i).filter(l=>!l.classList.contains("disabled")&&!l.disabled),r=o.indexOf(n),c=r;switch(e.key){case"ArrowLeft":a||(e.preventDefault(),c=r>0?r-1:o.length-1);break;case"ArrowRight":a||(e.preventDefault(),c=r<o.length-1?r+1:0);break;case"ArrowUp":a&&(e.preventDefault(),c=r>0?r-1:o.length-1);break;case"ArrowDown":a&&(e.preventDefault(),c=r<o.length-1?r+1:0);break;case"Home":e.preventDefault(),c=0;break;case"End":e.preventDefault(),c=o.length-1;break;case"Enter":case" ":e.preventDefault(),this.activateTab(t,n,i,s);return;default:return}c!==r&&(o[c].focus(),this.activateTab(t,o[c],i,s))},show:function(e){let t;if(typeof e=="string"?t=document.querySelector(`[data-tab="${e}"], [href="#${e}"]`):t=e,!t)return;let n=t.closest(".vd-tabs, [data-tabs]");if(!n)return;let i=n.querySelectorAll(".vd-tab-link, [data-tab]"),s=n.querySelectorAll(".vd-tab-pane, [data-tab-pane]");this.activateTab(n,t,i,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("tabs",u)})();(function(){"use strict";let u={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:"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:{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"},inter:{name:"Inter",family:"'Inter', sans-serif"},"source-sans":{name:"Source Sans 3",family:"'Source Sans 3', sans-serif"},"fira-sans":{name:"Fira Sans",family:"'Fira Sans', sans-serif"},"ibm-plex":{name:"IBM Plex Sans",family:"'IBM Plex Sans', sans-serif"},system:{name:"System Default",family:null},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif"},rubik:{name:"Rubik",family:"'Rubik', sans-serif"},"titillium-web":{name:"Titillium Web",family:"'Titillium Web', 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,panel:null,overlay:null},init:function(){if(this.isInitialized){this.bindExistingElements(),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,i){e&&(e.addEventListener(t,n,i),this._cleanup.push(()=>e.removeEventListener(t,n,i)))},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.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){this.THEME_MODES.includes(e)||(e=this.DEFAULTS.THEME);let t=this.getDefaultPrimary(this.state.theme);if(this.state.primary===t){let n=this.getDefaultPrimary(e);n!==this.state.primary&&this.applyPrimary(n)}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 n=window.Vanduo.components.themeSwitcher;n.state&&(n.state.preference=e)}this.dispatchEvent("mode-change",{mode:e})},dispatchEvent:function(e,t){let n=new CustomEvent("theme:"+e,{bubbles:!0,detail:t});document.dispatchEvent(n);let i=new CustomEvent("theme:change",{bubbles:!0,detail:{type:e,value:t[Object.keys(t)[0]],state:{...this.state}}});document.dispatchEvent(i)},bindExistingElements:function(){if(this.elements.customizer=document.querySelector(".vd-theme-customizer"),this.elements.customizer)this.elements.trigger=this.elements.customizer.querySelector(".vd-theme-customizer-trigger"),this.elements.panel=this.elements.customizer.querySelector(".vd-theme-customizer-panel"),this.elements.overlay=this.elements.customizer.querySelector(".vd-theme-customizer-overlay");else{let e=document.querySelector("[data-theme-customizer-trigger]");e&&this.createDynamicPanel(e)}this.updateUI()},createDynamicPanel:function(e){let t=document.createElement("div");t.className="vd-theme-customizer",this.elements.trigger=e;let n=document.createElement("div");n.className="vd-theme-customizer-overlay";let i=document.createElement("div");i.className="vd-theme-customizer-panel",i.innerHTML=this.getPanelHTML(),document.body.appendChild(n),document.body.appendChild(i),this.elements.panel=i,this.elements.overlay=n,this.elements.customizer={contains:s=>i.contains(s)||e.contains(s)},this.positionPanel(),this.bindPanelEvents(),this.addListener(window,"resize",()=>this.positionPanel())},positionPanel:function(){if(!this.elements.panel||!this.elements.trigger)return;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 t=this.elements.trigger.getBoundingClientRect(),n=320,i=t.bottom+8,s=window.innerWidth,a=s-t.right;s-a-n<8&&(a=s-n-8),this.elements.panel.style.top=i+"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 - "+i+"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(i=>{this.addListener(i,"click",()=>{this.applyPrimary(i.dataset.color),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(i=>{this.addListener(i,"click",()=>{this.applyNeutral(i.dataset.neutral),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-radius]").forEach(i=>{this.addListener(i,"click",()=>{this.applyRadius(i.dataset.radius),this.updateUI()})});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&this.addListener(e,"change",i=>{this.applyFont(i.target.value),this.updateUI()}),this.elements.panel.querySelectorAll("[data-mode]").forEach(i=>{this.addListener(i,"click",()=>{this.applyTheme(i.dataset.mode),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="";for(let[o,r]of Object.entries(this.PRIMARY_COLORS))e+=`<button class="tc-color-swatch${o===this.state.primary?" is-active":""}" data-color="${o}" style="--swatch-color: ${r.color}" title="${r.name}"></button>`;let t="";for(let[o,r]of Object.entries(this.NEUTRAL_COLORS))t+=`<button class="tc-neutral-swatch${o===this.state.neutral?" is-active":""}" data-neutral="${o}" style="--swatch-color: ${r.color}" title="${r.name}"><span>${r.name}</span></button>`;let n="";this.RADIUS_OPTIONS.forEach(o=>{n+=`<button class="tc-radius-btn${o===this.state.radius?" is-active":""}" data-radius="${o}">${o}</button>`});let i="";for(let[o,r]of Object.entries(this.FONT_OPTIONS))i+=`<option value="${o}"${o===this.state.font?" selected":""}>${r.name}</option>`;let s={system:"ph-desktop",dark:"ph-moon",light:"ph-sun"},a="";return this.THEME_MODES.forEach(o=>{a+=`<button class="tc-mode-btn${o===this.state.theme?" is-active":""}" data-mode="${o}"><i class="ph ${s[o]}"></i><span>${o.charAt(0).toUpperCase()+o.slice(1)}</span></button>`}),`
|
|
6
|
+
<div class="tc-header">
|
|
7
|
+
<h3 class="tc-title">Customize Theme</h3>
|
|
8
|
+
<button class="customizer-mobile-close" aria-label="Close">
|
|
9
|
+
<i class="ph ph-x"></i>
|
|
10
|
+
</button>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="tc-body">
|
|
13
|
+
<div class="tc-section">
|
|
14
|
+
<label class="tc-label">Color Mode</label>
|
|
15
|
+
<div class="tc-mode-group">
|
|
16
|
+
${a}
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="tc-section">
|
|
20
|
+
<label class="tc-label">Primary Color</label>
|
|
21
|
+
<div class="tc-color-grid">
|
|
22
|
+
${e}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="tc-section">
|
|
26
|
+
<label class="tc-label">Neutral Color</label>
|
|
27
|
+
<div class="tc-neutral-grid">
|
|
28
|
+
${t}
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="tc-section">
|
|
32
|
+
<label class="tc-label">Border Radius</label>
|
|
33
|
+
<div class="tc-radius-group">
|
|
34
|
+
${n}
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="tc-section">
|
|
38
|
+
<label class="tc-label">Font Family</label>
|
|
39
|
+
<select class="tc-font-select" data-customizer-font>
|
|
40
|
+
${i}
|
|
41
|
+
</select>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="tc-footer">
|
|
45
|
+
<button class="customizer-reset btn btn-sm btn-outline">Reset to Defaults</button>
|
|
46
|
+
</div>
|
|
47
|
+
`},isUsingDefaultPrimary:function(){return this.state.primary===this.DEFAULTS.PRIMARY_LIGHT||this.state.primary===this.DEFAULTS.PRIMARY_DARK},bindEvents:function(){if(this.elements.trigger&&this.addListener(this.elements.trigger,"click",e=>{e.preventDefault(),e.stopPropagation(),this.toggle()}),this.bindPanelEvents(),window.matchMedia){let e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{if(this.state.theme==="system"&&this.isUsingDefaultPrimary()){let n=this.getDefaultPrimary("system");n!==this.state.primary&&(this.applyPrimary(n),this.updateUI())}};e.addEventListener("change",t),this._cleanup.push(()=>e.removeEventListener("change",t))}this.addListener(document,"click",e=>{this.state.isOpen&&this.elements.customizer&&!this.elements.customizer.contains(e.target)&&this.close()}),this.addListener(document,"keydown",e=>{e.key==="Escape"&&this.state.isOpen&&this.close()})},toggle:function(){this.state.isOpen?this.close():this.open()},open:function(){this.state.isOpen=!0,this.positionPanel(),this.elements.panel&&this.elements.panel.classList.add("is-open"),this.elements.trigger&&this.elements.trigger.setAttribute("aria-expanded","true"),this.elements.overlay&&this.elements.overlay.classList.add("is-active"),this.dispatchEvent("panel-open",{isOpen:!0})},close:function(){this.state.isOpen=!1,this.elements.panel&&this.elements.panel.classList.remove("is-open"),this.elements.trigger&&this.elements.trigger.setAttribute("aria-expanded","false"),this.elements.overlay&&this.elements.overlay.classList.remove("is-active"),this.dispatchEvent("panel-close",{isOpen:!1})},updateUI:function(){if(!this.elements.panel)return;this.elements.panel.querySelectorAll("[data-color]").forEach(t=>{t.classList.toggle("is-active",t.dataset.color===this.state.primary)}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(t=>{t.classList.toggle("is-active",t.dataset.neutral===this.state.neutral)}),this.elements.panel.querySelectorAll("[data-radius]").forEach(t=>{t.classList.toggle("is-active",t.dataset.radius===this.state.radius)});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&(e.value=this.state.font),this.elements.panel.querySelectorAll("[data-mode]").forEach(t=>{t.classList.toggle("is-active",t.dataset.mode===this.state.theme)})},reset:function(){this.applyTheme(this.DEFAULTS.THEME),this.applyPrimary(this.getDefaultPrimary(this.DEFAULTS.THEME)),this.applyNeutral(this.DEFAULTS.NEUTRAL),this.applyRadius(this.DEFAULTS.RADIUS),this.applyFont(this.DEFAULTS.FONT),this.applyTheme(this.DEFAULTS.THEME),this.updateUI(),this.dispatchEvent("reset",{state:{...this.state}})},getState:function(){return{...this.state}},setPreferences:function(e){e.primary&&this.applyPrimary(e.primary),e.neutral&&this.applyNeutral(e.neutral),e.radius&&this.applyRadius(e.radius),e.font&&this.applyFont(e.font),e.theme&&this.applyTheme(e.theme),this.updateUI()},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}},destroyAll:function(){this._cleanup.forEach(e=>e()),this._cleanup=[],this.elements.panel&&this.elements.panel.removeAttribute("data-customizer-initialized"),this.close(),this.isInitialized=!1}};window.Vanduo&&window.Vanduo.register("themeCustomizer",u),window.ThemeCustomizer=u})();(function(){"use strict";let u={isInitialized:!1,_mediaQuery:null,_onMediaChange:null,init:function(){if(this.STORAGE_KEY="vanduo-theme-preference",this.state={preference:this.getPreference()},this.isInitialized){this.applyTheme(),this.renderUI(),this.updateUI();return}this.isInitialized=!0,this.applyTheme(),this.listenForSystemChanges(),this.renderUI(),console.log("Vanduo Theme Switcher initialized")},getPreference:function(){return this.getStorageValue(this.STORAGE_KEY,"system")},setPreference:function(e){this.state.preference=e,this.setStorageValue(this.STORAGE_KEY,e),this.applyTheme(),this.updateUI()},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}},applyTheme:function(){let e=this.state.preference;e==="system"?document.documentElement.removeAttribute("data-theme"):document.documentElement.setAttribute("data-theme",e)},listenForSystemChanges:function(){this._mediaQuery&&this._onMediaChange||(this._mediaQuery=window.matchMedia("(prefers-color-scheme: dark)"),this._onMediaChange=e=>{this.state.preference==="system"&&this.applyTheme()},this._mediaQuery.addEventListener("change",this._onMediaChange))},renderUI:function(){document.querySelectorAll('[data-toggle="theme"]').forEach(t=>{if(t.getAttribute("data-theme-initialized")==="true"){t.tagName==="SELECT"&&(t.value=this.state.preference);return}if(t.tagName==="SELECT"){t.value=this.state.preference;let n=i=>{this.setPreference(i.target.value)};t.addEventListener("change",n),t._themeToggleHandler=n}else{let n=()=>{let i=["system","light","dark"],s=(i.indexOf(this.state.preference)+1)%i.length;this.setPreference(i[s])};t.addEventListener("click",n),t._themeToggleHandler=n}t.setAttribute("data-theme-initialized","true")})},updateUI:function(){document.querySelectorAll('[data-toggle="theme"]').forEach(t=>{if(t.tagName==="SELECT")t.value=this.state.preference;else{let n=t.querySelector(".theme-current-label");n&&(n.textContent=this.state.preference.charAt(0).toUpperCase()+this.state.preference.slice(1))}})},destroyAll:function(){document.querySelectorAll('[data-toggle="theme"][data-theme-initialized="true"]').forEach(t=>{if(t._themeToggleHandler){let n=t.tagName==="SELECT"?"change":"click";t.removeEventListener(n,t._themeToggleHandler),delete t._themeToggleHandler}t.removeAttribute("data-theme-initialized")}),this._mediaQuery&&this._onMediaChange&&this._mediaQuery.removeEventListener("change",this._onMediaChange),this._mediaQuery=null,this._onMediaChange=null,this.isInitialized=!1}};window.Vanduo&&window.Vanduo.register("themeSwitcher",u)})();(function(){"use strict";let u={defaults:{position:"top-right",duration:5e3,dismissible:!0,showProgress:!0,pauseOnHover:!0},containers:{},getContainer:function(e){if(this.containers[e])return this.containers[e];let t=document.createElement("div");return t.className=`vd-toast-container vd-toast-container-${e}`,t.setAttribute("role","status"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","false"),document.body.appendChild(t),this.containers[e]=t,t},show:function(e,t,n){typeof e=="string"&&(e={message:e,type:t,duration:n});let i=Object.assign({},this.defaults,e),s=this.getContainer(i.position),a=document.createElement("div");a.className="vd-toast",i.type&&a.classList.add(`vd-toast-${i.type}`),i.solid&&a.classList.add("vd-toast-solid"),i.showProgress&&i.duration>0&&a.classList.add("vd-toast-with-progress");let o="";if(i.icon){let y=typeof sanitizeHtml=="function"?sanitizeHtml(i.icon):escapeHtml(i.icon);o+=`<span class="vd-toast-icon">${y}</span>`}else i.type&&(o+=`<span class="vd-toast-icon">${this.getDefaultIcon(i.type)}</span>`);let r=typeof escapeHtml=="function"?escapeHtml:function(y){let k=document.createElement("div");return k.appendChild(document.createTextNode(y)),k.innerHTML};if(o+='<div class="vd-toast-content">',i.title&&(o+=`<div class="vd-toast-title">${r(String(i.title))}</div>`),i.message&&(o+=`<div class="vd-toast-message">${r(String(i.message))}</div>`),o+="</div>",i.dismissible&&(o+='<button type="button" class="vd-toast-close" aria-label="Close"></button>'),i.showProgress&&i.duration>0){let y=parseInt(i.duration,10)||0;o+=`<div class="vd-toast-progress" style="animation-duration: ${y}ms"></div>`}if(a.innerHTML=o,s.appendChild(a),a._toastCleanup=[],i.dismissible){let y=a.querySelector(".vd-toast-close"),k=()=>{this.dismiss(a)};y.addEventListener("click",k),a._toastCleanup.push(()=>y.removeEventListener("click",k))}let c=null,l=i.duration,m=null,p=()=>{if(i.duration>0){m=Date.now(),c=setTimeout(()=>{this.dismiss(a)},l),a._toastTimeoutId=c;let y=a.querySelector(".vd-toast-progress");y&&(y.style.animationPlayState="running")}},E=()=>{if(c){clearTimeout(c),c=null,a._toastTimeoutId=null,l-=Date.now()-m;let y=a.querySelector(".vd-toast-progress");y&&(y.style.animationPlayState="paused")}};i.pauseOnHover&&(a.addEventListener("mouseenter",E),a.addEventListener("mouseleave",p),a._toastCleanup.push(()=>a.removeEventListener("mouseenter",E),()=>a.removeEventListener("mouseleave",p))),requestAnimationFrame(()=>{a.classList.add("is-visible"),p()}),a._toastConfig=i;let C=new CustomEvent("toast:show",{bubbles:!0,detail:{toast:a,config:i}});return a.dispatchEvent(C),a},dismiss:function(e){if(!e||e.classList.contains("is-exiting"))return;e._toastTimeoutId&&(clearTimeout(e._toastTimeoutId),e._toastTimeoutId=null),e.classList.remove("is-visible"),e.classList.add("is-exiting");let t=new CustomEvent("toast:dismiss",{bubbles:!0,detail:{toast:e}});e.dispatchEvent(t);let n=()=>{e.removeEventListener("transitionend",n),e._toastCleanup&&(e._toastCleanup.forEach(i=>i()),delete e._toastCleanup),e.parentElement&&e.parentElement.removeChild(e)};e.addEventListener("transitionend",n),setTimeout(()=>{e._toastCleanup&&(e._toastCleanup.forEach(i=>i()),delete e._toastCleanup),e.parentElement&&e.parentElement.removeChild(e)},400)},destroyAll:function(){Object.keys(this.containers).forEach(e=>{let t=this.containers[e];if(!t)return;t.querySelectorAll(".vd-toast").forEach(i=>{i._toastTimeoutId&&clearTimeout(i._toastTimeoutId),i._toastCleanup&&(i._toastCleanup.forEach(s=>s()),delete i._toastCleanup),i.parentElement&&i.parentElement.removeChild(i)}),t.parentElement&&t.parentElement.removeChild(t)}),this.containers={}},dismissAll:function(e){e&&this.containers[e]?this.containers[e].querySelectorAll(".vd-toast").forEach(n=>this.dismiss(n)):Object.values(this.containers).forEach(t=>{t.querySelectorAll(".vd-toast").forEach(i=>this.dismiss(i))})},getDefaultIcon:function(e){return{success:'<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg>',error:'<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="15" y1="9" x2="9" y2="15"></line><line x1="9" y1="9" x2="15" y2="15"></line></svg>',warning:'<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>',info:'<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>'}[e]||""},success:function(e,t){return this.show(Object.assign({message:e,type:"success"},t))},error:function(e,t){return this.show(Object.assign({message:e,type:"error"},t))},warning:function(e,t){return this.show(Object.assign({message:e,type:"warning"},t))},info:function(e,t){return this.show(Object.assign({message:e,type:"info"},t))}};typeof window.Vanduo<"u"&&window.Vanduo.register("toast",u),window.Toast=u})();(function(){"use strict";let u={tooltips:new Map,delayTimers:new Map,sanitizeHtml:function(e){if(typeof sanitizeHtml=="function")return sanitizeHtml(e);var t=document.createElement("div");return t.textContent=e||"",t.innerHTML},init:function(){document.querySelectorAll("[data-tooltip], [data-tooltip-html]").forEach(t=>{this.tooltips.has(t)||this.initTooltip(t)})},initTooltip:function(e){let t=this.createTooltip(e),n=[],i=()=>{this.showTooltip(e,t)},s=()=>{this.hideTooltip(e,t)},a=()=>{this.showTooltip(e,t)},o=()=>{this.hideTooltip(e,t)};e.addEventListener("mouseenter",i),e.addEventListener("mouseleave",s),e.addEventListener("focus",a),e.addEventListener("blur",o),n.push(()=>e.removeEventListener("mouseenter",i),()=>e.removeEventListener("mouseleave",s),()=>e.removeEventListener("focus",a),()=>e.removeEventListener("blur",o)),this.tooltips.set(e,{tooltip:t,cleanup:n})},createTooltip:function(e){let t=document.createElement("div");t.className="vd-tooltip",t.setAttribute("role","tooltip"),t.setAttribute("aria-hidden","true");let n="tooltip-"+Math.random().toString(36).substr(2,9);t.id=n,e.setAttribute("aria-describedby",n);let i=e.dataset.tooltipHtml,s=e.dataset.tooltip;i?(t.innerHTML=this.sanitizeHtml(i),t.classList.add("vd-tooltip-html")):s&&(t.textContent=s);let a=e.dataset.tooltipPlacement||e.dataset.placement||"top";t.setAttribute("data-placement",a),t.classList.add(`vd-tooltip-${a}`),e.dataset.tooltipVariant&&t.classList.add(`vd-tooltip-${e.dataset.tooltipVariant}`),e.dataset.tooltipSize&&t.classList.add(`vd-tooltip-${e.dataset.tooltipSize}`);let o=parseInt(e.dataset.tooltipDelay)||0;return t.dataset.delay=o,document.body.appendChild(t),t},showTooltip:function(e,t){let n=parseInt(t.dataset.delay)||0;if(n>0){let i=setTimeout(()=>{this.positionTooltip(e,t),t.classList.add("is-visible"),t.setAttribute("aria-hidden","false")},n);this.delayTimers.set(e,i)}else this.positionTooltip(e,t),t.classList.add("is-visible"),t.setAttribute("aria-hidden","false")},hideTooltip:function(e,t){let n=this.delayTimers.get(e);n&&(clearTimeout(n),this.delayTimers.delete(e)),t.classList.remove("is-visible"),t.setAttribute("aria-hidden","true")},positionTooltip:function(e,t){let n=t.dataset.placement||"top",i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),a=window.pageYOffset||document.documentElement.scrollTop,o=window.pageXOffset||document.documentElement.scrollLeft,r=0,c=0;switch(n){case"top":r=i.top+a-s.height-8,c=i.left+o+i.width/2-s.width/2;break;case"bottom":r=i.bottom+a+8,c=i.left+o+i.width/2-s.width/2;break;case"left":r=i.top+a+i.height/2-s.height/2,c=i.left+o-s.width-8;break;case"right":r=i.top+a+i.height/2-s.height/2,c=i.right+o+8;break}let l=window.innerWidth,m=window.innerHeight,p=8;c<p?c=p:c+s.width>l-p&&(c=l-s.width-p),r<a+p?r=a+p:r+s.height>a+m-p&&(r=a+m-s.height-p),t.style.cssText=`position: absolute; top: 0; left: 0; transform: translate(${c}px, ${r}px);`},show:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t&&this.tooltips.has(t)){let{tooltip:n}=this.tooltips.get(t);this.showTooltip(t,n)}},hide:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t&&this.tooltips.has(t)){let{tooltip:n}=this.tooltips.get(t);this.hideTooltip(t,n)}},update:function(e,t,n=!1){let i=typeof e=="string"?document.querySelector(e):e;if(i&&this.tooltips.has(i)){let{tooltip:s}=this.tooltips.get(i);n?(s.innerHTML=this.sanitizeHtml(t),s.classList.add("vd-tooltip-html")):(s.textContent=t,s.classList.remove("vd-tooltip-html"))}},destroy:function(e){let t=this.tooltips.get(e);if(!t)return;let n=this.delayTimers.get(e);n&&(clearTimeout(n),this.delayTimers.delete(e)),t.cleanup.forEach(i=>i()),t.tooltip&&t.tooltip.parentNode&&t.tooltip.parentNode.removeChild(t.tooltip),this.tooltips.delete(e)},destroyAll:function(){this.tooltips.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("tooltips",u),window.VanduoTooltips=u})();(function(){"use strict";var u={minQueryLength:2,maxResults:10,debounceMs:150,highlightTag:"mark",keyboardShortcut:!0,containerSelector:".vd-doc-search",inputSelector:".vd-doc-search-input",resultsSelector:".vd-doc-search-results",contentSelector:".doc-content section[id]",titleSelector:".demo-title, h2, h3",navSelector:".doc-nav-link",sectionSelector:".doc-nav-section",excludeFromContent:"pre, code, script, style",maxContentLength:500,data:null,categoryIcons:{"getting-started":"ph-rocket-launch",core:"ph-cube",components:"ph-puzzle-piece",interactive:"ph-cursor-click","data-display":"ph-table",feedback:"ph-bell",meta:"ph-info",default:"ph-file-text"},onSelect:null,onSearch:null,onOpen:null,onClose:null,emptyTitle:"No results found",emptyText:"Try different keywords or check spelling",placeholder:"Search..."};function e(n){var i=Object.assign({},u,n||{}),s={initialized:!1,index:[],results:[],activeIndex:-1,isOpen:!1,query:"",container:null,input:null,resultsContainer:null,debounceTimer:null,boundHandlers:{}};function a(){return s.initialized?P:(s.container=document.querySelector(i.containerSelector),!s.container||(s.input=s.container.querySelector(i.inputSelector),s.resultsContainer=s.container.querySelector(i.resultsSelector),!s.input||!s.resultsContainer)?(s.initialized=!1,null):(i.placeholder&&s.input.setAttribute("placeholder",i.placeholder),o(),E(),y(),s.initialized=!0,P))}function o(){if(s.index=[],i.data&&Array.isArray(i.data)){i.data.forEach(function(h){s.index.push({id:h.id||p(h.title),title:h.title||"",category:h.category||"",categorySlug:p(h.category||""),content:h.content||"",keywords:h.keywords||m(h.title+" "+h.content),url:h.url||"#"+(h.id||p(h.title)),icon:h.icon||""})});return}var d=document.querySelectorAll(i.contentSelector),f=r();d.forEach(function(h){var v=h.id;if(v){var g=h.querySelector(i.titleSelector),b=g?g.textContent.replace(/v[\d.]+/g,"").trim():v,L=f[v]||"Documentation",w=c(h),S=l(h,b),A=g?g.querySelector("i.ph"):null,x="";if(A&&A.classList){for(var _=0;_<A.classList.length;_++)if(A.classList[_].indexOf("ph-")===0){x=A.classList[_];break}}s.index.push({id:v,title:b,category:L,categorySlug:p(L),content:w,keywords:S,url:"#"+v,icon:x})}})}function r(){var d={},f="Documentation",h=document.querySelectorAll(i.navSelector+", "+i.sectionSelector);return h.forEach(function(v){if(v.classList.contains("doc-nav-section"))f=v.textContent.trim();else{var g=v.getAttribute("href");if(g&&g.startsWith("#")){var b=g.substring(1);d[b]=f}}}),d}function c(d){var f=d.cloneNode(!0),h=f.querySelectorAll(i.excludeFromContent);h.forEach(function(g){g.remove()});var v=f.textContent||"";return v=v.replace(/\s+/g," ").trim(),v.substring(0,i.maxContentLength)}function l(d,f){var h=[];f.toLowerCase().split(/\s+/).forEach(function(b){b.length>2&&h.push(b)});var v=d.querySelectorAll("code");v.forEach(function(b){var L=b.textContent||"",w=L.match(/\.([\w-]+)/g);w&&w.forEach(function(S){h.push(S.substring(1).toLowerCase())})});var g=d.querySelectorAll("[data-tooltip], [data-modal]");return g.forEach(function(b){var L=b.getAttributeNames().filter(function(w){return w.startsWith("data-")});L.forEach(function(w){h.push(w.replace("data-",""))})}),Array.from(new Set(h))}function m(d){var f=d.toLowerCase().split(/\s+/);return f.filter(function(h){return h.length>2})}function p(d){return d.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")}function E(){s.boundHandlers.handleInput=function(d){k(d)},s.boundHandlers.handleFocus=function(){s.query.length>=i.minQueryLength&&q()},s.boundHandlers.handleKeydown=function(d){I(d)},s.boundHandlers.handleOutsideClick=function(d){s.container.contains(d.target)||D()},s.boundHandlers.handleGlobalKeydown=function(d){i.keyboardShortcut&&(d.metaKey||d.ctrlKey)&&d.key==="k"&&(d.preventDefault(),s.input.focus(),s.input.select())},s.boundHandlers.handleResultClick=function(d){var f=d.target.closest(".vd-doc-search-result");if(f){var h=parseInt(f.dataset.index,10);H(h)}},s.input.addEventListener("input",s.boundHandlers.handleInput),s.input.addEventListener("focus",s.boundHandlers.handleFocus),s.input.addEventListener("keydown",s.boundHandlers.handleKeydown),document.addEventListener("click",s.boundHandlers.handleOutsideClick),document.addEventListener("keydown",s.boundHandlers.handleGlobalKeydown),s.resultsContainer.addEventListener("click",s.boundHandlers.handleResultClick)}function C(){s.input&&(s.input.removeEventListener("input",s.boundHandlers.handleInput),s.input.removeEventListener("focus",s.boundHandlers.handleFocus),s.input.removeEventListener("keydown",s.boundHandlers.handleKeydown)),document.removeEventListener("click",s.boundHandlers.handleOutsideClick),document.removeEventListener("keydown",s.boundHandlers.handleGlobalKeydown),s.resultsContainer&&s.resultsContainer.removeEventListener("click",s.boundHandlers.handleResultClick)}function y(){var d=s.resultsContainer.id||"search-results-"+Math.random().toString(36).substr(2,9);s.resultsContainer.id=d,s.input.setAttribute("role","combobox"),s.input.setAttribute("aria-autocomplete","list"),s.input.setAttribute("aria-controls",d),s.input.setAttribute("aria-expanded","false"),s.resultsContainer.setAttribute("role","listbox"),s.resultsContainer.setAttribute("aria-label","Search results")}function k(d){var f=d.target.value.trim();s.debounceTimer&&clearTimeout(s.debounceTimer),s.debounceTimer=setTimeout(function(){if(s.query=f,f.length<i.minQueryLength){D();return}s.results=M(f),s.activeIndex=-1,O(),q(),typeof i.onSearch=="function"&&i.onSearch(f,s.results)},i.debounceMs)}function I(d){if(!s.isOpen){d.key==="ArrowDown"&&s.query.length>=i.minQueryLength&&(d.preventDefault(),s.results=M(s.query),O(),q());return}switch(d.key){case"ArrowDown":d.preventDefault(),V(1);break;case"ArrowUp":d.preventDefault(),V(-1);break;case"Enter":d.preventDefault(),s.activeIndex>=0?H(s.activeIndex):s.results.length>0&&H(0);break;case"Escape":d.preventDefault(),D();break;case"Tab":D();break}}function M(d){var f=d.toLowerCase().split(/\s+/).filter(function(v){return v.length>0}),h=[];return s.index.forEach(function(v){var g=0,b=v.title.toLowerCase(),L=v.category.toLowerCase(),w=v.content.toLowerCase();f.forEach(function(S){b.includes(S)&&(g+=100,b===S?g+=50:b.startsWith(S)&&(g+=25)),L.includes(S)&&(g+=50);var A=v.keywords.some(function(x){return x.includes(S)});A&&(g+=30),w.includes(S)&&(g+=10)}),g>0&&h.push({id:v.id,title:v.title,category:v.category,categorySlug:v.categorySlug,content:v.content,url:v.url,icon:v.icon,score:g})}),h.sort(function(v,g){return g.score-v.score}),h.slice(0,i.maxResults)}function O(){if(s.results.length===0){s.resultsContainer.innerHTML=N();return}var d='<ul class="vd-doc-search-results-list" role="listbox">';s.results.forEach(function(f,h){var v=h===s.activeIndex,g=f.icon||F(f.categorySlug),b=B(f.content,s.query);d+='<li class="vd-doc-search-result'+(v?" is-active":"")+'" role="option" id="vd-doc-search-result-'+h+'" data-index="'+h+'" data-category="'+T(f.categorySlug)+'" aria-selected="'+v+'"><div class="vd-doc-search-result-icon"><i class="ph '+T(g)+'"></i></div><div class="vd-doc-search-result-content"><div class="vd-doc-search-result-title">'+R(f.title,s.query)+'</div><div class="vd-doc-search-result-category">'+T(f.category)+'</div><div class="vd-doc-search-result-excerpt">'+R(b,s.query)+"</div></div></li>"}),d+="</ul>",d+=z(),s.resultsContainer.innerHTML=d}function N(){return'<div class="vd-doc-search-empty"><div class="vd-doc-search-empty-icon"><i class="ph ph-magnifying-glass"></i></div><div class="vd-doc-search-empty-title">'+T(i.emptyTitle)+'</div><div class="vd-doc-search-empty-text">'+T(i.emptyText)+"</div></div>"}function z(){return'<div class="vd-doc-search-footer"><span class="vd-doc-search-footer-item"><kbd>\u2191</kbd><kbd>\u2193</kbd> to navigate</span><span class="vd-doc-search-footer-item"><kbd>\u21B5</kbd> to select</span><span class="vd-doc-search-footer-item"><kbd>esc</kbd> to close</span></div>'}function F(d){return i.categoryIcons[d]||i.categoryIcons.default||"ph-file-text"}function B(d,f){for(var h=f.toLowerCase().split(/\s+/),v=d.toLowerCase(),g=100,b=-1,L=0;L<h.length;L++){var w=v.indexOf(h[L]);w!==-1&&(b===-1||w<b)&&(b=w)}if(b===-1)return d.substring(0,g)+"...";var S=Math.max(0,b-30),A=Math.min(d.length,b+g),x=d.substring(S,A);return S>0&&(x="..."+x),A<d.length&&(x=x+"..."),x}function R(d,f){if(!f)return T(d);var h=f.toLowerCase().split(/\s+/).filter(function(g){return g.length>0}),v=T(d);return h.forEach(function(g){if(!(g.length>50)){var b=new RegExp("("+g.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+")","gi");v=v.replace(b,"<"+i.highlightTag+">$1</"+i.highlightTag+">")}}),v}function T(d){var f=document.createElement("div");return f.textContent=d,f.innerHTML}function V(d){var f=s.activeIndex+d;f<0?f=s.results.length-1:f>=s.results.length&&(f=0),$(f)}function $(d){var f=s.resultsContainer.querySelector(".vd-doc-search-result.is-active");f&&(f.classList.remove("is-active"),f.setAttribute("aria-selected","false")),s.activeIndex=d;var h=s.resultsContainer.querySelector('[data-index="'+d+'"]');h&&(h.classList.add("is-active"),h.setAttribute("aria-selected","true"),s.input.setAttribute("aria-activedescendant","vd-doc-search-result-"+d),h.scrollIntoView({block:"nearest"}))}function H(d){var f=s.results[d];if(f){if(D(),s.input.value="",s.query="",typeof i.onSelect=="function"){i.onSelect(f);return}var h=document.querySelector(f.url);h&&(h.scrollIntoView({behavior:"smooth",block:"start"}),window.history.pushState(null,"",f.url),U(f.id))}}function U(d){var f=document.querySelectorAll(i.navSelector);f.forEach(function(h){h.classList.remove("active"),h.getAttribute("href")==="#"+d&&h.classList.add("active")})}function q(){s.isOpen||(s.isOpen=!0,s.resultsContainer.classList.add("is-open"),s.input.setAttribute("aria-expanded","true"),typeof i.onOpen=="function"&&i.onOpen())}function D(){s.isOpen&&(s.isOpen=!1,s.activeIndex=-1,s.resultsContainer.classList.remove("is-open"),s.input.setAttribute("aria-expanded","false"),s.input.removeAttribute("aria-activedescendant"),typeof i.onClose=="function"&&i.onClose())}function Y(){C(),s.initialized=!1,s.index=[],s.results=[],s.isOpen=!1,s.query="",s.debounceTimer&&clearTimeout(s.debounceTimer),s.resultsContainer&&(s.resultsContainer.innerHTML="")}function G(){o()}function W(d){Object.assign(i,d)}function K(){return Object.assign({},i)}function X(){return s.index.slice()}var P={init:a,destroy:Y,rebuild:G,search:M,open:q,close:D,setConfig:W,getConfig:K,getIndex:X};return P}var t={create:function(n){var i=e(n);return i&&i.init(),i||null},_instance:null,config:Object.assign({},u),init:function(n){return this._instance&&this._instance.destroy(),n&&Object.assign(this.config,n),this._instance=e(this.config),this._instance?this._instance.init():null},destroy:function(){this._instance&&(this._instance.destroy(),this._instance=null)},destroyAll:function(){this.destroy()},rebuild:function(){this._instance&&this._instance.rebuild()},search:function(n){return this._instance?this._instance.search(n):[]},open:function(){this._instance&&this._instance.open()},close:function(){this._instance&&this._instance.close()}};typeof window.Vanduo<"u"&&window.Vanduo.register("docSearch",t),window.Search=t,window.DocSearch=t,window.VanduoDocSearch=t})();(function(){"use strict";let u={instances:new Map,currentDrag:null,touchState:null,feedbackElement:null,init:function(){document.querySelectorAll(".vd-draggable, [data-draggable]").forEach(i=>{this.instances.has(i)||this.initDraggable(i)}),document.querySelectorAll(".vd-draggable-container, .vd-draggable-container-vertical").forEach(i=>{this.instances.has(i)||this.initContainer(i)}),document.querySelectorAll(".vd-drop-zone").forEach(i=>{this.instances.has(i)||this.initDropZone(i)}),this.createFeedbackElement()},initDraggable:function(e){let t=[];e.hasAttribute("draggable")||e.setAttribute("draggable","true"),e.hasAttribute("tabindex")||e.setAttribute("tabindex","0"),e.setAttribute("role","option"),e.setAttribute("aria-roledescription","draggable item"),e.setAttribute("aria-grabbed","false");let n=m=>{this.handleDragStart(m,e)};e.addEventListener("dragstart",n),t.push(()=>e.removeEventListener("dragstart",n));let i=m=>{this.handleDrag(m,e)};e.addEventListener("drag",i),t.push(()=>e.removeEventListener("drag",i));let s=m=>{this.handleDragEnd(m,e)};e.addEventListener("dragend",s),t.push(()=>e.removeEventListener("dragend",s));let a=m=>{this.handleTouchStart(m,e)};e.addEventListener("touchstart",a),t.push(()=>e.removeEventListener("touchstart",a));let o=m=>{this.handleTouchMove(m,e)};e.addEventListener("touchmove",o),t.push(()=>e.removeEventListener("touchmove",o));let r=m=>{this.handleTouchEnd(m,e)};e.addEventListener("touchend",r),t.push(()=>e.removeEventListener("touchend",r));let c=m=>{this.handleTouchEnd(m,e)};e.addEventListener("touchcancel",c),t.push(()=>e.removeEventListener("touchcancel",c));let l=m=>{this.handleKeydown(m,e)};e.addEventListener("keydown",l),t.push(()=>e.removeEventListener("keydown",l)),this.instances.set(e,{cleanup:t})},initContainer:function(e){e.setAttribute("role","listbox"),e.setAttribute("aria-label",e.getAttribute("aria-label")||"Draggable items"),e.querySelectorAll(".vd-draggable-item").forEach(o=>{this.instances.has(o)||this.initDraggable(o)});let n=[],i=o=>{o.preventDefault(),o.dataTransfer.dropEffect="move"},s=o=>{if(o.preventDefault(),o.dataTransfer.dropEffect="move",!this.currentDrag)return;let r=this.currentDrag.element;e.contains(r)&&(o.clientX===0&&o.clientY===0||this.handleReorder(e,r,o.clientX,o.clientY))},a=o=>{o.preventDefault()};e.addEventListener("dragenter",i),e.addEventListener("dragover",s),e.addEventListener("drop",a),n.push(()=>{e.removeEventListener("dragenter",i),e.removeEventListener("dragover",s),e.removeEventListener("drop",a)}),this.instances.set(e,{cleanup:n})},initDropZone:function(e){let t=[];e.setAttribute("role","region"),e.setAttribute("aria-dropeffect","move"),e.hasAttribute("aria-label")||e.setAttribute("aria-label","Drop zone");let n=o=>{o.preventDefault(),this.handleDragOver(o,e)};e.addEventListener("dragover",n),t.push(()=>e.removeEventListener("dragover",n));let i=o=>{o.preventDefault(),this.handleDragEnter(o,e)};e.addEventListener("dragenter",i),t.push(()=>e.removeEventListener("dragenter",i));let s=o=>{this.handleDragLeave(o,e)};e.addEventListener("dragleave",s),t.push(()=>e.removeEventListener("dragleave",s));let a=o=>{o.preventDefault(),this.handleDrop(o,e)};e.addEventListener("drop",a),t.push(()=>e.removeEventListener("drop",a)),this.instances.set(e,{cleanup:t})},createFeedbackElement:function(){if(!this.feedbackElement){let e=document.querySelector(".vd-drag-feedback");if(e){this.feedbackElement=e;return}this.feedbackElement=document.createElement("div"),this.feedbackElement.className="vd-drag-feedback hidden",this.feedbackElement.setAttribute("role","presentation"),document.body.appendChild(this.feedbackElement)}},handleDragStart:function(e,t){t.classList.add("is-dragging"),t.setAttribute("aria-grabbed","true"),this.currentDrag={element:t,initialPosition:{x:e.clientX,y:e.clientY},initialBounds:t.getBoundingClientRect(),data:this.getData(t)},e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",this.currentDrag.data),t.dispatchEvent(new CustomEvent("draggable:start",{bubbles:!0,detail:{element:t,data:this.currentDrag.data,position:{x:e.clientX,y:e.clientY}}}))},handleDrag:function(e,t){this.currentDrag&&t.dispatchEvent(new CustomEvent("draggable:drag",{bubbles:!0,detail:{element:t,data:this.currentDrag.data,position:{x:e.clientX,y:e.clientY},delta:{x:e.clientX-this.currentDrag.initialPosition.x,y:e.clientY-this.currentDrag.initialPosition.y}}}))},handleDragEnd:function(e,t){t.classList.remove("is-dragging"),t.classList.add("is-dropped"),setTimeout(()=>t.classList.remove("is-dropped"),300),t.setAttribute("aria-grabbed","false"),this.feedbackElement&&this.feedbackElement.classList.add("hidden");let n=this.currentDrag?.data||this.getData(t),i=this.currentDrag?.initialPosition||{x:0,y:0};t.dispatchEvent(new CustomEvent("draggable:end",{bubbles:!0,detail:{element:t,data:n,position:{x:e.clientX,y:e.clientY},delta:{x:e.clientX-i.x,y:e.clientY-i.y}}})),this.currentDrag=null},handleTouchStart:function(e,t){let n=e.touches[0];this.touchState={element:t,startX:n.clientX,startY:n.clientY,startTime:Date.now(),isDragging:!1}},handleTouchMove:function(e,t){if(!this.touchState)return;let n=e.touches[0],i=n.clientX-this.touchState.startX,s=n.clientY-this.touchState.startY;if((Math.abs(i)>10||Math.abs(s)>10)&&(e.preventDefault(),this.touchState.isDragging||(this.touchState.isDragging=!0,t.classList.add("is-dragging"),t.setAttribute("aria-grabbed","true"),this.currentDrag={element:t,initialPosition:{x:this.touchState.startX,y:this.touchState.startY},initialBounds:t.getBoundingClientRect(),data:this.getData(t)},t.dispatchEvent(new CustomEvent("draggable:start",{bubbles:!0,detail:{element:t,data:this.currentDrag.data,position:{x:n.clientX,y:n.clientY}}}))),this.updateFeedback(n.clientX,n.clientY),this.currentDrag)){t.dispatchEvent(new CustomEvent("draggable:drag",{bubbles:!0,detail:{element:t,data:this.currentDrag.data,position:{x:n.clientX,y:n.clientY},delta:{x:i,y:s}}}));let a=t.closest(".vd-draggable-container");a&&a.contains(t)&&this.handleReorder(a,t,n.clientX,n.clientY)}},handleTouchEnd:function(e,t){if(this.touchState&&this.touchState.isDragging){e.preventDefault(),t.classList.remove("is-dragging"),t.classList.add("is-dropped"),t.setAttribute("aria-grabbed","false"),setTimeout(()=>t.classList.remove("is-dropped"),300),this.feedbackElement&&this.feedbackElement.classList.add("hidden");let n=e.changedTouches[0],i=this.currentDrag?.data||this.getData(t),s=this.touchState?.startX||0,a=this.touchState?.startY||0;t.dispatchEvent(new CustomEvent("draggable:end",{bubbles:!0,detail:{element:t,data:i,position:{x:n.clientX,y:n.clientY},delta:{x:n.clientX-s,y:n.clientY-a}}}))}this.touchState=null,this.currentDrag=null},handleDragOver:function(e,t){e.preventDefault(),e.dataTransfer.dropEffect="move"},handleDragEnter:function(e,t){e.preventDefault(),t.classList.add("is-drag-over")},handleDragLeave:function(e,t){t.classList.remove("is-drag-over")},handleDrop:function(e,t){e.preventDefault(),t.classList.remove("is-drag-over"),t.dispatchEvent(new CustomEvent("draggable:drop",{bubbles:!0,detail:{zone:t,element:this.currentDrag?.element,data:this.currentDrag?.data,position:{x:e.clientX,y:e.clientY}}}))},handleReorder:function(e,t,n,i){let s=e.classList.contains("vd-draggable-container-vertical"),o=[...e.querySelectorAll(".vd-draggable-item:not(.is-dragging), .vd-draggable:not(.is-dragging)")].reduce((r,c)=>{let l=c.getBoundingClientRect(),m=s?i-l.top-l.height/2:n-l.left-l.width/2;return m<0&&m>r.offset?{offset:m,element:c}:r},{offset:Number.NEGATIVE_INFINITY}).element;o==null?e.appendChild(t):e.insertBefore(t,o)},handleKeydown:function(e,t){switch(e.key){case"Enter":case" ":e.preventDefault(),t.click();break;case"Escape":t.classList.contains("is-dragging")&&(t.classList.remove("is-dragging"),t.setAttribute("aria-grabbed","false"),this.feedbackElement&&this.feedbackElement.classList.add("hidden"),this.currentDrag=null);break;case"ArrowUp":case"ArrowLeft":{e.preventDefault();let n=t.previousElementSibling;n&&(n.classList.contains("vd-draggable")||n.classList.contains("vd-draggable-item"))&&(t.parentNode.insertBefore(t,n),t.focus(),t.dispatchEvent(new CustomEvent("draggable:reorder",{bubbles:!0,detail:{element:t,direction:"up"}})));break}case"ArrowDown":case"ArrowRight":{e.preventDefault();let n=t.nextElementSibling;n&&(n.classList.contains("vd-draggable")||n.classList.contains("vd-draggable-item"))&&(t.parentNode.insertBefore(n,t),t.focus(),t.dispatchEvent(new CustomEvent("draggable:reorder",{bubbles:!0,detail:{element:t,direction:"down"}})));break}}},getData:function(e){return e.dataset.draggable||e.textContent.trim()},updateFeedback:function(e,t){if(!this.currentDrag)return;this.feedbackElement.classList.remove("hidden");let n=this.currentDrag.initialBounds;this.feedbackElement.innerHTML="";let i=this.currentDrag.element.cloneNode(!0);this.feedbackElement.appendChild(i),Object.assign(this.feedbackElement.style,{left:e-20+"px",top:t-20+"px",width:n.width+"px",height:n.height+"px"})},makeDraggable:function(e,t={}){let n=typeof e=="string"?document.querySelector(e):e;n&&!this.instances.has(n)&&(n.classList.add("vd-draggable"),n.setAttribute("draggable","true"),t.data&&(n.dataset.draggable=t.data),this.initDraggable(n))},removeDraggable:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.instances.has(t)&&(this.instances.get(t).cleanup.forEach(i=>i()),this.instances.delete(t),t.classList.remove("vd-draggable"),t.removeAttribute("draggable"),t.removeAttribute("data-draggable"))},destroy:function(e){this.removeDraggable(e)},destroyAll:function(){Array.from(this.instances.keys()).forEach(t=>this.destroy(t))}};typeof window.Vanduo<"u"&&window.Vanduo.register("draggable",u),window.VanduoDraggable=u})();var j=window.Vanduo;var Ee=j;export{j as Vanduo,Ee as default};
|
|
48
|
+
//# sourceMappingURL=vanduo.esm.min.js.map
|