@vanduo-oss/framework 1.2.9 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -9
- package/css/components/doc-tabs.css +2 -2
- package/css/core/helpers.css +2 -0
- package/css/core/typography.css +4 -0
- package/dist/build-info.json +3 -3
- package/dist/vanduo.cjs.js +2 -2
- package/dist/vanduo.cjs.min.js +2 -2
- package/dist/vanduo.css +15 -3
- package/dist/vanduo.css.map +1 -1
- package/dist/vanduo.esm.js +2 -2
- package/dist/vanduo.esm.min.js +2 -2
- package/dist/vanduo.js +2 -2
- package/dist/vanduo.min.css +2 -2
- package/dist/vanduo.min.css.map +1 -1
- package/dist/vanduo.min.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Vanduo Framework v1.
|
|
1
|
+
# Vanduo Framework v1.3.0
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<img src="vanduo-banner.svg" alt="Vanduo Framework Banner" width="100%">
|
|
@@ -38,13 +38,14 @@ A lightweight, pure HTML/CSS/JS framework with **45+ components** for designing
|
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
41
|
-
## What's New in v1.
|
|
41
|
+
## What's New in v1.3.0
|
|
42
42
|
|
|
43
|
-
v1.
|
|
43
|
+
v1.3.0 is a maintenance release focused on documentation improvements and framework consistency:
|
|
44
44
|
|
|
45
|
-
- **
|
|
46
|
-
- **
|
|
47
|
-
- **
|
|
45
|
+
- **Added missing spacing utilities and text-italic class.** The framework now includes `.vd-mt-6` and `.vd-mt-8` spacing utilities, plus `.vd-text-italic` for text styling.
|
|
46
|
+
- **Fixed phantom class references in documentation.** Updated docs to use correct class names that match the actual framework implementation.
|
|
47
|
+
- **Improved documentation structure.** Added inline sidebar filter for Components & Guides pages, unified component documentation structure, and refreshed visual styling.
|
|
48
|
+
- **Release artifacts and docs are aligned for v1.3.0.** Package metadata, generated bundles, `llms.txt`, and release-facing README examples now point at the current version.
|
|
48
49
|
|
|
49
50
|
The framework still ships **45+ components**, including the v1.2.7 additions below.
|
|
50
51
|
|
|
@@ -87,8 +88,8 @@ The quickest way to get started — no install, no build step. Add two lines to
|
|
|
87
88
|
|
|
88
89
|
**Pin to a specific version** for production:
|
|
89
90
|
```html
|
|
90
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.
|
|
91
|
-
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.
|
|
91
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.0/dist/vanduo.min.css">
|
|
92
|
+
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.0/dist/vanduo.min.js"></script>
|
|
92
93
|
<script>Vanduo.init();</script>
|
|
93
94
|
```
|
|
94
95
|
|
|
@@ -151,7 +152,7 @@ This project includes an [`llms.txt`](llms.txt) file — a structured markdown s
|
|
|
151
152
|
Use the hardened upload script to attach only approved bundle artifacts from `dist/`:
|
|
152
153
|
|
|
153
154
|
```bash
|
|
154
|
-
pnpm run release:assets -- v1.
|
|
155
|
+
pnpm run release:assets -- v1.3.0
|
|
155
156
|
```
|
|
156
157
|
|
|
157
158
|
Notes:
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
.doc-tab.active {
|
|
34
34
|
border-color: var(--color-primary);
|
|
35
|
-
color: var(--
|
|
36
|
-
background: var(--color-primary
|
|
35
|
+
color: var(--text-on-primary);
|
|
36
|
+
background: var(--color-primary);
|
|
37
37
|
box-shadow: 0 0 0 1px var(--color-primary-alpha-20);
|
|
38
38
|
}
|
package/css/core/helpers.css
CHANGED
|
@@ -1498,6 +1498,8 @@
|
|
|
1498
1498
|
.vd-mt-3 { margin-top: var(--spacing-3); }
|
|
1499
1499
|
.vd-mt-4 { margin-top: var(--spacing-4); }
|
|
1500
1500
|
.vd-mt-5 { margin-top: var(--spacing-5); }
|
|
1501
|
+
.vd-mt-6 { margin-top: var(--spacing-6); }
|
|
1502
|
+
.vd-mt-8 { margin-top: var(--spacing-8); }
|
|
1501
1503
|
.vd-mb-0 { margin-bottom: var(--spacing-0); }
|
|
1502
1504
|
.vd-mb-2 { margin-bottom: var(--spacing-2); }
|
|
1503
1505
|
.vd-mb-3 { margin-bottom: var(--spacing-3); }
|
package/css/core/typography.css
CHANGED
package/dist/build-info.json
CHANGED
package/dist/vanduo.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Vanduo v1.
|
|
1
|
+
/*! Vanduo v1.3.0 | Built: 2026-03-17T16:46:03.216Z | git:ea44b23 | development */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -132,7 +132,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
132
132
|
// js/vanduo.js
|
|
133
133
|
(function() {
|
|
134
134
|
"use strict";
|
|
135
|
-
const VANDUO_VERSION = true ? "1.
|
|
135
|
+
const VANDUO_VERSION = true ? "1.3.0" : "0.0.0-dev";
|
|
136
136
|
const Vanduo2 = {
|
|
137
137
|
version: VANDUO_VERSION,
|
|
138
138
|
components: {},
|
package/dist/vanduo.cjs.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! Vanduo v1.
|
|
2
|
-
var Q=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var se=(h,e)=>{for(var t in e)Q(h,t,{get:e[t],enumerable:!0})},ie=(h,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of te(e))!ne.call(h,s)&&s!==t&&Q(h,s,{get:()=>e[s],enumerable:!(n=ee(e,s))||n.enumerable});return h};var ae=h=>ie(Q({},"__esModule",{value:!0}),h);var re={};se(re,{Vanduo:()=>Z,default:()=>oe});module.exports=ae(re);(function(){"use strict";let h={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){h.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){h.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(){h.destroyAll()}),window.VanduoLifecycle=h,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",h)})();(function(){"use strict";let e={version:"1.
|
|
1
|
+
/*! Vanduo v1.3.0 | Built: 2026-03-17T16:46:03.216Z | git:ea44b23 | production */
|
|
2
|
+
var Q=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var se=(h,e)=>{for(var t in e)Q(h,t,{get:e[t],enumerable:!0})},ie=(h,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of te(e))!ne.call(h,s)&&s!==t&&Q(h,s,{get:()=>e[s],enumerable:!(n=ee(e,s))||n.enumerable});return h};var ae=h=>ie(Q({},"__esModule",{value:!0}),h);var re={};se(re,{Vanduo:()=>Z,default:()=>oe});module.exports=ae(re);(function(){"use strict";let h={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){h.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){h.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(){h.destroyAll()}),window.VanduoLifecycle=h,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",h)})();(function(){"use strict";let e={version:"1.3.0",components:{},init:function(){typeof ready<"u"?ready(()=>{this.initComponents()}):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{this.initComponents()}):this.initComponents()},initComponents:function(){Object.keys(this.components).forEach(t=>{let n=this.components[t];if(n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to initialize component "'+t+'":',s)}}),console.log("Vanduo Framework v"+this.version+" initialized")},register:function(t,n){this.components[t]=n},reinit:function(t){let n=this.components[t];if(n&&n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to reinitialize component "'+t+'":',s)}},destroyAll:function(){let t=Object.keys(this.components);for(let n=0;n<t.length;n++){let s=this.components[t[n]];if(s&&s.destroyAll&&typeof s.destroyAll=="function")try{s.destroyAll()}catch(i){console.warn('[Vanduo] Failed to destroy component "'+t[n]+'":',i)}}typeof window.VanduoLifecycle<"u"&&window.VanduoLifecycle.destroyAll()},getComponent:function(t){return this.components[t]||null}};window.Vanduo=e})();(function(){"use strict";let h={_snippetIdCounter:0,getSnippetInstanceId:function(e){if(e.dataset.codeSnippetId)return e.dataset.codeSnippetId;let t=(e.id||"").trim();return t?(e.dataset.codeSnippetId=`snippet-${t}`,e.dataset.codeSnippetId):(this._snippetIdCounter+=1,e.dataset.codeSnippetId=`snippet-auto-${this._snippetIdCounter}`,e.dataset.codeSnippetId)},addListener:function(e,t,n,s){t&&(t.addEventListener(n,s),e._codeSnippetCleanup||(e._codeSnippetCleanup=[]),e._codeSnippetCleanup.push(()=>t.removeEventListener(n,s)))},init:function(){document.querySelectorAll(".vd-code-snippet").forEach(t=>{t.dataset.initialized||this.initSnippet(t)})},initSnippet:function(e){e.dataset.initialized="true",e._codeSnippetCleanup=[];let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&n&&this.initCollapsible(e,t,n);let s=e.querySelectorAll(".vd-code-snippet-tab"),i=e.querySelectorAll(".vd-code-snippet-pane");s.length>0&&this.initTabs(e,s,i);let a=e.querySelector(".vd-code-snippet-copy");a&&this.initCopyButton(e,a),e.querySelectorAll("[data-extract]").forEach(l=>{this.extractHtml(l)}),e.querySelectorAll(".has-line-numbers").forEach(l=>{this.addLineNumbers(l)})},initCollapsible:function(e,t,n){let s=e.dataset.expanded==="true";t.setAttribute("aria-expanded",s),n.dataset.visible=s,this.addListener(e,t,"click",()=>{let i=e.dataset.expanded==="true";e.dataset.expanded=!i,t.setAttribute("aria-expanded",!i),n.dataset.visible=!i,i||n.querySelectorAll("[data-extract]:not([data-extracted])").forEach(o=>{this.extractHtml(o)});let a=new CustomEvent("codesnippet:toggle",{bubbles:!0,detail:{snippet:e,expanded:!i}});e.dispatchEvent(a)})},initTabs:function(e,t,n){let s=this.getSnippetInstanceId(e),i=e.querySelector(".vd-code-snippet-tabs");i&&i.setAttribute("role","tablist"),t.forEach((a,r)=>{let o=a.dataset.lang,l=a.classList.contains("is-active");a.setAttribute("role","tab"),a.setAttribute("aria-selected",l),a.setAttribute("tabindex",l?"0":"-1"),a.id=a.id||`code-tab-${s}-${o||"tab"}-${r}`;let c=e.querySelector(`.vd-code-snippet-pane[data-lang="${o}"]`);c&&(c.id=c.id||`code-pane-${s}-${o||"pane"}-${r}`,c.setAttribute("role","tabpanel"),a.setAttribute("aria-controls",c.id),c.setAttribute("aria-labelledby",a.id)),this.addListener(e,a,"click",()=>{this.switchTab(e,a,t,n)}),this.addListener(e,a,"keydown",d=>{this.handleTabKeydown(d,e,t,n)})})},switchTab:function(e,t,n,s){let i=t.dataset.lang;n.forEach(o=>{o.classList.remove("is-active"),o.setAttribute("aria-selected","false"),o.setAttribute("tabindex","-1")}),s.forEach(o=>{o.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="${i}"]`);a&&a.classList.add("is-active");let r=new CustomEvent("codesnippet:tabchange",{bubbles:!0,detail:{snippet:e,tab:t,lang:i}});e.dispatchEvent(r)},handleTabKeydown:function(e,t,n,s){let i=Array.from(n),a=i.indexOf(e.target),r;switch(e.key){case"ArrowLeft":e.preventDefault(),r=a>0?a-1:i.length-1;break;case"ArrowRight":e.preventDefault(),r=a<i.length-1?a+1:0;break;case"Home":e.preventDefault(),r=0;break;case"End":e.preventDefault(),r=i.length-1;break;default:return}r!==a&&(i[r].focus(),this.switchTab(t,i[r],n,s))},initCopyButton:function(e,t){this.addListener(e,t,"click",async()=>{await this.copyCode(e,t)})},copyCode:async function(e,t){let n=e.querySelector(".vd-code-snippet-pane.is-active")||e.querySelector(".vd-code-snippet-pane");if(!n){console.warn("CodeSnippet: No code pane found");return}let i=(n.querySelector("code")||n).textContent;try{await navigator.clipboard.writeText(i),this.showCopyFeedback(t,!0)}catch{let o=this.fallbackCopy(i);this.showCopyFeedback(t,o)}let a=new CustomEvent("codesnippet:copy",{bubbles:!0,detail:{snippet:e,code:i,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(s){console.warn("CodeSnippet: Fallback copy failed",s)}return document.body.removeChild(t),n},showCopyFeedback:function(e,t){if(t){e.classList.add("is-copied");let n=document.createElement("span");n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.className="sr-only",n.textContent="Code copied to clipboard",e.appendChild(n),setTimeout(()=>{e.classList.remove("is-copied"),n.parentNode&&n.parentNode.removeChild(n)},2e3)}},extractHtml:function(e){let t=e.dataset.extract;if(!t)return;let n=document.querySelector(t);if(!n){console.warn(`CodeSnippet: Source element not found: ${t}`);return}let s=n.innerHTML;s=this.formatHtml(s),s=this.escapeHtml(s),s=this.highlightHtml(s);let i=document.createElement("code");i.innerHTML=s,e.replaceChildren(i),e.dataset.extracted="true"},formatHtml:function(e){e=e.trim();let t=e.split(`
|
|
3
3
|
`),n=0,s=2,i=[];return t.forEach(a=>{if(a=a.trim(),!a)return;a.match(/^<\/\w/)&&(n=Math.max(0,n-s)),i.push(" ".repeat(n)+a);let r=/<[a-zA-Z]/.test(a),o=a.includes("/>");r&&!o&&(a.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)||a.match(/<\/\w+>$/)||(n+=s))}),i.join(`
|
|
4
4
|
`)},escapeHtml:function(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML},highlightHtml:function(e){return e=e.replace(/(<\/?)([\w-]+)/g,'$1<span class="code-tag">$2</span>'),e=e.replace(/([\w-]+)(=)("|')/g,'<span class="code-attr">$1</span>$2$3'),e=e.replace(/("|')([^&]*)("|')/g,'$1<span class="code-string">$2</span>$3'),e=e.replace(/(<!--)(.*?)(-->)/g,'<span class="code-comment">$1$2$3</span>'),e},highlightCss:function(e){return e=e.replace(/([.#]?[a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*\{)/g,'<span class="code-selector">$1</span>$2'),e=e.replace(/([a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*:)/g,'<span class="code-property">$1</span>$2'),e=e.replace(/:\s*([^;{}]+)(;)/g,': <span class="code-value">$1</span>$2'),e=e.replace(/(\d+)(px|rem|em|%|vh|vw|deg|s|ms)/g,'<span class="code-number">$1</span><span class="code-unit">$2</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},highlightJs:function(e){return["const","let","var","function","return","if","else","for","while","switch","case","break","continue","new","this","class","extends","import","export","default","async","await","try","catch","throw","typeof","instanceof"].forEach(n=>{let s=new RegExp(`\\b(${n})\\b`,"g");e=e.replace(s,'<span class="code-keyword">$1</span>')}),e=e.replace(/('(?:[^'\\]|\\.){0,10000}'|"(?:[^"\\]|\\.){0,10000}"|`(?:[^`\\]|\\.){0,10000}`)/g,'<span class="code-string">$1</span>'),e=e.replace(/\b(\d+\.?\d*)\b/g,'<span class="code-number">$1</span>'),e=e.replace(/\b([\w]+)(\s*\()/g,'<span class="code-function">$1</span>$2'),e=e.replace(/(\/\/.*$)/gm,'<span class="code-comment">$1</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},addLineNumbers:function(e){let t=e.querySelector("code");if(!t)return;let s=t.innerHTML.split(`
|
|
5
5
|
`).length,i=document.createElement("div");i.className="vd-code-snippet-line-numbers",i.setAttribute("aria-hidden","true");for(let r=1;r<=s;r++){let o=document.createElement("span");o.textContent=r,i.appendChild(o)}let a=document.createElement("div");a.className="vd-code-snippet-code",a.appendChild(t.cloneNode(!0)),t.parentNode.removeChild(t),e.appendChild(i),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}"]`),s=e.querySelectorAll(".vd-code-snippet-tab"),i=e.querySelectorAll(".vd-code-snippet-pane");n&&this.switchTab(e,n,s,i)},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",h),window.CodeSnippet=h})();(function(){"use strict";let h={instances:new Map,init:function(){document.querySelectorAll(".vd-collapsible, .accordion").forEach(t=>{this.instances.has(t)||this.initCollapsible(t)})},initCollapsible:function(e){let t=e.classList.contains("accordion"),n=e.querySelectorAll(".vd-collapsible-item, .accordion-item"),s=[];n.forEach(i=>{let a=i.querySelector(".vd-collapsible-header, .accordion-header"),r=i.querySelector(".vd-collapsible-body, .accordion-body"),o=i.querySelector(".vd-collapsible-trigger, .accordion-trigger")||a;if(!a||!r)return;i.classList.contains("is-open")?this.openItem(i,r,!1):this.closeItem(i,r,!1);let l=c=>{c.preventDefault(),this.toggleItem(i,r,e,t)};o.addEventListener("click",l),s.push(()=>o.removeEventListener("click",l))}),this.instances.set(e,{cleanup:s})},toggleItem:function(e,t,n,s){e.classList.contains("is-open")?this.closeItem(e,t):(s&&n.querySelectorAll(".vd-collapsible-item.is-open, .accordion-item.is-open").forEach(r=>{if(r!==e){let o=r.querySelector(".vd-collapsible-body, .accordion-body");this.closeItem(r,o)}}),this.openItem(e,t))},openItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.add("is-open"),e.setAttribute("aria-expanded","true");let s=t.scrollHeight;t.style.maxHeight=`${s}px`,n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:open",{bubbles:!0}))},closeItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),t.style.maxHeight="0",n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:close",{bubbles:!0}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.openItem(t,n)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.closeItem(t,n)}},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body"),s=t.closest(".vd-collapsible, .accordion"),i=s&&s.classList.contains("accordion");n&&this.toggleItem(t,n,s,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("collapsible",h),window.VanduoCollapsible=h})();(function(){"use strict";let h={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 s=[];t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),n.setAttribute("role","menu"),n.setAttribute("aria-hidden","true");let i=l=>{l.preventDefault(),l.stopPropagation(),this.toggleDropdown(e,t,n)};t.addEventListener("click",i),s.push(()=>t.removeEventListener("click",i));let a=l=>{!e.contains(l.target)&&n.classList.contains("is-open")&&this.closeDropdown(e,t,n)};document.addEventListener("click",a),s.push(()=>document.removeEventListener("click",a));let r=l=>{this.handleKeydown(l,e,t,n)};t.addEventListener("keydown",r),s.push(()=>t.removeEventListener("keydown",r)),n.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)").forEach(l=>{let c=u=>{u.preventDefault(),this.selectItem(l,e,t,n)};l.addEventListener("click",c),s.push(()=>l.removeEventListener("click",c));let d=u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),this.selectItem(l,e,t,n))};l.addEventListener("keydown",d),s.push(()=>l.removeEventListener("keydown",d))}),this.instances.set(e,{toggle:t,menu:n,cleanup:s})},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 r=a.closest(".vd-dropdown"),o=r.querySelector(".vd-dropdown-toggle");this.closeDropdown(r,o,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 i=n.querySelector(".vd-dropdown-item:not(.disabled):not(.is-disabled)");i&&setTimeout(()=>i.focus(),0)},closeDropdown:function(e,t,n){e.classList.remove("is-open"),n.classList.remove("is-open"),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true"),t.focus()},positionMenu:function(e,t){let n=e.getBoundingClientRect(),s=t.getBoundingClientRect(),i=window.innerWidth,a=window.innerHeight,r=8;n.left+s.width>i-r&&(t.classList.add("vd-dropdown-menu-end"),t.classList.remove("vd-dropdown-menu-start")),t.classList.contains("dropdown-menu-top")?n.top-s.height<r&&t.classList.remove("vd-dropdown-menu-top"):n.bottom+s.height>a-r&&t.classList.add("vd-dropdown-menu-top")},handleKeydown:function(e,t,n,s){let i=s.classList.contains("is-open"),a=Array.from(s.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)")),r=a.findIndex(o=>o===document.activeElement);switch(e.key){case"Enter":case" ":case"ArrowDown":if(e.preventDefault(),!i)this.openDropdown(t,n,s);else if(e.key==="ArrowDown"){let o=r<a.length-1?r+1:0;a[o].focus()}break;case"ArrowUp":if(i){e.preventDefault();let o=r>0?r-1:a.length-1;a[o].focus()}break;case"Escape":i&&(e.preventDefault(),this.closeDropdown(t,n,s));break;case"Home":i&&(e.preventDefault(),a[0].focus());break;case"End":i&&(e.preventDefault(),a[a.length-1].focus());break;default:if(i&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let o=a.find(l=>l.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));o&&o.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},selectItem:function(e,t,n,s){s.querySelectorAll(".vd-dropdown-item").forEach(i=>{i.classList.remove("active","is-active")}),e.classList.add("active","is-active"),(n.tagName==="BUTTON"||n.classList.contains("btn"))&&(n.textContent=e.textContent.trim()),this.closeDropdown(t,n,s),e.dispatchEvent(new CustomEvent("dropdown:select",{bubbles:!0,detail:{item:e,value:e.dataset.value||e.textContent}}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.openDropdown(t,n,s)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.closeDropdown(t,n,s)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("dropdown",h),window.VanduoDropdown=h})();(function(){"use strict";let h={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=s=>{this.setPreference(s.target.value)};t.addEventListener("change",n),t._fontToggleHandler=n}else{let n=()=>{let s=Object.keys(this.fonts),a=(s.indexOf(this.state.preference)+1)%s.length;this.setPreference(s[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",h),window.FontSwitcher=h})();(function(){"use strict";let h=(function(){try{return CSS.supports("selector(:has(*))")}catch{return!1}})(),e={instances:new Map,init:function(){document.querySelectorAll("[data-layout-mode]").forEach(function(n){this.instances.has(n)||this.initContainer(n)}.bind(this)),this.initToggleButtons()},initContainer:function(t){let n=t.getAttribute("data-layout-mode")||"standard",s=[];this.applyMode(t,n),t.setAttribute("role","region"),t.setAttribute("aria-label","Grid layout: "+n+" mode"),this.instances.set(t,{cleanup:s,mode:n})},initToggleButtons:function(){document.querySelectorAll("[data-grid-toggle]").forEach(function(n){if(n.getAttribute("data-grid-initialized")==="true")return;let s=function(i){i.preventDefault();let a=n.getAttribute("data-grid-toggle"),r;a?r=document.querySelector(a):r=n.closest("[data-layout-mode]"),r&&this.toggle(r)}.bind(this);n.addEventListener("click",s),n.setAttribute("data-grid-initialized","true"),n.setAttribute("aria-pressed","false"),n._gridCleanup=function(){n.removeEventListener("click",s),n.removeAttribute("data-grid-initialized"),n.removeAttribute("aria-pressed")}}.bind(this))},applyFibFallback:function(t){if(h)return;t.querySelectorAll(".vd-row, .row").forEach(function(s){let a=s.querySelectorAll(':scope > [class*="vd-col-"], :scope > [class*="col-"]').length;a===1?s.style.gridTemplateColumns="1fr":a===2?s.style.gridTemplateColumns="1fr 1.618fr":a===3?s.style.gridTemplateColumns="2fr 3fr 5fr":a===4?s.style.gridTemplateColumns="1fr 2fr 3fr 5fr":s.style.gridTemplateColumns="repeat("+a+", 1fr)"})},removeFibFallback:function(t){t.querySelectorAll(".vd-row, .row").forEach(function(s){s.style.gridTemplateColumns=""})},applyMode:function(t,n){t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),n==="fibonacci"?(t.classList.add("vd-grid-fibonacci"),this.applyFibFallback(t)):(t.classList.add("vd-grid-standard"),this.removeFibFallback(t)),t.setAttribute("data-layout-mode",n),t.setAttribute("aria-label","Grid layout: "+n+" mode"),document.querySelectorAll("[data-grid-toggle]").forEach(function(r){let o=r.getAttribute("data-grid-toggle");if(o&&t.matches(o)){let l=n==="fibonacci";l?r.classList.add("is-active"):r.classList.remove("is-active"),r.setAttribute("aria-pressed",l?"true":"false")}});let i=this.instances.get(t);i&&(i.mode=n);let 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)return;let s=(t.getAttribute("data-layout-mode")||"standard")==="fibonacci"?"standard":"fibonacci";this.applyMode(t,s)},setMode:function(t,n){typeof t=="string"&&(t=document.querySelector(t)),t&&(n!=="fibonacci"&&n!=="standard"||this.applyMode(t,n))},getMode:function(t){return typeof t=="string"&&(t=document.querySelector(t)),t?t.getAttribute("data-layout-mode")||"standard":null},destroy:function(t){let n=this.instances.get(t);n&&(n.cleanup.forEach(function(s){s()}),t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),t.removeAttribute("aria-label"),this.removeFibFallback(t),this.instances.delete(t))},destroyAll:function(){this.instances.forEach(function(n,s){this.destroy(s)}.bind(this)),document.querySelectorAll('[data-grid-initialized="true"]').forEach(function(n){n._gridCleanup&&(n._gridCleanup(),delete n._gridCleanup)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("gridLayout",e),window.VanduoGridLayout=e})();(function(){"use strict";let h={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(r){(r.target===e.backdrop||r.target===e.container)&&e.close()};this.backdrop.addEventListener("click",t),this._cleanupFunctions.push(()=>this.backdrop.removeEventListener("click",t));let n=function(){e.close()};this.img.addEventListener("click",n),this._cleanupFunctions.push(()=>this.img.removeEventListener("click",n));let s=function(){e.close()};this.closeBtn.addEventListener("click",s),this._cleanupFunctions.push(()=>this.closeBtn.removeEventListener("click",s));let i=function(r){r.key==="Escape"&&e.isOpen&&e.close()};document.addEventListener("keydown",i),this._cleanupFunctions.push(()=>document.removeEventListener("keydown",i));let a=function(){if(!e.isOpen)return;let r=window.scrollY;Math.abs(r-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 i=function(){n.classList.add("is-broken")};n.addEventListener("error",i);let a=function(){n.classList.remove("is-broken")};n.addEventListener("load",a)}let s=function(i){i.preventDefault(),e.open(n)};if(n.addEventListener("click",s),n._imageBoxCleanup=()=>n.removeEventListener("click",s),n.tagName!=="BUTTON"&&n.tagName!=="A"){n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label","View enlarged image");let i=function(r){(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),e.open(n))};n.addEventListener("keydown",i);let a=n._imageBoxCleanup;n._imageBoxCleanup=()=>{a(),n.removeEventListener("keydown",i)}}})},open:function(e){if(this.isOpen)return;this.currentTrigger=e,this.isOpen=!0,this.initialScrollY=window.scrollY;let t=e.dataset.imageBoxFullSrc||e.dataset.imageBoxSrc||e.src||e.href;if(!t){console.warn("[Vanduo ImageBox] No image source found for trigger:",e);return}let n=e.dataset.imageBoxCaption||e.alt||"";this.img.src=t,this.img.alt=e.alt||"",n?(this.caption.textContent=n,this.caption.style.display="block"):this.caption.style.display="none";let s=window.innerWidth-document.documentElement.clientWidth;document.body.style.setProperty("--scrollbar-width",`${s}px`),document.body.classList.add("body-image-box-open"),this.backdrop.classList.add("is-visible"),this.backdrop.focus(),e.dispatchEvent(new CustomEvent("imageBox:open",{bubbles:!0,detail:{src:t}})),this.img.complete||(this.img.style.opacity="0",this.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",h),window.VanduoImageBox=h})();(function(){"use strict";let h={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 s=i=>{i.preventDefault();let a=n.dataset.modal,r=document.querySelector(a);r&&this.open(r)};n.addEventListener("click",s),this._triggerCleanups.push(()=>n.removeEventListener("click",s))})},initModal:function(e){let t=this.createBackdrop(e),n=e.querySelectorAll('.vd-modal-close, [data-dismiss="modal"]'),s=e.querySelector(".vd-modal-dialog");if(!s)return;let i=[];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(l=>{let c=()=>{this.close(e)};l.addEventListener("click",c),i.push(()=>l.removeEventListener("click",c))});let r=l=>{l.target===t&&e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",r),i.push(()=>t.removeEventListener("click",r));let o=l=>{if(l.key==="Escape"&&this.openModals.length>0){let c=this.openModals[this.openModals.length-1];c===e&&c.dataset.keyboard!=="false"&&this.close(c)}};document.addEventListener("keydown",o),i.push(()=>document.removeEventListener("keydown",o)),this.modals.set(e,{backdrop:t,dialog:s,trapHandler:null,cleanup:i})},createBackdrop:function(e){let t=e.querySelector(".vd-modal-backdrop");return t||(t=document.createElement("div"),t.className="vd-modal-backdrop",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,dialog:i}=n;if(this.zIndexCounter+=10,t.style.zIndex=this.zIndexCounter,s.style.zIndex=this.zIndexCounter-1,this.openModals.push(t),s.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),this.openModals.length===1){document.body.classList.add("body-modal-open");let r=window.innerWidth-document.documentElement.clientWidth;r>0&&(document.body.style.paddingRight=`${r}px`)}let a=this.trapFocus(t);n.trapHandler=a,setTimeout(()=>{let r=this.getFocusableElements(t)[0];r&&r.focus()},100),t.dispatchEvent(new CustomEvent("modal:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,trapHandler:i}=n;i&&(t.removeEventListener("keydown",i),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)s.classList.remove("is-visible"),document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050;else{let o=this.openModals[this.openModals.length-1];this.modals.get(o).backdrop.classList.add("is-visible")}let r=document.querySelector(`[data-modal="#${t.id}"]`);r&&r.focus(),t.dispatchEvent(new CustomEvent("modal:close",{bubbles:!0}))},trapFocus:function(e){let t=this,n=function(s){if(s.key!=="Tab")return;let i=t.getFocusableElements(e),a=i[0],r=i[i.length-1];s.shiftKey?document.activeElement===a&&(s.preventDefault(),r.focus()):document.activeElement===r&&(s.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",h),window.VanduoModals=h})();(function(){"use strict";let h={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"),s=e.querySelector(".vd-navbar-overlay")||this.createOverlay(e);if(!t||!n)return;let i=[],a=u=>{u.preventDefault(),u.stopPropagation(),this.toggleMenu(e,t,n,s)};if(t.addEventListener("click",a),i.push(()=>t.removeEventListener("click",a)),s){let u=()=>{this.closeMenu(e,t,n,s)};s.addEventListener("click",u),i.push(()=>s.removeEventListener("click",u))}let r=u=>{u.key==="Escape"&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)};document.addEventListener("keydown",r),i.push(()=>document.removeEventListener("keydown",r));let o,l=()=>{clearTimeout(o),o=setTimeout(()=>{let u=this.getBreakpoint();window.innerWidth>=u&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)},250)};window.addEventListener("resize",l),i.push(()=>{clearTimeout(o),window.removeEventListener("resize",l)});let c=u=>{n.classList.contains("is-open")&&!e.contains(u.target)&&!n.contains(u.target)&&this.closeMenu(e,t,n,s)};document.addEventListener("click",c),i.push(()=>document.removeEventListener("click",c)),n.querySelectorAll(".vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link").forEach(u=>{let p=f=>{let m=this.getBreakpoint();if(window.innerWidth<m){f.preventDefault();let k=u.parentElement.querySelector(".vd-navbar-dropdown-menu");k&&k.classList.toggle("is-open")}};u.addEventListener("click",p),i.push(()=>u.removeEventListener("click",p))}),this.instances.set(e,{toggle:t,menu:n,overlay:s,cleanup:i})},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})},toggleMenu:function(e,t,n,s){n.classList.contains("is-open")?this.closeMenu(e,t,n,s):this.openMenu(e,t,n,s)},openMenu:function(e,t,n,s){n.classList.add("is-open"),t.classList.add("is-active"),s&&s.classList.add("is-active"),document.body.style.overflow="hidden",t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false")},closeMenu:function(e,t,n,s){n.classList.remove("is-open"),t.classList.remove("is-active"),s&&s.classList.remove("is-active"),document.body.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",h),window.VanduoNavbar=h})();(function(){"use strict";let h={instances:new Map,init:function(){document.querySelectorAll(".vd-pagination[data-pagination]").forEach(t=>{this.instances.has(t)||this.initPagination(t)})},initPagination:function(e){let t=parseInt(e.dataset.totalPages)||1,n=parseInt(e.dataset.currentPage)||1,s=parseInt(e.dataset.maxVisible)||7;this.render(e,{totalPages:t,currentPage:n,maxVisible:s});let i=a=>{let r=a.target.closest(".vd-pagination-link");if(!r||r.closest(".vd-pagination-item.disabled")||r.closest(".vd-pagination-item.active"))return;a.preventDefault();let o=r.closest(".vd-pagination-item"),l=o.dataset.page;l?this.goToPage(e,parseInt(l)):o.classList.contains("pagination-prev")?this.prevPage(e):o.classList.contains("pagination-next")&&this.nextPage(e)};e.addEventListener("click",i),this.instances.set(e,{cleanup:[()=>e.removeEventListener("click",i)]})},render:function(e,t){let{totalPages:n,currentPage:s,maxVisible:i}=t;if(n<=1){e.innerHTML="";return}let a="";a+=`<li class="vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${s===1?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Previous">Previous</a>',a+="</li>";let r=this.calculatePages(s,n,i),o=0;r.forEach(l=>{if(l==="ellipsis")a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>';else{l!==o+1&&o>0&&(a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>');let c=Number(l);a+=`<li class="vd-pagination-item pagination-item ${c===s?"active":""}" data-page="${c}">`,a+=`<a class="vd-pagination-link pagination-link" href="#" aria-label="Page ${c}">${c}</a>`,a+="</li>",o=l}}),a+=`<li class="vd-pagination-item vd-pagination-next pagination-item pagination-next ${s===n?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Next">Next</a>',a+="</li>",e.innerHTML=a,e.dataset.currentPage=s},calculatePages:function(e,t,n){let s=[],i=Math.floor(n/2);if(t<=n)for(let a=1;a<=t;a++)s.push(a);else{s.push(1);let a=Math.max(2,e-i),r=Math.min(t-1,e+i);e<=i+1&&(r=Math.min(t-1,n-1)),e>=t-i&&(a=Math.max(2,t-n+2)),a>2&&s.push("ellipsis");for(let o=a;o<=r;o++)s.push(o);r<t-1&&s.push("ellipsis"),t>1&&s.push(t)}return s},goToPage:function(e,t){let n=parseInt(e.dataset.totalPages)||1,s=parseInt(e.dataset.maxVisible)||7;t<1||t>n||(this.render(e,{totalPages:n,currentPage:t,maxVisible:s}),e.dispatchEvent(new CustomEvent("pagination:change",{bubbles:!0,detail:{page:t,totalPages:n}})))},prevPage:function(e){let t=parseInt(e.dataset.currentPage)||1;t>1&&this.goToPage(e,t-1)},nextPage:function(e){let t=parseInt(e.dataset.currentPage)||1,n=parseInt(e.dataset.totalPages)||1;t<n&&this.goToPage(e,t+1)},update:function(e,t){let n=typeof e=="string"?document.querySelector(e):e;n&&(t.totalPages!==void 0&&(n.dataset.totalPages=t.totalPages),t.currentPage!==void 0&&(n.dataset.currentPage=t.currentPage),t.maxVisible!==void 0&&(n.dataset.maxVisible=t.maxVisible),this.render(n,{totalPages:parseInt(n.dataset.totalPages)||1,currentPage:parseInt(n.dataset.currentPage)||1,maxVisible:parseInt(n.dataset.maxVisible)||7}))},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("pagination",h),window.VanduoPagination=h})();(function(){"use strict";let h={parallaxElements:new Map,ticking:!1,isMobile:window.innerWidth<768,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,isInitialized:!1,_onScroll:null,_onResize:null,init:function(){if(this.isInitialized){this.refresh();return}if(this.isInitialized=!0,this.reducedMotion)return;document.querySelectorAll(".vd-parallax").forEach(t=>{t.dataset.parallaxInitialized||this.initParallax(t)}),this.handleScroll(),this._onScroll=()=>{this.handleScroll()},window.addEventListener("scroll",this._onScroll,{passive:!0}),this._onResize=()=>{this.isMobile=window.innerWidth<768,this.updateAll()},window.addEventListener("resize",this._onResize)},initParallax:function(e){e.dataset.parallaxInitialized="true";let t=e.classList.contains("parallax-disable-mobile");if(t&&this.isMobile)return;let n=e.querySelectorAll(".vd-parallax-layer, .vd-parallax-bg"),s=this.getSpeed(e),i=e.classList.contains("parallax-horizontal")?"horizontal":"vertical";this.parallaxElements.set(e,{layers:Array.from(n),speed:s,direction:i,disableMobile:t}),this.updateParallax(e)},getSpeed:function(e){return e.classList.contains("parallax-slow")?.5:e.classList.contains("parallax-fast")?1.5:1},handleScroll:function(){this.ticking||(window.requestAnimationFrame(()=>{this.updateAll(),this.ticking=!1}),this.ticking=!0)},updateAll:function(){this.parallaxElements.forEach((e,t)=>{e.disableMobile&&this.isMobile||this.updateParallax(t)})},updateParallax:function(e){let t=this.parallaxElements.get(e);if(!t)return;let n=e.getBoundingClientRect(),s=window.innerHeight,i=n.top,a=n.height,o=(Math.max(0,Math.min(1,(s-i)/(s+a)))-.5)*t.speed*100;t.layers.forEach((l,c)=>{let d=l.dataset.parallaxSpeed?parseFloat(l.dataset.parallaxSpeed):1,u=o*d;t.direction==="horizontal"?l.style.transform=`translateX(${u}px)`:l.style.transform=`translateY(${u}px)`})},destroy:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.parallaxElements.has(t)&&(this.parallaxElements.get(t).layers.forEach(s=>{s.style.transform=""}),this.parallaxElements.delete(t))},refresh:function(){this.updateAll()},destroyAll:function(){this.parallaxElements.forEach((e,t)=>{this.destroy(t)}),this.parallaxElements.clear(),this._onScroll&&(window.removeEventListener("scroll",this._onScroll),this._onScroll=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null),this.isInitialized=!1}};typeof window.Vanduo<"u"&&window.Vanduo.register("parallax",h),window.VanduoParallax=h})();(function(){"use strict";let h={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 s=typeof e=="string"?document.querySelector(e):e;if(!s)return;t=Math.max(0,Math.min(100,t)),n?s.style.transition="width var(--transition-duration-slow) var(--transition-ease)":(s.style.transition="none",setTimeout(()=>{s.style.transition=""},0)),s.style.width=t+"%",s.setAttribute("aria-valuenow",t),s.setAttribute("aria-valuemin",0),s.setAttribute("aria-valuemax",100);let i=s.querySelector(".progress-text");i&&(i.textContent=t+"%"),s.dispatchEvent(new CustomEvent("progress:update",{bubbles:!0,detail:{value:t,max:100}})),t>=100&&s.dispatchEvent(new CustomEvent("progress:complete",{bubbles:!0,detail:{value:t,max:100}}))},animateProgress:function(e,t,n=1e3){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;let i=parseInt(s.style.width)||0,a=t-i,r=performance.now(),o=l=>{let c=l-r,d=Math.min(c/n,1),u=1-Math.pow(1-d,3),p=i+a*u;this.setProgress(s,p,!1),d<1&&requestAnimationFrame(o)};requestAnimationFrame(o)},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",h),window.VanduoPreloader=h})();(function(){"use strict";let h={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 s=document.createElement("button");s.type="button",s.className="custom-select-button",s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-labelledby",e.id||this.generateId(e));let i=document.createElement("div");if(i.className="custom-select-dropdown",i.setAttribute("role","listbox"),e.dataset.searchable==="true"){let c=document.createElement("div");c.className="custom-select-search";let d=document.createElement("input");d.type="text",d.className="input input-sm",d.placeholder="Search...",d.setAttribute("aria-label","Search options"),c.appendChild(d),i.appendChild(c);let u=f=>{this.filterOptions(i,f.target.value)},p=typeof debounce=="function"?debounce(u,150):u;d.addEventListener("input",p),t.push(()=>d.removeEventListener("input",p))}this.buildOptions(e,i,s),n.appendChild(s),n.appendChild(i),this.updateButtonText(e,s);let a=c=>{c.preventDefault(),c.stopPropagation(),this.toggleDropdown(s,i)};s.addEventListener("click",a),t.push(()=>s.removeEventListener("click",a));let r=c=>{!n.contains(c.target)&&i.classList.contains("is-open")&&this.closeDropdown(s,i)};document.addEventListener("click",r),t.push(()=>document.removeEventListener("click",r));let o=c=>{this.handleKeydown(c,e,s,i)};s.addEventListener("keydown",o),t.push(()=>s.removeEventListener("keydown",o));let l=()=>{this.updateButtonText(e,s),this.updateSelectedOptions(e,i)};e.addEventListener("change",l),t.push(()=>e.removeEventListener("change",l)),this.instances.set(e,{wrapper:n,button:s,dropdown:i,cleanup:t})},buildOptions:function(e,t,n){let s=e.querySelectorAll("option"),i=document.createDocumentFragment();s.forEach((a,r)=>{if(a.parentElement.tagName==="OPTGROUP"){let l=a.parentElement;if(!t.querySelector(`[data-group="${l.label}"]`)){let c=document.createElement("div");c.className="custom-select-option-group",c.textContent=l.label,c.dataset.group=l.label,i.appendChild(c)}}if(a.value===""&&!a.textContent.trim())return;let o=document.createElement("div");o.className="custom-select-option",o.textContent=a.textContent,o.setAttribute("role","option"),o.setAttribute("data-value",a.value),o.setAttribute("data-index",r),a.selected&&(o.classList.add("is-selected"),o.setAttribute("aria-selected","true")),a.disabled&&(o.classList.add("is-disabled"),o.setAttribute("aria-disabled","true")),o.addEventListener("click",l=>{a.disabled||this.selectOption(e,a,o,n,t)}),i.appendChild(o)}),t.appendChild(i)},selectOption:function(e,t,n,s,i){e.multiple?(t.selected=!t.selected,n.classList.toggle("is-selected"),n.setAttribute("aria-selected",t.selected)):(e.value=t.value,e.dispatchEvent(new Event("change",{bubbles:!0})),this.closeDropdown(s,i)),this.updateButtonText(e,s)},updateButtonText:function(e,t){if(e.multiple){let n=Array.from(e.selectedOptions);n.length===0?t.textContent=e.dataset.placeholder||"Select options...":n.length===1?t.textContent=n[0].textContent:t.textContent=`${n.length} selected`}else{let n=e.options[e.selectedIndex];t.textContent=n?n.textContent:e.dataset.placeholder||"Select..."}},updateSelectedOptions:function(e,t){let n=t.querySelectorAll(".vd-custom-select-option"),s=Array.from(e.selectedOptions).map(i=>i.value);n.forEach(i=>{let a=i.dataset.value;s.includes(a)?(i.classList.add("is-selected"),i.setAttribute("aria-selected","true")):(i.classList.remove("is-selected"),i.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,s){let i=s.classList.contains("is-open"),a=Array.from(s.querySelectorAll(".vd-custom-select-option:not(.is-disabled)")),r=a.findIndex(o=>o===document.activeElement);switch(e.key){case"Enter":case" ":if(e.preventDefault(),i&&r>=0){let o=a[r],l=t.options[parseInt(o.dataset.index)];this.selectOption(t,l,o,n,s)}else this.openDropdown(n,s);break;case"Escape":i&&(e.preventDefault(),this.closeDropdown(n,s),n.focus());break;case"ArrowDown":if(e.preventDefault(),!i)this.openDropdown(n,s);else{let o=r<a.length-1?r+1:0;a[o].focus()}break;case"ArrowUp":if(e.preventDefault(),i){let o=r>0?r-1:a.length-1;a[o].focus()}break;case"Home":i&&(e.preventDefault(),a[0].focus());break;case"End":i&&(e.preventDefault(),a[a.length-1].focus());break;default:if(i&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let o=a.find(l=>l.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));o&&o.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},filterOptions:function(e,t){let n=e.querySelectorAll(".vd-custom-select-option"),s=t.toLowerCase();n.forEach(i=>{i.textContent.toLowerCase().includes(s)?i.style.display="block":i.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",h)})();(function(){"use strict";let h={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, .vd-offcanvas").forEach(s=>{this.sidenavs.has(s)||this.initSidenav(s)}),document.querySelectorAll("[data-sidenav-toggle]").forEach(s=>{if(s.dataset.sidenavToggleInitialized)return;s.dataset.sidenavToggleInitialized="true";let i=a=>{a.preventDefault();let r=s.dataset.sidenavToggle,o=document.querySelector(r);o&&this.toggle(o)};s.addEventListener("click",i),this._globalCleanups.push(()=>s.removeEventListener("click",i))}),this.handleResize();let n=()=>{this.handleResize()};window.addEventListener("resize",n),this._globalCleanups.push(()=>window.removeEventListener("resize",n))},initSidenav:function(e){let t=e.getAttribute("data-vd-position");if(t){let o=e.classList.contains("vd-offcanvas")?"vd-offcanvas":"vd-sidenav";e.classList.add(o+"-"+t)}let n=this.createOverlay(e),s=e.querySelector(".vd-sidenav-close, .vd-offcanvas-close"),i=[];if(e.setAttribute("role","navigation"),e.setAttribute("aria-hidden","true"),s){let o=()=>{this.close(e)};s.addEventListener("click",o),i.push(()=>s.removeEventListener("click",o))}let a=()=>{e.dataset.backdrop!=="static"&&this.close(e)};n.addEventListener("click",a),i.push(()=>n.removeEventListener("click",a));let r=o=>{o.key==="Escape"&&e.classList.contains("is-open")&&e.dataset.keyboard!=="false"&&this.close(e)};document.addEventListener("keydown",r),i.push(()=>document.removeEventListener("keydown",r)),this.sidenavs.set(e,{overlay:n,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",h),window.VanduoSidenav=h})();(function(){"use strict";let h={instances:new Map,init:function(){document.querySelectorAll(".vd-tabs, [data-tabs]").forEach(t=>{this.instances.has(t)||this.initTabs(t)})},initTabs:function(e){let t=e.querySelector('.vd-tab-list, [role="tablist"]'),n=e.querySelectorAll(".vd-tab-link, [data-tab]"),s=e.querySelectorAll(".vd-tab-pane, [data-tab-pane]");if(!t||n.length===0)return;let i=[];t.setAttribute("role","tablist"),n.forEach((r,o)=>{let l=r.dataset.tab||r.getAttribute("href")?.replace("#","")||`tab-${o}`,c=this.findPane(e,l,s);r.setAttribute("role","tab"),r.setAttribute("aria-selected",r.classList.contains("is-active")?"true":"false"),r.setAttribute("tabindex",r.classList.contains("is-active")?"0":"-1"),r.id||(r.id=`tab-btn-${l}`),c&&(c.setAttribute("role","tabpanel"),c.setAttribute("aria-labelledby",r.id),c.id||(c.id=`tab-pane-${l}`),r.setAttribute("aria-controls",c.id));let d=p=>{p.preventDefault(),!r.classList.contains("disabled")&&!r.disabled&&this.activateTab(e,r,n,s)};r.addEventListener("click",d),i.push(()=>r.removeEventListener("click",d));let u=p=>{this.handleKeydown(p,e,r,n,s)};r.addEventListener("keydown",u),i.push(()=>r.removeEventListener("keydown",u))}),!e.querySelector(".vd-tab-link.is-active, [data-tab].is-active")&&n.length>0&&this.activateTab(e,n[0],n,s),this.instances.set(e,{cleanup:i})},findPane:function(e,t,n){let s=e.querySelector(`[data-tab-pane="${t}"]`);return s||(s=e.querySelector(`#${t}`)),s||e.querySelectorAll(".vd-tab-link, [data-tab]").forEach((a,r)=>{(a.dataset.tab||a.getAttribute("href")?.replace("#",""))===t&&n[r]&&(s=n[r])}),s},activateTab:function(e,t,n,s){let i=t.dataset.tab||t.getAttribute("href")?.replace("#","")||t.id;n.forEach(o=>{o.classList.remove("is-active"),o.setAttribute("aria-selected","false"),o.setAttribute("tabindex","-1"),o.parentElement&&o.parentElement.classList.contains("tab-item")&&o.parentElement.classList.remove("is-active")}),s.forEach(o=>{o.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),t.parentElement&&t.parentElement.classList.contains("tab-item")&&t.parentElement.classList.add("is-active");let a=this.findPane(e,i,s);a&&a.classList.add("is-active");let r=new CustomEvent("tab:change",{bubbles:!0,detail:{tab:t,pane:a,tabId:i}});e.dispatchEvent(r)},handleKeydown:function(e,t,n,s,i){let a=t.classList.contains("tabs-vertical"),r=Array.from(s).filter(c=>!c.classList.contains("disabled")&&!c.disabled),o=r.indexOf(n),l=o;switch(e.key){case"ArrowLeft":a||(e.preventDefault(),l=o>0?o-1:r.length-1);break;case"ArrowRight":a||(e.preventDefault(),l=o<r.length-1?o+1:0);break;case"ArrowUp":a&&(e.preventDefault(),l=o>0?o-1:r.length-1);break;case"ArrowDown":a&&(e.preventDefault(),l=o<r.length-1?o+1:0);break;case"Home":e.preventDefault(),l=0;break;case"End":e.preventDefault(),l=r.length-1;break;case"Enter":case" ":e.preventDefault(),this.activateTab(t,n,s,i);return;default:return}l!==o&&(r[l].focus(),this.activateTab(t,r[l],s,i))},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 s=n.querySelectorAll(".vd-tab-link, [data-tab]"),i=n.querySelectorAll(".vd-tab-pane, [data-tab-pane]");this.activateTab(n,t,s,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("tabs",h)})();(function(){"use strict";let h={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,s){e&&(e.addEventListener(t,n,s),this._cleanup.push(()=>e.removeEventListener(t,n,s)))},getDefaultPrimary:function(e){return e==="system"?window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT:e==="dark"?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT},loadPreferences:function(){this.state.theme=this.getStorageValue(this.STORAGE_KEYS.THEME,this.DEFAULTS.THEME),this.state.primary=this.getStorageValue(this.STORAGE_KEYS.PRIMARY,this.getDefaultPrimary(this.state.theme)),this.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),this._isApplying=!0;let t=this.state.theme,n=this.getDefaultPrimary(t);if(this.state.primary===n){let s=this.getDefaultPrimary(e);s!==this.state.primary&&this.applyPrimary(s)}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 s=window.Vanduo.components.themeSwitcher;s.state&&s.state.preference!==e&&(s.state.preference=e,typeof s.setStorageValue=="function"&&s.setStorageValue(s.STORAGE_KEY,e),typeof s.updateUI=="function"&&s.updateUI())}this._isApplying=!1,this.dispatchEvent("mode-change",{mode:e})},dispatchEvent:function(e,t){let n=new CustomEvent("theme:"+e,{bubbles:!0,detail:t});document.dispatchEvent(n);let s=new CustomEvent("theme:change",{bubbles:!0,detail:{type:e,value:t[Object.keys(t)[0]],state:{...this.state}}});document.dispatchEvent(s)},bindExistingElements:function(){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 s=document.createElement("div");s.className="vd-theme-customizer-panel",s.innerHTML=this.getPanelHTML(),document.body.appendChild(n),document.body.appendChild(s),this.elements.panel=s,this.elements.overlay=n,this.elements.customizer={contains:i=>s.contains(i)||e.contains(i)},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,s=t.bottom+8,i=window.innerWidth,a=i-t.right;i-a-n<8&&(a=i-n-8),this.elements.panel.style.top=s+"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 - "+s+"px)"}},bindPanelEvents:function(){if(!this.elements.panel||this.elements.panel.getAttribute("data-customizer-initialized")==="true")return;this.elements.panel.setAttribute("data-customizer-initialized","true"),this.elements.panel.querySelectorAll("[data-color]").forEach(s=>{this.addListener(s,"click",()=>{this.applyPrimary(s.dataset.color),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(s=>{this.addListener(s,"click",()=>{this.applyNeutral(s.dataset.neutral),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-radius]").forEach(s=>{this.addListener(s,"click",()=>{this.applyRadius(s.dataset.radius),this.updateUI()})});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&this.addListener(e,"change",s=>{this.applyFont(s.target.value),this.updateUI()});let t=this.elements.panel.querySelector(".customizer-reset");t&&this.addListener(t,"click",()=>{this.reset()});let n=this.elements.panel.querySelector(".customizer-mobile-close");n&&this.addListener(n,"click",()=>{this.close()}),this.elements.overlay&&this.addListener(this.elements.overlay,"click",()=>{this.close()})},getPanelHTML:function(){let e=typeof escapeHtml=="function"?escapeHtml:function(r){let o=document.createElement("div");return o.textContent=String(r??""),o.innerHTML},t=function(r){let o=String(r??"").trim();return/^(#[0-9a-fA-F]{3,8}|rgb[a]?\([^)]{1,60}\)|hsl[a]?\([^)]{1,60}\)|var\(--[a-zA-Z0-9_-]{1,40}\))$/.test(o)?o:"#000000"},n="";for(let[r,o]of Object.entries(this.PRIMARY_COLORS))n+=`<button class="tc-color-swatch${r===this.state.primary?" is-active":""}" data-color="${e(r)}" style="--swatch-color: ${t(o.color)}" title="${e(o.name)}"></button>`;let s="";for(let[r,o]of Object.entries(this.NEUTRAL_COLORS))s+=`<button class="tc-neutral-swatch${r===this.state.neutral?" is-active":""}" data-neutral="${e(r)}" style="--swatch-color: ${t(o.color)}" title="${e(o.name)}"><span>${e(o.name)}</span></button>`;let i="";this.RADIUS_OPTIONS.forEach(r=>{i+=`<button class="tc-radius-btn${r===this.state.radius?" is-active":""}" data-radius="${e(r)}">${e(r)}</button>`});let a="";for(let[r,o]of Object.entries(this.FONT_OPTIONS))a+=`<option value="${e(r)}"${r===this.state.font?" selected":""}>${e(o.name)}</option>`;return`
|
package/dist/vanduo.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Vanduo v1.
|
|
1
|
+
/*! Vanduo v1.3.0 | Built: 2026-03-17T16:46:03.216Z | git:ea44b23 | development */
|
|
2
2
|
*, :before, :after {
|
|
3
3
|
box-sizing: border-box;
|
|
4
4
|
}
|
|
@@ -1348,6 +1348,10 @@ pre code {
|
|
|
1348
1348
|
font-weight: var(--font-weight-bold);
|
|
1349
1349
|
}
|
|
1350
1350
|
|
|
1351
|
+
.vd-text-italic {
|
|
1352
|
+
font-style: italic;
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1351
1355
|
.vd-font-extrabold {
|
|
1352
1356
|
font-weight: var(--font-weight-extrabold);
|
|
1353
1357
|
}
|
|
@@ -4513,6 +4517,14 @@ pre code {
|
|
|
4513
4517
|
margin-top: var(--spacing-5);
|
|
4514
4518
|
}
|
|
4515
4519
|
|
|
4520
|
+
.vd-mt-6 {
|
|
4521
|
+
margin-top: var(--spacing-6);
|
|
4522
|
+
}
|
|
4523
|
+
|
|
4524
|
+
.vd-mt-8 {
|
|
4525
|
+
margin-top: var(--spacing-8);
|
|
4526
|
+
}
|
|
4527
|
+
|
|
4516
4528
|
.vd-mb-0 {
|
|
4517
4529
|
margin-bottom: var(--spacing-0);
|
|
4518
4530
|
}
|
|
@@ -59753,8 +59765,8 @@ body > .vd-theme-customizer-panel.is-open {
|
|
|
59753
59765
|
|
|
59754
59766
|
.doc-tab.active {
|
|
59755
59767
|
border-color: var(--color-primary);
|
|
59756
|
-
color: var(--
|
|
59757
|
-
background: var(--color-primary
|
|
59768
|
+
color: var(--text-on-primary);
|
|
59769
|
+
background: var(--color-primary);
|
|
59758
59770
|
box-shadow: 0 0 0 1px var(--color-primary-alpha-20);
|
|
59759
59771
|
}
|
|
59760
59772
|
|