@vanduo-oss/framework 1.4.1 → 1.4.2

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../js/utils/lifecycle.js", "../js/vanduo.js", "../js/components/code-snippet.js", "../js/components/collapsible.js", "../js/components/dropdown.js", "../js/components/font-switcher.js", "../js/components/grid.js", "../js/components/image-box.js", "../js/components/modals.js", "../js/components/navbar.js", "../js/components/pagination.js", "../js/components/parallax.js", "../js/components/preloader.js", "../js/components/select.js", "../js/components/sidenav.js", "../js/components/tabs.js", "../js/components/theme-customizer.js", "../js/components/theme-switcher.js", "../js/components/toast.js", "../js/components/tooltips.js", "../js/components/doc-search.js", "../js/components/draggable.js", "../js/components/lazy-load.js", "../js/components/glass.js", "../js/components/morph.js", "../js/components/expanding-cards.js", "../js/components/timeline.js", "../js/components/flow.js", "../js/components/bubble.js", "../js/components/waypoint.js", "../js/components/ripple.js", "../js/components/affix.js", "../js/components/suggest.js", "../js/components/validate.js", "../js/components/datepicker.js", "../js/components/timepicker.js", "../js/components/stepper.js", "../js/components/rating.js", "../js/components/transfer.js", "../js/components/tree.js", "../js/components/spotlight.js", "../js/components/music-player.js", "../js/index.js"],
4
- "sourcesContent": ["/**\n * Vanduo Framework - Lifecycle Manager\n * Central registry for scoped init/destroy, instance cleanup, and DOM queries.\n */\n\n(function () {\n 'use strict';\n\n function normalizeCallbacks(value) {\n if (!value) return [];\n if (Array.isArray(value)) {\n return value.filter(function (fn) {\n return typeof fn === 'function';\n });\n }\n return typeof value === 'function' ? [value] : [];\n }\n\n function normalizeOptions(options) {\n if (typeof options === 'function') {\n return { onDestroy: [options] };\n }\n return options || {};\n }\n\n function callSafely(label, fn) {\n try {\n fn();\n } catch (error) {\n console.warn('[Vanduo Lifecycle] ' + label + ' error:', error);\n }\n }\n\n const Lifecycle = {\n // Map<Element, Map<componentName, { cleanup, onDestroy, registeredAt }>>\n instances: new Map(),\n\n isRoot: function (root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n normalizeRoot: function (root) {\n return this.isRoot(root) ? root : document;\n },\n\n isInRoot: function (root, element) {\n const scope = this.normalizeRoot(root);\n if (!(element instanceof Element)) return false;\n if (scope === document) {\n return document.documentElement ? document.documentElement.contains(element) : document.contains(element);\n }\n if (scope === element) return true;\n return typeof scope.contains === 'function' && scope.contains(element);\n },\n\n queryAll: function (root, selector) {\n const scope = this.normalizeRoot(root);\n const matches = [];\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n return matches;\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n runInRoot: function (root, fn) {\n const scope = this.normalizeRoot(root);\n return fn(scope);\n },\n\n register: function (element, componentName, cleanupFns, options) {\n if (!(element instanceof Element) || !componentName) return;\n\n const optionBag = normalizeOptions(options);\n const cleanup = normalizeCallbacks(cleanupFns);\n const onDestroy = normalizeCallbacks(optionBag.onDestroy);\n const componentEntries = this.instances.get(element) || new Map();\n const existing = componentEntries.get(componentName);\n\n if (existing) {\n existing.cleanup = existing.cleanup.concat(cleanup);\n existing.onDestroy = existing.onDestroy.concat(onDestroy);\n return;\n }\n\n componentEntries.set(componentName, {\n component: componentName,\n cleanup: cleanup,\n onDestroy: onDestroy,\n registeredAt: Date.now()\n });\n\n this.instances.set(element, componentEntries);\n },\n\n unregister: function (element, componentName) {\n const componentEntries = this.instances.get(element);\n if (!componentEntries) return;\n\n if (componentName) {\n const entry = componentEntries.get(componentName);\n if (!entry) return;\n\n componentEntries.delete(componentName);\n if (!componentEntries.size) {\n this.instances.delete(element);\n }\n\n entry.cleanup.forEach(function (fn) {\n callSafely('Cleanup', fn);\n });\n entry.onDestroy.forEach(function (fn) {\n callSafely('Destroy', fn);\n });\n return;\n }\n\n const entries = Array.from(componentEntries.values());\n this.instances.delete(element);\n entries.forEach(function (entry) {\n entry.cleanup.forEach(function (fn) {\n callSafely('Cleanup', fn);\n });\n entry.onDestroy.forEach(function (fn) {\n callSafely('Destroy', fn);\n });\n });\n },\n\n destroyAll: function (componentName) {\n const toRemove = [];\n this.instances.forEach(function (componentEntries, element) {\n if (!componentName) {\n toRemove.push([element, null]);\n return;\n }\n\n if (componentEntries.has(componentName)) {\n toRemove.push([element, componentName]);\n }\n });\n\n toRemove.forEach(function (entry) {\n Lifecycle.unregister(entry[0], entry[1] || undefined);\n });\n\n return toRemove.length;\n },\n\n destroyAllInContainer: function (container, componentName) {\n const scope = this.normalizeRoot(container);\n const toRemove = [];\n\n this.instances.forEach(function (componentEntries, element) {\n if (!Lifecycle.isInRoot(scope, element)) return;\n\n if (!componentName) {\n toRemove.push([element, null]);\n return;\n }\n\n if (componentEntries.has(componentName)) {\n toRemove.push([element, componentName]);\n }\n });\n\n toRemove.forEach(function (entry) {\n Lifecycle.unregister(entry[0], entry[1] || undefined);\n });\n\n return toRemove.length;\n },\n\n getAll: function () {\n const result = [];\n this.instances.forEach(function (componentEntries, element) {\n componentEntries.forEach(function (entry) {\n result.push({\n element: element,\n component: entry.component,\n registeredAt: entry.registeredAt\n });\n });\n });\n return result;\n },\n\n has: function (element, componentName) {\n const componentEntries = this.instances.get(element);\n if (!componentEntries) return false;\n return componentName ? componentEntries.has(componentName) : componentEntries.size > 0;\n }\n };\n\n window.addEventListener('beforeunload', function () {\n Lifecycle.destroyAll();\n });\n\n window.VanduoLifecycle = Lifecycle;\n})();\n", "/**\n * Vanduo Framework - Main JavaScript File\n */\n\n(function () {\n 'use strict';\n\n const VANDUO_VERSION = typeof __VANDUO_VERSION__ !== 'undefined' ? __VANDUO_VERSION__ : '0.0.0-dev';\n const hasOwn = Object.prototype.hasOwnProperty;\n\n /**\n * Vanduo Framework Object\n */\n const Vanduo = {\n version: VANDUO_VERSION,\n components: {},\n aliases: {},\n _decoratedComponents: new WeakSet(),\n\n resolveComponentName: function (name) {\n return this.aliases[name] || name;\n },\n\n _isRoot: function (root) {\n if (typeof window.VanduoLifecycle !== 'undefined' && typeof window.VanduoLifecycle.isRoot === 'function') {\n return window.VanduoLifecycle.isRoot(root);\n }\n\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n _normalizeRoot: function (root) {\n return this._isRoot(root) ? root : document;\n },\n\n _queryAll: function (root, selector) {\n const scope = this._normalizeRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n },\n\n queryAll: function (root, selector) {\n if (typeof selector === 'undefined') {\n selector = root;\n root = document;\n }\n\n return this._queryAll(root, selector);\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n _isLifecycleManagedComponent: function (component) {\n if (!component || typeof component !== 'object') return false;\n\n for (const key in component) {\n if (hasOwn.call(component, key) && component[key] instanceof Map) {\n return true;\n }\n }\n\n return false;\n },\n\n _syncComponentLifecycle: function (name, component, root) {\n const lifecycle = window.VanduoLifecycle;\n if (!lifecycle || !this._isLifecycleManagedComponent(component)) return;\n\n const componentName = this.resolveComponentName(name);\n const scope = this._normalizeRoot(root);\n\n for (const key in component) {\n if (!hasOwn.call(component, key) || !(component[key] instanceof Map)) {\n continue;\n }\n\n component[key].forEach(function (instance, element) {\n if (!(element instanceof Element) || !lifecycle.isInRoot(scope, element) || lifecycle.has(element, componentName)) {\n return;\n }\n\n if (typeof component.destroy === 'function') {\n lifecycle.register(element, componentName, [], function () {\n component.destroy(element);\n });\n return;\n }\n\n const cleanup = instance && Array.isArray(instance.cleanup) ? instance.cleanup : [];\n lifecycle.register(element, componentName, cleanup, function () {\n component[key].delete(element);\n });\n });\n }\n },\n\n _decorateComponent: function (name, component) {\n const framework = this;\n const lifecycle = window.VanduoLifecycle;\n if (!component || typeof component !== 'object' || this._decoratedComponents.has(component)) {\n return;\n }\n\n const originalInit = typeof component.init === 'function' ? component.init : null;\n if (originalInit) {\n component.init = function (...args) {\n const scopedRoot = framework._isRoot(args[0]) ? args[0] : null;\n const result = originalInit.apply(this, args);\n\n if (window.Vanduo) {\n const syncRoot = scopedRoot || document;\n window.Vanduo._syncComponentLifecycle(name, this, syncRoot);\n }\n\n return result;\n };\n }\n\n const originalDestroyAll = typeof component.destroyAll === 'function' ? component.destroyAll : null;\n if (originalDestroyAll) {\n component.destroyAll = function (...args) {\n const scopedRoot = framework._isRoot(args[0]) ? args[0] : null;\n const componentName = window.Vanduo ? window.Vanduo.resolveComponentName(name) : name;\n\n if (lifecycle && window.Vanduo && window.Vanduo._isLifecycleManagedComponent(this)) {\n if (scopedRoot && scopedRoot !== document) {\n lifecycle.destroyAllInContainer(scopedRoot, componentName);\n if (this.__vanduoScopedDestroyAll === true) {\n return originalDestroyAll.apply(this, args);\n }\n return;\n }\n\n lifecycle.destroyAll(componentName);\n }\n\n return originalDestroyAll.apply(this, args);\n };\n }\n\n this._decoratedComponents.add(component);\n },\n\n /**\n * Initialize framework\n * Call this after DOM is ready and all components are loaded\n */\n init: function (root) {\n const scope = this._normalizeRoot(root);\n\n if (scope !== document) {\n this.initComponents(scope);\n return;\n }\n\n if (typeof ready !== 'undefined') {\n ready(() => {\n this.initComponents(document);\n });\n return;\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.initComponents(document);\n });\n return;\n }\n\n this.initComponents(document);\n },\n\n /**\n * Initialize all components\n */\n initComponents: function (root) {\n const scope = this._normalizeRoot(root);\n\n Object.keys(this.components).forEach((name) => {\n const component = this.components[name];\n if (component.init && typeof component.init === 'function') {\n try {\n component.init(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to initialize component \"' + name + '\":', e);\n }\n }\n });\n },\n\n /**\n * Register a component\n * @param {string} name - Component name\n * @param {Object} component - Component object with init method\n */\n register: function (name, component, options) {\n const opts = options || {};\n this._decorateComponent(name, component);\n this.components[name] = component;\n\n if (Array.isArray(opts.aliases)) {\n opts.aliases.forEach((alias) => {\n this.aliases[alias] = name;\n });\n }\n },\n\n registerAlias: function (alias, name) {\n const canonicalName = this.resolveComponentName(name);\n if (this.components[canonicalName]) {\n this.aliases[alias] = canonicalName;\n }\n },\n\n /**\n * Re-initialize a component (useful after dynamic DOM changes)\n * @param {string} name - Component name\n */\n reinit: function (name, root) {\n const scope = this._normalizeRoot(root);\n const componentName = this.resolveComponentName(name);\n const component = this.components[componentName];\n if (component && component.init && typeof component.init === 'function') {\n try {\n if (component.destroyAll && typeof component.destroyAll === 'function') {\n component.destroyAll(scope);\n }\n component.init(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to reinitialize component \"' + componentName + '\":', e);\n }\n }\n },\n\n /**\n * Destroy component instances within the provided root.\n */\n destroy: function (root) {\n const scope = this._normalizeRoot(root);\n const names = Object.keys(this.components);\n\n for (let i = 0; i < names.length; i++) {\n const component = this.components[names[i]];\n if (component && component.destroyAll && typeof component.destroyAll === 'function') {\n try {\n component.destroyAll(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to destroy component \"' + names[i] + '\":', e);\n }\n }\n }\n },\n\n /**\n * Destroy all component instances and clean up event listeners.\n */\n destroyAll: function () {\n this.destroy(document);\n },\n\n /**\n * Get component instance\n * @param {string} name - Component name\n * @returns {Object|null}\n */\n getComponent: function (name) {\n const componentName = this.resolveComponentName(name);\n return this.components[componentName] || null;\n }\n };\n\n // Expose to global scope\n window.Vanduo = Vanduo;\n\n})();\n", "/**\n * Vanduo Framework - Code Snippet Component\n * Copyable code blocks with tabs, syntax highlighting, and HTML extraction\n */\n\n(function () {\n 'use strict';\n\n /**\n * Code Snippet Component\n */\n const CodeSnippet = {\n _snippetIdCounter: 0,\n\n resolveRoot: function (root) {\n if (root && (root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11)) {\n return root;\n }\n return document;\n },\n\n queryWithin: function (root, selector) {\n const scope = this.resolveRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n },\n\n getSnippetInstanceId: function (snippet) {\n if (snippet.dataset.codeSnippetId) {\n return snippet.dataset.codeSnippetId;\n }\n\n const baseId = (snippet.id || '').trim();\n if (baseId) {\n snippet.dataset.codeSnippetId = `snippet-${baseId}`;\n return snippet.dataset.codeSnippetId;\n }\n\n this._snippetIdCounter += 1;\n snippet.dataset.codeSnippetId = `snippet-auto-${this._snippetIdCounter}`;\n return snippet.dataset.codeSnippetId;\n },\n\n addListener: function (snippet, target, event, handler) {\n if (!target) return;\n target.addEventListener(event, handler);\n if (!snippet._codeSnippetCleanup) {\n snippet._codeSnippetCleanup = [];\n }\n snippet._codeSnippetCleanup.push(() => target.removeEventListener(event, handler));\n },\n\n /**\n * Initialize all code snippet components\n */\n init: function (root) {\n const snippets = this.queryWithin(root, '.vd-code-snippet');\n\n snippets.forEach(snippet => {\n if (!snippet.dataset.initialized) {\n this.initSnippet(snippet);\n }\n });\n },\n\n /**\n * Initialize a single code snippet\n * @param {HTMLElement} snippet - Code snippet container element\n */\n initSnippet: function (snippet) {\n snippet.dataset.initialized = 'true';\n snippet._codeSnippetCleanup = [];\n\n // Handle collapsible toggle\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle && content) {\n this.initCollapsible(snippet, toggle, content);\n }\n\n // Handle tabs\n const tabs = snippet.querySelectorAll('.vd-code-snippet-tab');\n const panes = snippet.querySelectorAll('.vd-code-snippet-pane');\n\n if (tabs.length > 0) {\n this.initTabs(snippet, tabs, panes);\n }\n\n // Handle copy button\n const copyBtn = snippet.querySelector('.vd-code-snippet-copy');\n if (copyBtn) {\n this.initCopyButton(snippet, copyBtn);\n }\n\n // Handle HTML extraction\n const extractPanes = snippet.querySelectorAll('[data-extract]');\n extractPanes.forEach(pane => {\n this.extractHtml(pane);\n });\n\n const panesToHighlight = snippet.querySelectorAll('.vd-code-snippet-pane:not([data-extract])');\n panesToHighlight.forEach(pane => {\n this.applyPaneHighlighting(pane);\n });\n\n // Handle line numbers\n const lineNumberPanes = snippet.querySelectorAll('.has-line-numbers');\n lineNumberPanes.forEach(pane => {\n this.addLineNumbers(pane);\n });\n },\n\n /**\n * Initialize collapsible functionality\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} content - Collapsible content\n */\n initCollapsible: function (snippet, toggle, content) {\n // Set initial state\n const isExpanded = snippet.dataset.expanded === 'true';\n toggle.setAttribute('aria-expanded', isExpanded);\n content.dataset.visible = isExpanded;\n\n this.addListener(snippet, toggle, 'click', () => {\n const expanded = snippet.dataset.expanded === 'true';\n snippet.dataset.expanded = !expanded;\n toggle.setAttribute('aria-expanded', !expanded);\n content.dataset.visible = !expanded;\n\n // Extract HTML on first expand if needed\n if (!expanded) {\n const extractPanes = content.querySelectorAll('[data-extract]:not([data-extracted])');\n extractPanes.forEach(pane => {\n this.extractHtml(pane);\n });\n }\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:toggle', {\n bubbles: true,\n detail: { snippet, expanded: !expanded }\n });\n snippet.dispatchEvent(event);\n });\n },\n\n /**\n * Initialize tab functionality\n * @param {HTMLElement} snippet - Code snippet container\n * @param {NodeList} tabs - Tab buttons\n * @param {NodeList} panes - Code panes\n */\n initTabs: function (snippet, tabs, panes) {\n const snippetId = this.getSnippetInstanceId(snippet);\n\n // Set up ARIA attributes\n const tabList = snippet.querySelector('.vd-code-snippet-tabs');\n if (tabList) {\n tabList.setAttribute('role', 'tablist');\n }\n\n tabs.forEach((tab, index) => {\n const lang = tab.dataset.lang;\n const isActive = tab.classList.contains('is-active');\n\n // Set ARIA attributes\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', isActive);\n tab.setAttribute('tabindex', isActive ? '0' : '-1');\n tab.id = tab.id || `code-tab-${snippetId}-${lang || 'tab'}-${index}`;\n\n // Find corresponding pane\n const pane = snippet.querySelector(`.vd-code-snippet-pane[data-lang=\"${lang}\"]`);\n if (pane) {\n pane.id = pane.id || `code-pane-${snippetId}-${lang || 'pane'}-${index}`;\n pane.setAttribute('role', 'tabpanel');\n tab.setAttribute('aria-controls', pane.id);\n pane.setAttribute('aria-labelledby', tab.id);\n }\n\n // Click handler\n this.addListener(snippet, tab, 'click', () => {\n this.switchTab(snippet, tab, tabs, panes);\n });\n\n // Keyboard navigation\n this.addListener(snippet, tab, 'keydown', (e) => {\n this.handleTabKeydown(e, snippet, tabs, panes);\n });\n });\n },\n\n /**\n * Switch to a specific tab\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} activeTab - Tab to activate\n * @param {NodeList} tabs - All tab buttons\n * @param {NodeList} panes - All code panes\n */\n switchTab: function (snippet, activeTab, tabs, panes) {\n const lang = activeTab.dataset.lang;\n\n // Deactivate all tabs\n tabs.forEach(tab => {\n tab.classList.remove('is-active');\n tab.setAttribute('aria-selected', 'false');\n tab.setAttribute('tabindex', '-1');\n });\n\n // Hide all panes\n panes.forEach(pane => {\n pane.classList.remove('is-active');\n });\n\n // Activate selected tab\n activeTab.classList.add('is-active');\n activeTab.setAttribute('aria-selected', 'true');\n activeTab.setAttribute('tabindex', '0');\n\n // Show corresponding pane\n const activePane = snippet.querySelector(`.vd-code-snippet-pane[data-lang=\"${lang}\"]`);\n if (activePane) {\n activePane.classList.add('is-active');\n }\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:tabchange', {\n bubbles: true,\n detail: { snippet, tab: activeTab, lang }\n });\n snippet.dispatchEvent(event);\n },\n\n /**\n * Handle keyboard navigation for tabs\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} snippet - Code snippet container\n * @param {NodeList} tabs - All tab buttons\n * @param {NodeList} panes - All code panes\n */\n handleTabKeydown: function (e, snippet, tabs, panes) {\n const tabArray = Array.from(tabs);\n const currentIndex = tabArray.indexOf(e.target);\n let newIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabArray.length - 1;\n break;\n case 'ArrowRight':\n e.preventDefault();\n newIndex = currentIndex < tabArray.length - 1 ? currentIndex + 1 : 0;\n break;\n case 'Home':\n e.preventDefault();\n newIndex = 0;\n break;\n case 'End':\n e.preventDefault();\n newIndex = tabArray.length - 1;\n break;\n default:\n return;\n }\n\n if (newIndex !== currentIndex) {\n tabArray[newIndex].focus();\n this.switchTab(snippet, tabArray[newIndex], tabs, panes);\n }\n },\n\n /**\n * Initialize copy button\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} copyBtn - Copy button element\n */\n initCopyButton: function (snippet, copyBtn) {\n this.addListener(snippet, copyBtn, 'click', async () => {\n await this.copyCode(snippet, copyBtn);\n });\n },\n\n /**\n * Copy code to clipboard\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} copyBtn - Copy button element\n */\n copyCode: async function (snippet, copyBtn) {\n const activePane = snippet.querySelector('.vd-code-snippet-pane.is-active') ||\n snippet.querySelector('.vd-code-snippet-pane');\n\n if (!activePane) {\n console.warn('CodeSnippet: No code pane found');\n return;\n }\n\n const codeElement = activePane.querySelector('code') || activePane;\n const code = codeElement.textContent;\n\n let copySuccess;\n try {\n await navigator.clipboard.writeText(code);\n copySuccess = true;\n } catch (_err) {\n // Fallback for older browsers\n copySuccess = this.fallbackCopy(code);\n }\n this.showCopyFeedback(copyBtn, copySuccess);\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:copy', {\n bubbles: true,\n detail: { snippet, code, success: copySuccess }\n });\n snippet.dispatchEvent(event);\n },\n\n /**\n * Fallback copy method for older browsers\n * @param {string} text - Text to copy\n * @returns {boolean} Success status\n */\n fallbackCopy: function (text) {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n let success = false;\n try {\n success = document.execCommand('copy');\n } catch (err) {\n console.warn('CodeSnippet: Fallback copy failed', err);\n }\n\n document.body.removeChild(textarea);\n return success;\n },\n\n /**\n * Show copy feedback\n * @param {HTMLElement} copyBtn - Copy button element\n * @param {boolean} success - Whether copy was successful\n */\n showCopyFeedback: function (copyBtn, success) {\n if (success) {\n copyBtn.classList.add('is-copied');\n\n // Announce to screen readers\n const announcement = document.createElement('span');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.className = 'sr-only';\n announcement.textContent = 'Code copied to clipboard';\n copyBtn.appendChild(announcement);\n\n setTimeout(() => {\n copyBtn.classList.remove('is-copied');\n if (announcement.parentNode) {\n announcement.parentNode.removeChild(announcement);\n }\n }, 2000);\n }\n },\n\n /**\n * Extract HTML from a demo element\n * @param {HTMLElement} pane - Code pane with data-extract attribute\n */\n extractHtml: function (pane) {\n const selector = pane.dataset.extract;\n if (!selector) return;\n\n const source = document.querySelector(selector);\n if (!source) {\n console.warn(`CodeSnippet: Source element not found: ${selector}`);\n return;\n }\n\n // Get inner HTML\n let html = source.innerHTML;\n\n // Format the HTML\n html = this.formatHtml(html);\n\n // Escape for display\n html = this.escapeHtml(html);\n\n // Apply syntax highlighting\n html = this.highlightHtml(html);\n\n // Set content via DOM API to avoid string-based HTML insertion\n const codeEl = document.createElement('code');\n codeEl.innerHTML = html;\n pane.replaceChildren(codeEl);\n pane.dataset.extracted = 'true';\n pane.dataset.highlighted = 'true';\n },\n\n /**\n * Format HTML with proper indentation\n * @param {string} html - Raw HTML string\n * @returns {string} Formatted HTML\n */\n formatHtml: function (html) {\n // Remove leading/trailing whitespace\n html = html.trim();\n\n // Simple formatting: normalize whitespace\n // Split by tags, then rejoin with proper indentation\n const lines = html.split('\\n');\n let indent = 0;\n const indentSize = 2;\n const formattedLines = [];\n\n lines.forEach(line => {\n line = line.trim();\n if (!line) return;\n\n // Check for closing tags at start\n if (line.match(/^<\\/\\w/)) {\n indent = Math.max(0, indent - indentSize);\n }\n\n formattedLines.push(' '.repeat(indent) + line);\n\n // Check for opening tags (not self-closing)\n // Use short fixed-length regex + indexOf to prevent ReDoS\n const hasOpenTag = /<[a-zA-Z]/.test(line);\n const isSelfClosing = line.includes('/>');\n if (hasOpenTag && !isSelfClosing) {\n // Don't indent for void elements\n if (!line.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)) {\n // Only indent if not also closing on same line\n if (!line.match(/<\\/\\w+>$/)) {\n indent += indentSize;\n }\n }\n }\n });\n\n return formattedLines.join('\\n');\n },\n\n /**\n * Escape HTML entities for display\n * @param {string} html - HTML string\n * @returns {string} Escaped HTML\n */\n escapeHtml: function (html) {\n const div = document.createElement('div');\n div.textContent = html;\n return div.innerHTML;\n },\n\n needsHighlighting: function (pane, codeEl) {\n if (!codeEl) return false;\n if (pane.dataset.highlighted === 'true') return false;\n if (codeEl.querySelector('[class^=\"code-\"], [class*=\" code-\"]')) return false;\n return true;\n },\n\n getHighlightMode: function (lang) {\n const normalized = String(lang || '').trim().toLowerCase();\n\n if ([\n 'html',\n 'xml',\n 'svg',\n 'vue',\n 'svelte',\n 'astro'\n ].includes(normalized)) {\n return 'html';\n }\n\n if ([\n 'css',\n 'scss',\n 'sass',\n 'less'\n ].includes(normalized)) {\n return 'css';\n }\n\n if ([\n 'js',\n 'mjs',\n 'cjs',\n 'ts',\n 'jsx',\n 'tsx',\n 'json',\n 'bash',\n 'sh'\n ].includes(normalized)) {\n return 'js';\n }\n\n return 'plain';\n },\n\n highlightCodeByLang: function (rawCode, lang) {\n const escaped = this.escapeHtml(rawCode);\n const mode = this.getHighlightMode(lang);\n\n if (mode === 'html') {\n return this.highlightHtml(escaped);\n }\n\n if (mode === 'css') {\n return this.highlightCss(escaped);\n }\n\n if (mode === 'js') {\n return this.highlightJs(escaped);\n }\n\n return escaped;\n },\n\n applyPaneHighlighting: function (pane) {\n if (!pane) return;\n\n const codeEl = pane.querySelector('code') || pane;\n if (!this.needsHighlighting(pane, codeEl)) {\n pane.dataset.highlighted = 'true';\n return;\n }\n\n const rawCode = codeEl.textContent || '';\n const highlighted = this.highlightCodeByLang(rawCode, pane.dataset.lang);\n const nextCodeEl = codeEl.tagName === 'CODE' ? codeEl : document.createElement('code');\n\n nextCodeEl.innerHTML = highlighted;\n\n if (nextCodeEl !== codeEl) {\n pane.replaceChildren(nextCodeEl);\n }\n\n pane.dataset.highlighted = 'true';\n },\n\n /**\n * Apply syntax highlighting to HTML\n * @param {string} html - Escaped HTML string\n * @returns {string} HTML with syntax highlighting spans\n */\n highlightHtml: function (html) {\n // Highlight HTML tags\n html = html.replace(/(&lt;\\/?)([\\w-]+)/g, '$1<span class=\"code-tag\">$2</span>');\n\n // Highlight attributes\n html = html.replace(/([\\w-]+)(=)([\"'])/g, '<span class=\"code-attr\">$1</span>$2$3');\n html = html.replace(/([\\w-]+)(=)(&quot;|&#39;)/g, '<span class=\"code-attr\">$1</span>$2$3');\n\n // Highlight attribute values (strings)\n html = html.replace(/([\"'])([^\"']*)([\"'])/g, '$1<span class=\"code-string\">$2</span>$3');\n html = html.replace(/(&quot;|&#39;)([^&]*)(&quot;|&#39;)/g, '$1<span class=\"code-string\">$2</span>$3');\n\n // Highlight comments\n html = html.replace(/(&lt;!--)(.*?)(--&gt;)/g, '<span class=\"code-comment\">$1$2$3</span>');\n\n return html;\n },\n\n /**\n * Apply syntax highlighting to CSS\n * @param {string} css - CSS string\n * @returns {string} CSS with syntax highlighting spans\n */\n highlightCss: function (css) {\n // Highlight selectors \u2014 use non-backtracking bounded pattern\n css = css.replace(/([.#]?[a-zA-Z][a-zA-Z0-9_-]{0,200})(\\s*\\{)/g, '<span class=\"code-selector\">$1</span>$2');\n\n // Highlight properties \u2014 use non-backtracking bounded pattern\n css = css.replace(/([a-zA-Z][a-zA-Z0-9_-]{0,200})(\\s*:)/g, '<span class=\"code-property\">$1</span>$2');\n\n // Highlight values\n css = css.replace(/:\\s*([^;{}]+)(;)/g, ': <span class=\"code-value\">$1</span>$2');\n\n // Highlight units\n css = css.replace(/(\\d+)(px|rem|em|%|vh|vw|deg|s|ms)/g, '<span class=\"code-number\">$1</span><span class=\"code-unit\">$2</span>');\n\n // Highlight comments\n css = css.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"code-comment\">$1</span>');\n\n return css;\n },\n\n /**\n * Apply syntax highlighting to JavaScript\n * @param {string} js - JavaScript string\n * @returns {string} JS with syntax highlighting spans\n */\n highlightJs: function (js) {\n // Highlight keywords\n const keywords = ['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'];\n keywords.forEach(kw => {\n const regex = new RegExp(`\\\\b(${kw})\\\\b`, 'g');\n js = js.replace(regex, '<span class=\"code-keyword\">$1</span>');\n });\n\n // Highlight strings (limit to 10 000 chars to prevent polynomial backtracking)\n js = js.replace(/('(?:[^'\\\\]|\\\\.){0,10000}'|\"(?:[^\"\\\\]|\\\\.){0,10000}\"|`(?:[^`\\\\]|\\\\.){0,10000}`)/g, '<span class=\"code-string\">$1</span>');\n\n // Highlight numbers\n js = js.replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"code-number\">$1</span>');\n\n // Highlight function calls\n js = js.replace(/\\b([\\w]+)(\\s*\\()/g, '<span class=\"code-function\">$1</span>$2');\n\n // Highlight comments\n js = js.replace(/(\\/\\/.*$)/gm, '<span class=\"code-comment\">$1</span>');\n js = js.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"code-comment\">$1</span>');\n\n return js;\n },\n\n /**\n * Add line numbers to a code pane\n * @param {HTMLElement} pane - Code pane element\n */\n addLineNumbers: function (pane) {\n const code = pane.querySelector('code');\n if (!code) return;\n\n const lines = code.innerHTML.split('\\n');\n const lineCount = lines.length;\n\n // Create line numbers container\n const lineNumbers = document.createElement('div');\n lineNumbers.className = 'vd-code-snippet-line-numbers';\n lineNumbers.setAttribute('aria-hidden', 'true');\n\n for (let i = 1; i <= lineCount; i++) {\n const lineNum = document.createElement('span');\n lineNum.textContent = i;\n lineNumbers.appendChild(lineNum);\n }\n\n // Wrap code content\n const codeWrapper = document.createElement('div');\n codeWrapper.className = 'vd-code-snippet-code';\n codeWrapper.appendChild(code.cloneNode(true));\n\n // Replace code with new structure\n code.parentNode.removeChild(code);\n pane.appendChild(lineNumbers);\n pane.appendChild(codeWrapper);\n },\n\n /**\n * Programmatically expand a code snippet\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n expand: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n snippet.dataset.expanded = 'true';\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle) toggle.setAttribute('aria-expanded', 'true');\n if (content) content.dataset.visible = 'true';\n },\n\n /**\n * Programmatically collapse a code snippet\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n collapse: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n snippet.dataset.expanded = 'false';\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle) toggle.setAttribute('aria-expanded', 'false');\n if (content) content.dataset.visible = 'false';\n },\n\n /**\n * Programmatically switch to a specific language tab\n * @param {string|HTMLElement} snippet - Snippet selector or element\n * @param {string} lang - Language to switch to (html, css, js)\n */\n showLang: function (snippet, lang) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n const tab = snippet.querySelector(`.vd-code-snippet-tab[data-lang=\"${lang}\"]`);\n const tabs = snippet.querySelectorAll('.vd-code-snippet-tab');\n const panes = snippet.querySelectorAll('.vd-code-snippet-pane');\n\n if (tab) {\n this.switchTab(snippet, tab, tabs, panes);\n }\n },\n\n /**\n * Destroy a code snippet instance and clean up listeners\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n destroy: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n if (snippet._codeSnippetCleanup) {\n snippet._codeSnippetCleanup.forEach(fn => fn());\n delete snippet._codeSnippetCleanup;\n }\n\n delete snippet.dataset.initialized;\n },\n\n /**\n * Destroy all code snippet instances\n */\n destroyAll: function (root) {\n const scope = this.resolveRoot(root);\n const snippets = this.queryWithin(scope, '.vd-code-snippet[data-initialized=\"true\"]');\n snippets.forEach(snippet => {\n this.destroy(snippet);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('codeSnippet', CodeSnippet);\n }\n\n // Also expose globally for convenience\n window.CodeSnippet = CodeSnippet;\n\n})();\n", "/**\n * Vanduo Framework - Collapsible Component\n * JavaScript functionality for collapsible/accordion components\n */\n\n(function() {\n 'use strict';\n\n /**\n * Collapsible Component\n */\n const Collapsible = {\n // Store initialized containers and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize collapsible components\n */\n init: function(root) {\n const collapsibles = window.Vanduo.queryAll(root, '.vd-collapsible, .accordion');\n\n collapsibles.forEach(container => {\n if (this.instances.has(container)) {\n return;\n }\n this.initCollapsible(container);\n });\n },\n\n /**\n * Initialize a collapsible container\n * @param {HTMLElement} container - Collapsible container\n */\n initCollapsible: function(container) {\n const isAccordion = container.classList.contains('accordion');\n const items = container.querySelectorAll('.vd-collapsible-item, .accordion-item');\n const cleanupFunctions = [];\n\n items.forEach(item => {\n const header = item.querySelector('.vd-collapsible-header, .accordion-header');\n const body = item.querySelector('.vd-collapsible-body, .accordion-body');\n const trigger = item.querySelector('.vd-collapsible-trigger, .accordion-trigger') || header;\n\n if (!header || !body) {\n return;\n }\n\n // Set initial state\n if (item.classList.contains('is-open')) {\n this.openItem(item, body, false);\n } else {\n this.closeItem(item, body, false);\n }\n\n // Add click handler\n const clickHandler = (e) => {\n e.preventDefault();\n this.toggleItem(item, body, container, isAccordion);\n };\n trigger.addEventListener('click', clickHandler);\n cleanupFunctions.push(() => trigger.removeEventListener('click', clickHandler));\n });\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n \n /**\n * Toggle collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {HTMLElement} container - Collapsible container\n * @param {boolean} isAccordion - Whether in accordion mode\n */\n toggleItem: function(item, body, container, isAccordion) {\n const isOpen = item.classList.contains('is-open');\n \n if (isOpen) {\n this.closeItem(item, body);\n } else {\n // If accordion mode, close other open items\n if (isAccordion) {\n const otherOpenItems = container.querySelectorAll('.vd-collapsible-item.is-open, .accordion-item.is-open');\n otherOpenItems.forEach(otherItem => {\n if (otherItem !== item) {\n const otherBody = otherItem.querySelector('.vd-collapsible-body, .accordion-body');\n this.closeItem(otherItem, otherBody);\n }\n });\n }\n \n this.openItem(item, body);\n }\n },\n \n /**\n * Open collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {boolean} animate - Whether to animate\n */\n openItem: function(item, body, animate = true) {\n if (!animate) {\n body.style.transition = 'none';\n }\n \n item.classList.add('is-open');\n item.setAttribute('aria-expanded', 'true');\n \n // Set max-height to actual height\n const height = body.scrollHeight;\n body.style.maxHeight = `${height}px`;\n \n // Reset transition after a brief delay\n if (!animate) {\n setTimeout(() => {\n body.style.transition = '';\n }, 0);\n }\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('collapsible:open', { bubbles: true }));\n },\n \n /**\n * Close collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {boolean} animate - Whether to animate\n */\n closeItem: function(item, body, animate = true) {\n if (!animate) {\n body.style.transition = 'none';\n }\n \n item.classList.remove('is-open');\n item.setAttribute('aria-expanded', 'false');\n body.style.maxHeight = '0';\n \n // Reset transition after a brief delay\n if (!animate) {\n setTimeout(() => {\n body.style.transition = '';\n }, 0);\n }\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('collapsible:close', { bubbles: true }));\n },\n \n /**\n * Open item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n open: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n if (body) {\n this.openItem(el, body);\n }\n }\n },\n \n /**\n * Close item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n close: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n if (body) {\n this.closeItem(el, body);\n }\n }\n },\n \n /**\n * Toggle item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n toggle: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n const container = el.closest('.vd-collapsible, .accordion');\n const isAccordion = container && container.classList.contains('accordion');\n\n if (body) {\n this.toggleItem(el, body, container, isAccordion);\n }\n }\n },\n\n /**\n * Destroy a collapsible instance and clean up event listeners\n * @param {HTMLElement} container - Collapsible container\n */\n destroy: function(container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(container);\n },\n\n /**\n * Destroy all collapsible instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, container) => {\n this.destroy(container);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('collapsible', Collapsible);\n }\n \n // Expose globally\n window.VanduoCollapsible = Collapsible;\n \n})();\n", "/**\n * Vanduo Framework - Dropdown Component\n * JavaScript functionality for dropdown menus\n */\n\n(function() {\n 'use strict';\n\n /**\n * Dropdown Component\n */\n const Dropdown = {\n // Store initialized dropdowns and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize dropdown components\n */\n init: function(root) {\n const dropdowns = window.Vanduo.queryAll(root, '.vd-dropdown');\n\n dropdowns.forEach(dropdown => {\n if (this.instances.has(dropdown)) {\n return;\n }\n this.initDropdown(dropdown);\n });\n },\n\n /**\n * Initialize a single dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n */\n initDropdown: function(dropdown) {\n const toggle = dropdown.querySelector('.vd-dropdown-toggle');\n const menu = dropdown.querySelector('.vd-dropdown-menu');\n\n if (!toggle || !menu) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n toggle.setAttribute('aria-haspopup', 'true');\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('role', 'menu');\n menu.setAttribute('aria-hidden', 'true');\n\n // Toggle on click\n const toggleClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleDropdown(dropdown, toggle, menu);\n };\n toggle.addEventListener('click', toggleClickHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('click', toggleClickHandler));\n\n // Close on outside click\n const documentClickHandler = (e) => {\n if (!dropdown.contains(e.target) && menu.classList.contains('is-open')) {\n this.closeDropdown(dropdown, toggle, menu);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, dropdown, toggle, menu);\n };\n toggle.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('keydown', keydownHandler));\n\n // Handle item clicks\n const items = menu.querySelectorAll('.vd-dropdown-item:not(.disabled):not(.is-disabled)');\n items.forEach(item => {\n const itemClickHandler = (e) => {\n e.preventDefault();\n this.selectItem(item, dropdown, toggle, menu);\n };\n item.addEventListener('click', itemClickHandler);\n cleanupFunctions.push(() => item.removeEventListener('click', itemClickHandler));\n\n const itemKeydownHandler = (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.selectItem(item, dropdown, toggle, menu);\n }\n };\n item.addEventListener('keydown', itemKeydownHandler);\n cleanupFunctions.push(() => item.removeEventListener('keydown', itemKeydownHandler));\n });\n\n this.instances.set(dropdown, { toggle, menu, cleanup: cleanupFunctions, typeaheadBuffer: '', typeaheadTimer: null });\n },\n \n /**\n * Toggle dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n toggleDropdown: function(dropdown, toggle, menu) {\n const isOpen = menu.classList.contains('is-open');\n \n if (isOpen) {\n this.closeDropdown(dropdown, toggle, menu);\n } else {\n this.openDropdown(dropdown, toggle, menu);\n }\n },\n \n /**\n * Open dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n openDropdown: function(dropdown, toggle, menu) {\n // Close other open dropdowns\n const otherOpen = document.querySelectorAll('.vd-dropdown-menu.is-open');\n otherOpen.forEach(otherMenu => {\n if (otherMenu !== menu) {\n const otherDropdown = otherMenu.closest('.vd-dropdown');\n const otherToggle = otherDropdown.querySelector('.vd-dropdown-toggle');\n this.closeDropdown(otherDropdown, otherToggle, otherMenu);\n }\n });\n \n dropdown.classList.add('is-open');\n menu.classList.add('is-open');\n toggle.setAttribute('aria-expanded', 'true');\n menu.setAttribute('aria-hidden', 'false');\n \n // Position menu\n this.positionMenu(dropdown, menu);\n \n // Focus first item\n const firstItem = menu.querySelector('.vd-dropdown-item:not(.disabled):not(.is-disabled)');\n if (firstItem) {\n setTimeout(() => firstItem.focus(), 0);\n }\n },\n \n /**\n * Close dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n closeDropdown: function(dropdown, toggle, menu) {\n dropdown.classList.remove('is-open');\n menu.classList.remove('is-open');\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('aria-hidden', 'true');\n \n // Return focus to toggle\n toggle.focus();\n },\n \n /**\n * Position dropdown menu\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} menu - Dropdown menu\n */\n positionMenu: function(dropdown, menu) {\n const rect = dropdown.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n // Reset auto-position classes before computing a new state.\n menu.classList.remove('vd-dropdown-menu-end', 'vd-dropdown-menu-start', 'vd-dropdown-menu-top');\n\n // Directional wrappers explicitly control placement in CSS.\n if (dropdown.classList.contains('vd-dropdown-dropup')) {\n menu.classList.add('vd-dropdown-menu-top');\n return;\n }\n\n if (dropdown.classList.contains('vd-dropdown-dropright') || dropdown.classList.contains('vd-dropdown-dropleft')) {\n return;\n }\n\n // Check if menu overflows right.\n if (rect.left + menuRect.width > viewportWidth - padding) {\n menu.classList.add('vd-dropdown-menu-end');\n } else {\n menu.classList.add('vd-dropdown-menu-start');\n }\n\n // Flip above trigger when there is not enough room below.\n if (rect.bottom + menuRect.height > viewportHeight - padding && rect.top - menuRect.height > padding) {\n menu.classList.add('vd-dropdown-menu-top');\n }\n },\n \n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n handleKeydown: function(e, dropdown, toggle, menu) {\n const isOpen = menu.classList.contains('is-open');\n const items = Array.from(menu.querySelectorAll('.vd-dropdown-item:not(.disabled):not(.is-disabled)'));\n const currentIndex = items.findIndex(item => item === document.activeElement);\n \n switch (e.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n this.openDropdown(dropdown, toggle, menu);\n } else if (e.key === 'ArrowDown') {\n const nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n items[nextIndex].focus();\n }\n break;\n \n case 'ArrowUp':\n if (isOpen) {\n e.preventDefault();\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n items[prevIndex].focus();\n }\n break;\n \n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n this.closeDropdown(dropdown, toggle, menu);\n }\n break;\n \n case 'Home':\n if (isOpen) {\n e.preventDefault();\n items[0].focus();\n }\n break;\n \n case 'End':\n if (isOpen) {\n e.preventDefault();\n items[items.length - 1].focus();\n }\n break;\n\n default:\n // Typeahead: jump to matching item when typing printable characters\n if (isOpen && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n // Per-instance typeahead state to avoid cross-instance corruption\n const instance = this.instances.get(dropdown);\n if (!instance) break;\n clearTimeout(instance.typeaheadTimer);\n instance.typeaheadBuffer += e.key.toLowerCase();\n\n const match = items.find(item =>\n item.textContent.trim().toLowerCase().startsWith(instance.typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n instance.typeaheadTimer = setTimeout(() => {\n instance.typeaheadBuffer = '';\n }, 500);\n }\n break;\n }\n },\n \n /**\n * Select dropdown item\n * @param {HTMLElement} item - Dropdown item\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n selectItem: function(item, dropdown, toggle, menu) {\n // Remove active from all items\n menu.querySelectorAll('.vd-dropdown-item').forEach(i => {\n i.classList.remove('active', 'is-active');\n });\n \n // Add active to selected item\n item.classList.add('active', 'is-active');\n \n // Update toggle text if it's a button\n if (toggle.tagName === 'BUTTON' || toggle.classList.contains('btn')) {\n toggle.textContent = item.textContent.trim();\n }\n \n // Close dropdown\n this.closeDropdown(dropdown, toggle, menu);\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('dropdown:select', { \n bubbles: true,\n detail: { item, value: item.dataset.value || item.textContent }\n }));\n },\n \n /**\n * Open dropdown programmatically\n * @param {HTMLElement|string} dropdown - Dropdown container or selector\n */\n open: function(dropdown) {\n const el = typeof dropdown === 'string' ? document.querySelector(dropdown) : dropdown;\n if (el) {\n const toggle = el.querySelector('.vd-dropdown-toggle');\n const menu = el.querySelector('.vd-dropdown-menu');\n if (toggle && menu) {\n this.openDropdown(el, toggle, menu);\n }\n }\n },\n \n /**\n * Close dropdown programmatically\n * @param {HTMLElement|string} dropdown - Dropdown container or selector\n */\n close: function(dropdown) {\n const el = typeof dropdown === 'string' ? document.querySelector(dropdown) : dropdown;\n if (el) {\n const toggle = el.querySelector('.vd-dropdown-toggle');\n const menu = el.querySelector('.vd-dropdown-menu');\n if (toggle && menu) {\n this.closeDropdown(el, toggle, menu);\n }\n }\n },\n\n /**\n * Destroy a dropdown instance and clean up event listeners\n * @param {HTMLElement} dropdown - Dropdown element\n */\n destroy: function(dropdown) {\n const instance = this.instances.get(dropdown);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(dropdown);\n },\n\n /**\n * Destroy all dropdown instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, dropdown) => {\n this.destroy(dropdown);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('dropdown', Dropdown);\n }\n \n // Expose globally\n window.VanduoDropdown = Dropdown;\n \n})();\n", "/**\n * Vanduo Framework - Font Switcher\n * Handles font selection and persistence for previewing different typefaces\n */\n\n(function() {\n 'use strict';\n\n const FontSwitcher = {\n STORAGE_KEY: 'vanduo-font-preference',\n isInitialized: false,\n\n // Available fonts configuration\n fonts: {\n 'system': {\n name: 'System Default',\n family: null // Uses CSS default\n },\n 'jetbrains-mono': {\n name: 'JetBrains Mono',\n family: \"'JetBrains Mono', monospace\"\n },\n 'ubuntu': {\n name: 'Ubuntu',\n family: \"'Ubuntu', sans-serif\",\n category: 'sans-serif',\n description: 'Friendly, humanist sans-serif'\n },\n 'open-sans': {\n name: 'Open Sans',\n family: \"'Open Sans', sans-serif\",\n category: 'sans-serif',\n description: 'Neutral, highly readable'\n },\n 'lato': {\n name: 'Lato',\n family: \"'Lato', sans-serif\",\n category: 'sans-serif',\n description: 'Friendly, rounded sans-serif'\n }\n },\n\n getToggles: function(root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-toggle=\"font\"]');\n }\n\n return Array.from(document.querySelectorAll('[data-toggle=\"font\"]'));\n },\n\n init: function(root) {\n this.state = {\n preference: this.getPreference()\n };\n if (!this.fonts[this.state.preference]) {\n this.state.preference = 'ubuntu';\n this.setStorageValue(this.STORAGE_KEY, this.state.preference);\n }\n\n if (this.isInitialized) {\n this.applyFont();\n this.renderUI(root);\n this.updateUI(root);\n return;\n }\n\n this.isInitialized = true;\n\n this.applyFont();\n this.renderUI(root);\n },\n\n /**\n * Get saved font preference from localStorage\n * @returns {string} Font key or 'ubuntu' (default)\n */\n getPreference: function() {\n return this.getStorageValue(this.STORAGE_KEY, 'ubuntu');\n },\n\n /**\n * Set font preference and apply it\n * @param {string} fontKey - The font key to apply\n */\n setPreference: function(fontKey) {\n if (!this.fonts[fontKey]) {\n console.warn('Unknown font:', fontKey);\n return;\n }\n\n this.state.preference = fontKey;\n this.setStorageValue(this.STORAGE_KEY, fontKey);\n this.applyFont();\n this.updateUI();\n\n // Dispatch custom event for other components to listen to\n const event = new CustomEvent('font:change', {\n bubbles: true,\n detail: { font: fontKey, fontData: this.fonts[fontKey] }\n });\n document.dispatchEvent(event);\n },\n\n /**\n * Apply the current font preference to the document\n */\n applyFont: function() {\n const fontKey = this.state.preference;\n\n if (fontKey === 'system') {\n // Remove data-font attribute to use system default\n document.documentElement.removeAttribute('data-font');\n } else {\n // Set data-font attribute which triggers CSS variable override\n document.documentElement.setAttribute('data-font', fontKey);\n }\n },\n\n /**\n * Initialize UI elements with data-toggle=\"font\"\n */\n renderUI: function(root) {\n const toggles = this.getToggles(root);\n\n toggles.forEach(toggle => {\n if (toggle.getAttribute('data-font-initialized') === 'true') {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n }\n return;\n }\n\n if (toggle.tagName === 'SELECT') {\n // Set initial value\n toggle.value = this.state.preference;\n\n // Listen for changes\n const onChange = (e) => {\n this.setPreference(e.target.value);\n };\n toggle.addEventListener('change', onChange);\n toggle._fontToggleHandler = onChange;\n } else {\n // Button implementation - cycle through fonts\n const onClick = () => {\n const fontKeys = Object.keys(this.fonts);\n const currentIndex = fontKeys.indexOf(this.state.preference);\n const nextIndex = (currentIndex + 1) % fontKeys.length;\n this.setPreference(fontKeys[nextIndex]);\n };\n toggle.addEventListener('click', onClick);\n toggle._fontToggleHandler = onClick;\n }\n\n toggle.setAttribute('data-font-initialized', 'true');\n });\n },\n\n /**\n * Update all UI elements to reflect current state\n */\n updateUI: function(root) {\n const toggles = this.getToggles(root);\n\n toggles.forEach(toggle => {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n } else {\n // Update button text if it has a label span\n const label = toggle.querySelector('.font-current-label');\n if (label) {\n label.textContent = this.fonts[this.state.preference].name;\n }\n }\n });\n },\n\n /**\n * Get the current font preference\n * @returns {string} Current font key\n */\n getCurrentFont: function() {\n return this.state.preference;\n },\n\n /**\n * Get font data for a given key\n * @param {string} fontKey - The font key\n * @returns {Object|null} Font data or null\n */\n getFontData: function(fontKey) {\n return this.fonts[fontKey] || null;\n },\n\n destroyAll: function(root) {\n const toggles = this.getToggles(root || document).filter(function(toggle) {\n return toggle.getAttribute('data-font-initialized') === 'true';\n });\n toggles.forEach(toggle => {\n if (toggle._fontToggleHandler) {\n const eventName = toggle.tagName === 'SELECT' ? 'change' : 'click';\n toggle.removeEventListener(eventName, toggle._fontToggleHandler);\n delete toggle._fontToggleHandler;\n }\n toggle.removeAttribute('data-font-initialized');\n });\n\n if (!root || root === document) {\n this.isInitialized = false;\n }\n },\n\n getStorageValue: function(key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function(key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('fontSwitcher', FontSwitcher);\n }\n\n // Expose globally for convenience\n window.FontSwitcher = FontSwitcher;\n})();\n", "/**\n * Vanduo Framework - Grid Layout Component\n * Toggle between standard 12-column and Fibonacci grid modes\n * via data-layout-mode attribute and toggle buttons\n */\n\n(function () {\n 'use strict';\n\n const supportsHas = (function () {\n try {\n return CSS.supports('selector(:has(*))');\n } catch (_e) {\n return false;\n }\n })();\n\n /**\n * Grid Layout Component\n */\n const GridLayout = {\n instances: new Map(),\n __vanduoScopedDestroyAll: true,\n\n /**\n * Initialize all grid layout containers\n */\n init: function (root) {\n const containers = window.Vanduo.queryAll(root, '[data-layout-mode]');\n\n containers.forEach(function (container) {\n if (this.instances.has(container)) {\n return;\n }\n this.initContainer(container);\n }.bind(this));\n\n this.initToggleButtons(root);\n },\n\n /**\n * Initialize a single grid container\n * @param {HTMLElement} container - Element with data-layout-mode\n */\n initContainer: function (container) {\n const mode = container.getAttribute('data-layout-mode') || 'standard';\n const cleanupFunctions = [];\n\n this.applyMode(container, mode);\n\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Grid layout: ' + mode + ' mode');\n\n this.instances.set(container, {\n cleanup: cleanupFunctions,\n mode: mode\n });\n },\n\n /**\n * Initialize toggle buttons that target grid containers\n */\n initToggleButtons: function (root) {\n const toggleButtons = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-grid-toggle]')\n : document.querySelectorAll('[data-grid-toggle]');\n\n toggleButtons.forEach(function (button) {\n if (button.getAttribute('data-grid-initialized') === 'true') {\n return;\n }\n\n const clickHandler = function (e) {\n e.preventDefault();\n const targetSelector = button.getAttribute('data-grid-toggle');\n let target;\n\n if (targetSelector) {\n target = document.querySelector(targetSelector);\n } else {\n target = button.closest('[data-layout-mode]');\n }\n\n if (target) {\n this.toggle(target);\n }\n }.bind(this);\n\n button.addEventListener('click', clickHandler);\n button.setAttribute('data-grid-initialized', 'true');\n button.setAttribute('aria-pressed', 'false');\n\n button._gridCleanup = function () {\n button.removeEventListener('click', clickHandler);\n button.removeAttribute('data-grid-initialized');\n button.removeAttribute('aria-pressed');\n };\n }.bind(this));\n },\n\n /**\n * Apply Fibonacci grid-template-columns inline for browsers without :has()\n * @param {HTMLElement} container - Grid container\n */\n applyFibFallback: function (container) {\n if (supportsHas) return;\n\n const rows = container.querySelectorAll('.vd-row, .row');\n rows.forEach(function (row) {\n const cols = row.querySelectorAll(':scope > [class*=\"vd-col-\"], :scope > [class*=\"col-\"]');\n const count = cols.length;\n\n if (count === 1) {\n row.style.gridTemplateColumns = '1fr';\n } else if (count === 2) {\n row.style.gridTemplateColumns = '1fr 1.618fr';\n } else if (count === 3) {\n row.style.gridTemplateColumns = '2fr 3fr 5fr';\n } else if (count === 4) {\n row.style.gridTemplateColumns = '1fr 2fr 3fr 5fr';\n } else {\n row.style.gridTemplateColumns = 'repeat(' + count + ', 1fr)';\n }\n });\n },\n\n /**\n * Remove inline grid-template-columns fallback\n * @param {HTMLElement} container - Grid container\n */\n removeFibFallback: function (container) {\n const rows = container.querySelectorAll('.vd-row, .row');\n rows.forEach(function (row) {\n row.style.gridTemplateColumns = '';\n });\n },\n\n /**\n * Apply a layout mode to a container\n * @param {HTMLElement} container - Target container\n * @param {string} mode - 'fibonacci' or 'standard'\n */\n applyMode: function (container, mode) {\n container.classList.remove('vd-grid-standard', 'vd-grid-fibonacci');\n\n if (mode === 'fibonacci') {\n container.classList.add('vd-grid-fibonacci');\n this.applyFibFallback(container);\n } else {\n container.classList.add('vd-grid-standard');\n this.removeFibFallback(container);\n }\n\n container.setAttribute('data-layout-mode', mode);\n container.setAttribute('aria-label', 'Grid layout: ' + mode + ' mode');\n\n // Update associated toggle button states\n const toggleButtons = document.querySelectorAll('[data-grid-toggle]');\n toggleButtons.forEach(function (btn) {\n const targetSelector = btn.getAttribute('data-grid-toggle');\n if (targetSelector && container.matches(targetSelector)) {\n const isActive = (mode === 'fibonacci');\n if (isActive) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n btn.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n }\n });\n\n // Store mode in instance\n const instance = this.instances.get(container);\n if (instance) {\n instance.mode = mode;\n }\n\n // Dispatch custom event\n let event;\n try {\n event = new CustomEvent('grid:modechange', {\n bubbles: true,\n detail: {\n container: container,\n mode: mode\n }\n });\n } catch (_e) {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('grid:modechange', true, true, {\n container: container,\n mode: mode\n });\n }\n container.dispatchEvent(event);\n },\n\n /**\n * Toggle between standard and fibonacci modes\n * @param {HTMLElement|string} container - Container element or selector\n */\n toggle: function (container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return;\n\n const currentMode = container.getAttribute('data-layout-mode') || 'standard';\n const newMode = (currentMode === 'fibonacci') ? 'standard' : 'fibonacci';\n this.applyMode(container, newMode);\n },\n\n /**\n * Set a specific mode\n * @param {HTMLElement|string} container - Container element or selector\n * @param {string} mode - 'fibonacci' or 'standard'\n */\n setMode: function (container, mode) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return;\n if (mode !== 'fibonacci' && mode !== 'standard') return;\n\n this.applyMode(container, mode);\n },\n\n /**\n * Get the current mode of a container\n * @param {HTMLElement|string} container - Container element or selector\n * @returns {string|null} Current mode or null\n */\n getMode: function (container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return null;\n return container.getAttribute('data-layout-mode') || 'standard';\n },\n\n /**\n * Destroy a single grid layout instance\n * @param {HTMLElement} container - Grid container\n */\n destroy: function (container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(function (fn) { fn(); });\n container.classList.remove('vd-grid-standard', 'vd-grid-fibonacci');\n container.removeAttribute('aria-label');\n this.removeFibFallback(container);\n this.instances.delete(container);\n },\n\n /**\n * Destroy all grid layout instances and clean up toggle buttons\n */\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.instances.forEach(function (instance, container) {\n if (scope === document || scope === container || (typeof scope.contains === 'function' && scope.contains(container))) {\n this.destroy(container);\n }\n }.bind(this));\n\n const toggleButtons = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-grid-toggle][data-grid-initialized=\"true\"]')\n : document.querySelectorAll('[data-grid-initialized=\"true\"]');\n toggleButtons.forEach(function (button) {\n if (button._gridCleanup) {\n button._gridCleanup();\n delete button._gridCleanup;\n }\n });\n }\n };\n\n // Register with Vanduo framework\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('gridLayout', GridLayout);\n }\n\n // Expose globally\n window.VanduoGridLayout = GridLayout;\n\n})();\n", "/**\n * Vanduo Framework - Image Box Component\n * Lightbox-style image enlargement with smooth transitions\n * \n * Features:\n * - Click to enlarge images with data-image-box attribute\n * - Smooth scale and opacity transitions\n * - Dismiss via click, ESC key, or scroll\n * - Magnifying glass cursor on hover\n * - Accessible with ARIA attributes\n * - Reduced motion support\n */\n\n(function () {\n 'use strict';\n\n /**\n * Image Box Component\n */\n const ImageBox = {\n backdrop: null,\n container: null,\n img: null,\n closeBtn: null,\n caption: null,\n currentTrigger: null,\n scrollThreshold: 50,\n initialScrollY: 0,\n isOpen: false,\n\n // Store cleanup functions for event listeners\n _cleanupFunctions: [],\n\n getTriggers: function (root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-image-box]');\n }\n\n return Array.from(document.querySelectorAll('[data-image-box]'));\n },\n\n /**\n * Initialize Image Box component\n */\n init: function (root) {\n this.createBackdrop();\n this.bindTriggers(root);\n },\n\n /**\n * Create backdrop elements\n */\n createBackdrop: function () {\n // Prevent duplicate backdrop creation\n if (this.backdrop || document.querySelector('.vd-image-box-backdrop')) {\n // If backdrop already exists in DOM, reuse it\n if (!this.backdrop) {\n this.backdrop = document.querySelector('.vd-image-box-backdrop');\n this.container = this.backdrop.querySelector('.vd-image-box-container');\n this.img = this.backdrop.querySelector('.vd-image-box-img');\n this.closeBtn = this.backdrop.querySelector('.vd-image-box-close');\n this.caption = this.backdrop.querySelector('.vd-image-box-caption');\n this.bindBackdropEvents();\n }\n return;\n }\n\n // Create backdrop\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'vd-image-box-backdrop';\n this.backdrop.setAttribute('role', 'dialog');\n this.backdrop.setAttribute('aria-modal', 'true');\n this.backdrop.setAttribute('aria-label', 'Image viewer');\n this.backdrop.setAttribute('tabindex', '-1');\n\n // Create container\n this.container = document.createElement('div');\n this.container.className = 'vd-image-box-container';\n\n // Create image\n this.img = document.createElement('img');\n this.img.className = 'vd-image-box-img';\n this.img.alt = '';\n\n // Create close button\n this.closeBtn = document.createElement('button');\n this.closeBtn.className = 'vd-image-box-close';\n this.closeBtn.setAttribute('aria-label', 'Close image viewer');\n this.closeBtn.innerHTML = '&times;';\n\n // Create caption element\n this.caption = document.createElement('div');\n this.caption.className = 'vd-image-box-caption';\n\n // Assemble\n this.container.appendChild(this.img);\n this.backdrop.appendChild(this.closeBtn);\n this.backdrop.appendChild(this.container);\n this.backdrop.appendChild(this.caption);\n document.body.appendChild(this.backdrop);\n\n // Bind backdrop events\n this.bindBackdropEvents();\n },\n\n /**\n * Bind events to backdrop elements\n */\n bindBackdropEvents: function () {\n const self = this;\n\n // Close on backdrop click (but not when clicking the image)\n const backdropClickHandler = function (e) {\n if (e.target === self.backdrop || e.target === self.container) {\n self.close();\n }\n };\n this.backdrop.addEventListener('click', backdropClickHandler);\n this._cleanupFunctions.push(() => this.backdrop.removeEventListener('click', backdropClickHandler));\n\n // Close on image click\n const imgClickHandler = function () {\n self.close();\n };\n this.img.addEventListener('click', imgClickHandler);\n this._cleanupFunctions.push(() => this.img.removeEventListener('click', imgClickHandler));\n\n // Close on close button click\n const closeBtnHandler = function () {\n self.close();\n };\n this.closeBtn.addEventListener('click', closeBtnHandler);\n this._cleanupFunctions.push(() => this.closeBtn.removeEventListener('click', closeBtnHandler));\n\n // ESC key handler\n const escHandler = function (e) {\n if (e.key === 'Escape' && self.isOpen) {\n self.close();\n }\n };\n document.addEventListener('keydown', escHandler);\n this._cleanupFunctions.push(() => document.removeEventListener('keydown', escHandler));\n\n // Scroll handler for dismissal\n const scrollHandler = function () {\n if (!self.isOpen) return;\n\n const currentScrollY = window.scrollY;\n const scrollDelta = Math.abs(currentScrollY - self.initialScrollY);\n\n if (scrollDelta > self.scrollThreshold) {\n self.close();\n }\n };\n window.addEventListener('scroll', scrollHandler, { passive: true });\n this._cleanupFunctions.push(() => window.removeEventListener('scroll', scrollHandler));\n },\n\n /**\n * Bind triggers to all images with data-image-box attribute\n */\n bindTriggers: function (root) {\n const self = this;\n const triggers = this.getTriggers(root);\n\n triggers.forEach(function (trigger) {\n // Skip if already initialized\n if (trigger.dataset.imageBoxInitialized) return;\n trigger.dataset.imageBoxInitialized = 'true';\n\n // Add trigger class\n trigger.classList.add('vd-image-box-trigger');\n\n // Handle broken images\n if (trigger.tagName === 'IMG') {\n // Check if already in error state\n if (trigger.complete && trigger.naturalWidth === 0) {\n trigger.classList.add('is-broken');\n }\n\n // Listen for error events\n const errorHandler = function () {\n trigger.classList.add('is-broken');\n };\n trigger.addEventListener('error', errorHandler);\n\n // Listen for successful load\n const loadHandler = function () {\n trigger.classList.remove('is-broken');\n };\n trigger.addEventListener('load', loadHandler);\n\n trigger._imageBoxErrorHandler = errorHandler;\n trigger._imageBoxLoadHandler = loadHandler;\n }\n\n // Bind click event\n const clickHandler = function (e) {\n e.preventDefault();\n self.open(trigger);\n };\n trigger.addEventListener('click', clickHandler);\n\n // Store cleanup\n trigger._imageBoxCleanup = () => trigger.removeEventListener('click', clickHandler);\n\n // Keyboard accessibility for non-button triggers\n if (trigger.tagName !== 'BUTTON' && trigger.tagName !== 'A') {\n trigger.setAttribute('role', 'button');\n trigger.setAttribute('tabindex', '0');\n trigger.setAttribute('aria-label', 'View enlarged image');\n\n const keyHandler = function (e) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n self.open(trigger);\n }\n };\n trigger.addEventListener('keydown', keyHandler);\n\n const originalCleanup = trigger._imageBoxCleanup;\n trigger._imageBoxCleanup = () => {\n originalCleanup();\n trigger.removeEventListener('keydown', keyHandler);\n };\n }\n\n const originalCleanup = trigger._imageBoxCleanup;\n trigger._imageBoxCleanup = () => {\n originalCleanup();\n if (trigger._imageBoxErrorHandler) {\n trigger.removeEventListener('error', trigger._imageBoxErrorHandler);\n delete trigger._imageBoxErrorHandler;\n }\n if (trigger._imageBoxLoadHandler) {\n trigger.removeEventListener('load', trigger._imageBoxLoadHandler);\n delete trigger._imageBoxLoadHandler;\n }\n };\n });\n },\n\n /**\n * Open image box\n * @param {HTMLElement} trigger - The trigger element\n */\n open: function (trigger) {\n if (this.isOpen) return;\n\n this.currentTrigger = trigger;\n this.isOpen = true;\n this.initialScrollY = window.scrollY;\n\n // Get image source - support dual images (thumbnail + full-size)\n // data-image-box-full-src takes precedence for the lightbox\n const imgSrc = trigger.dataset.imageBoxFullSrc ||\n trigger.dataset.imageBoxSrc ||\n trigger.src ||\n trigger.href;\n\n if (!imgSrc) {\n console.warn('[Vanduo ImageBox] No image source found for trigger:', trigger);\n return;\n }\n\n // Get caption\n const captionText = trigger.dataset.imageBoxCaption || trigger.alt || '';\n\n // Set image source\n this.img.src = imgSrc;\n this.img.alt = trigger.alt || '';\n\n // Set caption\n if (captionText) {\n this.caption.textContent = captionText;\n this.caption.style.display = 'block';\n } else {\n this.caption.style.display = 'none';\n }\n\n // Calculate scrollbar width and lock body scroll\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.setProperty('--vd-scrollbar-width', `${scrollbarWidth}px`);\n document.body.classList.add('body-image-box-open');\n\n // Show backdrop\n this.backdrop.classList.add('is-visible');\n\n // Focus management\n this.backdrop.focus();\n\n // Dispatch event\n trigger.dispatchEvent(new CustomEvent('imageBox:open', {\n bubbles: true,\n detail: { src: imgSrc }\n }));\n\n // Handle image load\n if (!this.img.complete) {\n this.img.style.opacity = '0';\n this._imgLoadHandler = () => {\n this.img.style.opacity = '';\n };\n this.img.addEventListener('load', this._imgLoadHandler, { once: true });\n }\n },\n\n /**\n * Close image box\n */\n close: function () {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n\n // Hide backdrop\n this.backdrop.classList.remove('is-visible');\n\n // Unlock body scroll\n document.body.classList.remove('body-image-box-open');\n document.body.style.removeProperty('--vd-scrollbar-width');\n\n // Return focus to trigger\n if (this.currentTrigger) {\n this.currentTrigger.focus();\n this.currentTrigger.dispatchEvent(new CustomEvent('imageBox:close', { bubbles: true }));\n this.currentTrigger = null;\n }\n\n // Clear image after transition\n setTimeout(() => {\n if (!this.isOpen) {\n // Clean up load handler if still pending\n if (this._imgLoadHandler) {\n this.img.removeEventListener('load', this._imgLoadHandler);\n this._imgLoadHandler = null;\n }\n this.img.src = '';\n this.img.alt = '';\n }\n }, 300);\n },\n\n /**\n * Reinitialize - useful after dynamic DOM changes\n */\n reinit: function (root) {\n this.bindTriggers(root);\n },\n\n /**\n * Destroy component and clean up\n */\n destroy: function (root) {\n if (root && root !== document) {\n const triggersInRoot = this.getTriggers(root);\n triggersInRoot.forEach(trigger => {\n trigger.classList.remove('vd-image-box-trigger');\n if (trigger._imageBoxCleanup) {\n trigger._imageBoxCleanup();\n delete trigger._imageBoxCleanup;\n }\n delete trigger.dataset.imageBoxInitialized;\n });\n return;\n }\n\n // Close if open\n if (this.isOpen) {\n this.close();\n }\n\n // Remove backdrop\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n\n // Run cleanup functions\n this._cleanupFunctions.forEach(fn => fn());\n this._cleanupFunctions = [];\n\n // Remove trigger bindings\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-image-box-initialized]')\n : document.querySelectorAll('[data-image-box-initialized]');\n triggers.forEach(trigger => {\n trigger.classList.remove('vd-image-box-trigger');\n if (trigger._imageBoxCleanup) {\n trigger._imageBoxCleanup();\n delete trigger._imageBoxCleanup;\n }\n delete trigger.dataset.imageBoxInitialized;\n });\n\n this.backdrop = null;\n this.container = null;\n this.img = null;\n this.closeBtn = null;\n this.caption = null;\n this.currentTrigger = null;\n this.isOpen = false;\n },\n\n destroyAll: function (root) {\n this.destroy(root);\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('imageBox', ImageBox);\n }\n\n // Expose globally\n window.VanduoImageBox = ImageBox;\n\n})();\n", "/**\n * Vanduo Framework - Modals Component\n * JavaScript functionality for modal dialogs\n */\n\n(function () {\n 'use strict';\n\n /**\n * Modals Component\n */\n const Modals = {\n modals: new Map(),\n openModals: [],\n zIndexCounter: 1050,\n __vanduoScopedDestroyAll: true,\n\n // Store trigger cleanup functions\n _triggerCleanups: [],\n // Shared ESC key handler (installed once)\n _sharedEscHandler: null,\n\n getPortalState: function (modal) {\n if (!modal._vdPortalState) {\n modal._vdPortalState = {\n originalParent: null,\n originalNextSibling: null,\n placeholder: null\n };\n }\n return modal._vdPortalState;\n },\n\n portalToBody: function (modal) {\n if (!modal || modal.parentNode === document.body) {\n return;\n }\n\n const state = this.getPortalState(modal);\n state.originalParent = modal.parentNode;\n state.originalNextSibling = modal.nextSibling;\n\n if (!state.placeholder) {\n state.placeholder = document.createComment('vd-modal-placeholder');\n }\n\n state.originalParent.insertBefore(state.placeholder, modal);\n document.body.appendChild(modal);\n modal.dataset.vdPortaled = 'true';\n },\n\n restoreFromPortal: function (modal) {\n if (!modal) {\n return;\n }\n\n const state = this.getPortalState(modal);\n if (!state.placeholder) {\n delete modal.dataset.vdPortaled;\n return;\n }\n\n if (state.placeholder.parentNode) {\n state.placeholder.parentNode.insertBefore(modal, state.placeholder);\n state.placeholder.parentNode.removeChild(state.placeholder);\n } else if (state.originalParent && state.originalParent.isConnected) {\n if (state.originalNextSibling && state.originalNextSibling.parentNode === state.originalParent) {\n state.originalParent.insertBefore(modal, state.originalNextSibling);\n } else {\n state.originalParent.appendChild(modal);\n }\n }\n\n state.originalParent = null;\n state.originalNextSibling = null;\n state.placeholder = null;\n delete modal.dataset.vdPortaled;\n },\n\n /**\n * Initialize modals\n */\n init: function (root) {\n const modals = window.Vanduo.queryAll(root, '.vd-modal');\n\n modals.forEach(modal => {\n if (this.modals.has(modal)) {\n return;\n }\n this.initModal(modal);\n });\n\n // Handle data-modal triggers\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-modal]')\n : document.querySelectorAll('[data-modal]');\n triggers.forEach(trigger => {\n if (trigger.dataset.modalTriggerInitialized) return;\n trigger.dataset.modalTriggerInitialized = 'true';\n\n const triggerClickHandler = (e) => {\n e.preventDefault();\n const modalId = trigger.dataset.modal;\n const modal = document.querySelector(modalId);\n if (modal) {\n this.open(modal);\n }\n };\n trigger.addEventListener('click', triggerClickHandler);\n trigger._modalTriggerCleanup = () => trigger.removeEventListener('click', triggerClickHandler);\n });\n },\n\n /**\n * Initialize a single modal\n * @param {HTMLElement} modal - Modal element\n */\n initModal: function (modal) {\n const backdrop = this.createBackdrop(modal);\n const closeButtons = modal.querySelectorAll('.vd-modal-close, [data-dismiss=\"modal\"]');\n const dialog = modal.querySelector('.vd-modal-dialog');\n\n if (!dialog) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n modal.setAttribute('aria-hidden', 'true');\n\n // Generate ID if not exists\n if (!modal.id) {\n modal.id = 'modal-' + Math.random().toString(36).substr(2, 9);\n }\n\n // Set aria-labelledby\n const title = modal.querySelector('.vd-modal-title');\n if (title && !title.id) {\n title.id = modal.id + '-title';\n modal.setAttribute('aria-labelledby', title.id);\n }\n\n // Close button handlers\n closeButtons.forEach(button => {\n const closeHandler = () => {\n this.close(modal);\n };\n button.addEventListener('click', closeHandler);\n cleanupFunctions.push(() => button.removeEventListener('click', closeHandler));\n });\n\n // Backdrop click handler\n const backdropClickHandler = (e) => {\n if (e.target === backdrop && modal.dataset.backdrop !== 'static') {\n this.close(modal);\n }\n };\n backdrop.addEventListener('click', backdropClickHandler);\n cleanupFunctions.push(() => backdrop.removeEventListener('click', backdropClickHandler));\n\n // ESC key handler \u2014 use a single shared handler instead of one-per-modal\n if (!this._sharedEscHandler) {\n this._sharedEscHandler = (e) => {\n if (e.key === 'Escape' && this.openModals.length > 0) {\n const topModal = this.openModals[this.openModals.length - 1];\n if (topModal.dataset.keyboard !== 'false') {\n this.close(topModal);\n }\n }\n };\n document.addEventListener('keydown', this._sharedEscHandler);\n }\n\n this.modals.set(modal, { backdrop, dialog, trapHandler: null, cleanup: cleanupFunctions });\n },\n\n /**\n * Create backdrop element\n * @param {HTMLElement} modal - Modal element\n * @returns {HTMLElement} Backdrop element\n */\n createBackdrop: function (modal) {\n let backdrop = modal.querySelector('.vd-modal-backdrop');\n\n if (!backdrop) {\n backdrop = document.createElement('div');\n backdrop.className = 'vd-modal-backdrop';\n document.body.appendChild(backdrop);\n }\n\n return backdrop;\n },\n\n /**\n * Open modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n open: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n\n if (!el) {\n console.warn('[Vanduo Modals] Modal element not found:', modal);\n return;\n }\n\n if (!this.modals.has(el)) {\n console.warn('[Vanduo Modals] Modal not initialized:', el);\n return;\n }\n\n const modalData = this.modals.get(el);\n const { backdrop, dialog: _dialog } = modalData;\n\n this.portalToBody(el);\n\n // Increment z-index for stacking\n this.zIndexCounter += 10;\n el.style.zIndex = this.zIndexCounter;\n backdrop.style.zIndex = this.zIndexCounter - 1;\n\n // Add to open modals stack\n this.openModals.push(el);\n\n // Show backdrop\n backdrop.classList.add('is-visible');\n\n // Show modal\n el.classList.add('is-open');\n el.setAttribute('aria-hidden', 'false');\n\n // Lock body scroll\n if (this.openModals.length === 1) {\n document.body.classList.add('body-modal-open');\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n }\n\n // Focus trap (store handler for cleanup)\n const trapHandler = this.trapFocus(el);\n modalData.trapHandler = trapHandler;\n\n // Auto-focus first focusable element\n setTimeout(() => {\n const firstFocusable = this.getFocusableElements(el)[0];\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }, 100);\n\n // Dispatch event\n el.dispatchEvent(new CustomEvent('modal:open', { bubbles: true }));\n },\n\n /**\n * Close modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n close: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n\n if (!el) {\n console.warn('[Vanduo Modals] Modal element not found:', modal);\n return;\n }\n\n if (!this.modals.has(el)) {\n console.warn('[Vanduo Modals] Modal not initialized:', el);\n return;\n }\n\n const modalData = this.modals.get(el);\n const { backdrop, trapHandler } = modalData;\n\n // Remove focus trap event listener to prevent memory leak\n if (trapHandler) {\n el.removeEventListener('keydown', trapHandler);\n modalData.trapHandler = null;\n }\n\n // Remove from open modals stack\n const index = this.openModals.indexOf(el);\n if (index > -1) {\n this.openModals.splice(index, 1);\n }\n\n // Hide modal\n el.classList.remove('is-open');\n el.setAttribute('aria-hidden', 'true');\n\n // Hide backdrop if no other modals open\n if (this.openModals.length === 0) {\n backdrop.classList.remove('is-visible');\n document.body.classList.remove('body-modal-open');\n document.body.style.paddingRight = '';\n // Reset z-index counter to prevent indefinite growth\n this.zIndexCounter = 1050;\n } else {\n // Show backdrop for top modal\n const topModal = this.openModals[this.openModals.length - 1];\n const topBackdrop = this.modals.get(topModal).backdrop;\n topBackdrop.classList.add('is-visible');\n }\n\n // Return focus to trigger\n const trigger = document.querySelector(`[data-modal=\"#${el.id}\"]`);\n if (trigger) {\n trigger.focus();\n }\n\n // Dispatch event\n el.dispatchEvent(new CustomEvent('modal:close', { bubbles: true }));\n\n this.restoreFromPortal(el);\n },\n\n /**\n * Trap focus within modal\n * @param {HTMLElement} modal - Modal element\n * @returns {Function} The trap handler function for cleanup\n */\n trapFocus: function (modal) {\n const self = this;\n\n const trapHandler = function (e) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusableElements = self.getFocusableElements(modal);\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n e.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n modal.addEventListener('keydown', trapHandler);\n return trapHandler;\n },\n\n /**\n * Get focusable elements within modal\n * @param {HTMLElement} modal - Modal element\n * @returns {Array<HTMLElement>} Focusable elements\n */\n getFocusableElements: function (modal) {\n const selector = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(modal.querySelectorAll(selector)).filter(el => {\n return !el.hasAttribute('disabled') &&\n el.offsetWidth > 0 &&\n el.offsetHeight > 0;\n });\n },\n\n /**\n * Toggle modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n toggle: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n if (el) {\n if (el.classList.contains('is-open')) {\n this.close(el);\n } else {\n this.open(el);\n }\n }\n },\n\n /**\n * Destroy a modal instance and clean up event listeners\n * @param {HTMLElement} modal - Modal element\n */\n destroy: function (modal) {\n const modalData = this.modals.get(modal);\n if (!modalData) return;\n\n if (modal.classList.contains('is-open')) {\n const index = this.openModals.indexOf(modal);\n if (index > -1) {\n this.openModals.splice(index, 1);\n }\n modalData.backdrop.classList.remove('is-visible');\n modal.classList.remove('is-open');\n modal.setAttribute('aria-hidden', 'true');\n if (this.openModals.length === 0) {\n document.body.classList.remove('body-modal-open');\n document.body.style.paddingRight = '';\n this.zIndexCounter = 1050;\n }\n }\n\n this.restoreFromPortal(modal);\n\n // Run all cleanup functions\n if (modalData.cleanup) {\n modalData.cleanup.forEach(fn => fn());\n }\n\n // Remove created backdrop\n if (modalData.backdrop && modalData.backdrop.parentNode) {\n modalData.backdrop.parentNode.removeChild(modalData.backdrop);\n }\n\n this.modals.delete(modal);\n },\n\n /**\n * Destroy all modal instances\n */\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.modals.forEach((data, modal) => {\n if (scope === document || scope === modal || (typeof scope.contains === 'function' && scope.contains(modal))) {\n this.destroy(modal);\n }\n });\n\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-modal][data-modal-trigger-initialized]')\n : document.querySelectorAll('[data-modal][data-modal-trigger-initialized]');\n triggers.forEach(trigger => {\n if (trigger._modalTriggerCleanup) {\n trigger._modalTriggerCleanup();\n delete trigger._modalTriggerCleanup;\n }\n delete trigger.dataset.modalTriggerInitialized;\n });\n\n if (scope === document && this._sharedEscHandler) {\n document.removeEventListener('keydown', this._sharedEscHandler);\n this._sharedEscHandler = null;\n }\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('modals', Modals);\n }\n\n // Expose globally\n window.VanduoModals = Modals;\n\n})();\n", "/**\n * Vanduo Framework - Navbar Component\n * JavaScript functionality for navbar mobile menu\n */\n\n(function () {\n 'use strict';\n\n /**\n * Navbar Component\n */\n const Navbar = {\n // Store initialized navbars and their cleanup functions\n instances: new Map(),\n\n /**\n * Get the breakpoint value from CSS variable or use fallback\n * @returns {number} Breakpoint in pixels\n */\n getBreakpoint: function () {\n const root = getComputedStyle(document.documentElement);\n const breakpointValue = root.getPropertyValue('--vd-breakpoint-lg').trim();\n\n // Parse the value (could be \"992px\" or just \"992\")\n const parsed = parseInt(breakpointValue, 10);\n return isNaN(parsed) ? 992 : parsed;\n },\n\n /**\n * Initialize navbar component\n */\n init: function (root) {\n const navbars = window.Vanduo.queryAll(root, '.vd-navbar');\n\n navbars.forEach(navbar => {\n // Skip if already initialized\n if (this.instances.has(navbar)) {\n return;\n }\n this.initNavbar(navbar);\n });\n },\n\n /**\n * Initialize scroll-aware glass/transparent behaviour for a navbar.\n * Adds/removes `.vd-navbar-scrolled` when the page scrolls past a threshold.\n * Threshold: `data-scroll-threshold` attribute (px) or the navbar's own height.\n * @param {HTMLElement} navbar - Navbar element\n * @returns {Function|null} Cleanup function, or null if not applicable\n */\n initScrollWatcher: function (navbar) {\n const isGlass = navbar.classList.contains('vd-navbar-glass');\n const isTransparent = navbar.classList.contains('vd-navbar-transparent');\n\n if (!isGlass && !isTransparent) {\n return null;\n }\n\n const getThreshold = () => {\n const attr = parseInt(navbar.dataset.scrollThreshold, 10);\n return isNaN(attr) ? (navbar.offsetHeight || 60) : attr;\n };\n\n const onScroll = () => {\n const scrolled = window.scrollY > getThreshold();\n navbar.classList.toggle('vd-navbar-scrolled', scrolled);\n };\n\n onScroll(); // set initial state without waiting for first scroll\n window.addEventListener('scroll', onScroll, { passive: true });\n\n return () => window.removeEventListener('scroll', onScroll);\n },\n\n /**\n * Initialize a single navbar\n * @param {HTMLElement} navbar - Navbar element\n */\n initNavbar: function (navbar) {\n const toggle = navbar.querySelector('.vd-navbar-toggle, .vd-navbar-burger');\n const menu = navbar.querySelector('.vd-navbar-menu');\n const overlay = navbar.querySelector('.vd-navbar-overlay') || this.createOverlay(navbar);\n\n // Store cleanup functions for this navbar instance\n const cleanupFunctions = [];\n\n // Wire up scroll-aware glass/transparent behaviour regardless of mobile menu\n const scrollWatcherCleanup = this.initScrollWatcher(navbar);\n if (scrollWatcherCleanup) {\n cleanupFunctions.push(scrollWatcherCleanup);\n }\n\n if (!toggle || !menu) {\n // Still store the instance so scroll-watcher cleanup is tracked\n if (cleanupFunctions.length) {\n this.instances.set(navbar, { toggle: null, menu: null, overlay: null, cleanup: cleanupFunctions });\n }\n return;\n }\n\n // Toggle menu on button click\n const toggleClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleMenu(navbar, toggle, menu, overlay);\n };\n toggle.addEventListener('click', toggleClickHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('click', toggleClickHandler));\n\n // Close menu on overlay click\n if (overlay) {\n const overlayClickHandler = () => {\n this.closeMenu(navbar, toggle, menu, overlay);\n };\n overlay.addEventListener('click', overlayClickHandler);\n cleanupFunctions.push(() => overlay.removeEventListener('click', overlayClickHandler));\n }\n\n // Close menu on escape key\n const keydownHandler = (e) => {\n if (e.key === 'Escape' && menu.classList.contains('is-open')) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n };\n document.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => document.removeEventListener('keydown', keydownHandler));\n\n // Close menu on window resize (if resizing to desktop)\n let resizeTimer;\n const resizeHandler = () => {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n const breakpoint = this.getBreakpoint();\n if (window.innerWidth >= breakpoint && menu.classList.contains('is-open')) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n }, 250);\n };\n window.addEventListener('resize', resizeHandler);\n cleanupFunctions.push(() => {\n clearTimeout(resizeTimer);\n window.removeEventListener('resize', resizeHandler);\n });\n\n // Close menu when clicking outside\n const documentClickHandler = (e) => {\n if (menu.classList.contains('is-open') &&\n !navbar.contains(e.target) &&\n !menu.contains(e.target)) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Handle dropdown toggles in mobile menu\n const dropdownToggles = menu.querySelectorAll('.vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link');\n dropdownToggles.forEach(dropdownToggle => {\n const dropdownClickHandler = (e) => {\n const breakpoint = this.getBreakpoint();\n if (window.innerWidth < breakpoint) {\n e.preventDefault();\n const dropdown = dropdownToggle.parentElement;\n const dropdownMenu = dropdown.querySelector('.vd-navbar-dropdown-menu');\n\n if (dropdownMenu) {\n dropdownMenu.classList.toggle('is-open');\n }\n }\n };\n dropdownToggle.addEventListener('click', dropdownClickHandler);\n cleanupFunctions.push(() => dropdownToggle.removeEventListener('click', dropdownClickHandler));\n });\n\n // Store instance with cleanup functions\n this.instances.set(navbar, {\n toggle,\n menu,\n overlay,\n cleanup: cleanupFunctions\n });\n },\n\n /**\n * Destroy a navbar instance and clean up event listeners\n * @param {HTMLElement} navbar - Navbar element\n */\n destroy: function (navbar) {\n const instance = this.instances.get(navbar);\n if (!instance) {\n return;\n }\n\n // Run all cleanup functions\n instance.cleanup.forEach(fn => fn());\n\n // Remove created overlay if it exists\n if (instance.overlay && instance.overlay.parentNode) {\n instance.overlay.parentNode.removeChild(instance.overlay);\n }\n\n // Remove from instances map\n this.instances.delete(navbar);\n },\n\n /**\n * Destroy all navbar instances\n */\n destroyAll: function () {\n this.instances.forEach((instance, navbar) => {\n this.destroy(navbar);\n });\n },\n\n /**\n * Toggle mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n toggleMenu: function (navbar, toggle, menu, overlay) {\n const isOpen = menu.classList.contains('is-open');\n\n if (isOpen) {\n this.closeMenu(navbar, toggle, menu, overlay);\n } else {\n this.openMenu(navbar, toggle, menu, overlay);\n }\n },\n\n /**\n * Open mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n openMenu: function (navbar, toggle, menu, overlay) {\n menu.classList.add('is-open');\n toggle.classList.add('is-active');\n\n if (overlay) {\n overlay.classList.add('is-active');\n }\n\n // Prevent body scroll when menu is open (use class to avoid conflicts with modals)\n document.body.classList.add('body-navbar-open');\n\n // Set ARIA attributes\n toggle.setAttribute('aria-expanded', 'true');\n menu.setAttribute('aria-hidden', 'false');\n },\n\n /**\n * Close mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n closeMenu: function (navbar, toggle, menu, overlay) {\n menu.classList.remove('is-open');\n toggle.classList.remove('is-active');\n\n if (overlay) {\n overlay.classList.remove('is-active');\n }\n\n // Restore body scroll\n document.body.classList.remove('body-navbar-open');\n\n // Close all dropdown menus\n const dropdownMenus = menu.querySelectorAll('.vd-navbar-dropdown-menu.is-open');\n dropdownMenus.forEach(dropdownMenu => {\n dropdownMenu.classList.remove('is-open');\n });\n\n // Set ARIA attributes\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('aria-hidden', 'true');\n },\n\n /**\n * Create overlay element if it doesn't exist\n * @param {HTMLElement} navbar - Navbar element\n * @returns {HTMLElement} Overlay element\n */\n createOverlay: function (_navbar) {\n const overlay = document.createElement('div');\n overlay.className = 'vd-navbar-overlay';\n document.body.appendChild(overlay);\n return overlay;\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('navbar', Navbar);\n }\n\n // Expose globally\n window.VanduoNavbar = Navbar;\n\n})();\n", "/**\n * Vanduo Framework - Pagination Component\n * JavaScript functionality for dynamic pagination\n */\n\n(function() {\n 'use strict';\n\n /**\n * Pagination Component\n */\n const Pagination = {\n // Store initialized paginations and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize pagination components\n */\n init: function(root) {\n const paginations = window.Vanduo.queryAll(root, '.vd-pagination[data-pagination]');\n\n paginations.forEach(pagination => {\n if (this.instances.has(pagination)) {\n return;\n }\n this.initPagination(pagination);\n });\n },\n\n /**\n * Initialize a pagination\n * @param {HTMLElement} pagination - Pagination container\n */\n initPagination: function(pagination) {\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n const maxVisible = parseInt(pagination.dataset.maxVisible) || 7;\n\n this.render(pagination, {\n totalPages: totalPages,\n currentPage: currentPage,\n maxVisible: maxVisible\n });\n\n // Handle clicks (event delegation)\n const clickHandler = (e) => {\n const link = e.target.closest('.vd-pagination-link');\n if (!link || link.closest('.vd-pagination-item.disabled') || link.closest('.vd-pagination-item.active')) {\n return;\n }\n\n e.preventDefault();\n\n const item = link.closest('.vd-pagination-item');\n const page = item.dataset.page;\n\n if (page) {\n this.goToPage(pagination, parseInt(page));\n } else if (item.classList.contains('pagination-prev')) {\n this.prevPage(pagination);\n } else if (item.classList.contains('pagination-next')) {\n this.nextPage(pagination);\n }\n };\n pagination.addEventListener('click', clickHandler);\n\n this.instances.set(pagination, {\n cleanup: [() => pagination.removeEventListener('click', clickHandler)]\n });\n },\n \n /**\n * Render pagination\n * @param {HTMLElement} pagination - Pagination container\n * @param {Object} options - Pagination options\n */\n render: function(pagination, options) {\n const { totalPages, currentPage, maxVisible } = options;\n \n if (totalPages <= 1) {\n pagination.innerHTML = '';\n return;\n }\n \n let html = '';\n \n // Previous button\n html += `<li class=\"vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${currentPage === 1 ? 'disabled' : ''}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Previous\">Previous</a>`;\n html += `</li>`;\n \n // Calculate page range\n const pages = this.calculatePages(currentPage, totalPages, maxVisible);\n \n // Page numbers\n let lastPage = 0;\n pages.forEach(page => {\n if (page === 'ellipsis') {\n html += `<li class=\"vd-pagination-item pagination-item\"><span class=\"vd-pagination-ellipsis pagination-ellipsis\">\u2026</span></li>`;\n } else {\n if (page !== lastPage + 1 && lastPage > 0) {\n html += `<li class=\"vd-pagination-item pagination-item\"><span class=\"vd-pagination-ellipsis pagination-ellipsis\">\u2026</span></li>`;\n }\n const safePage = Number(page);\n html += `<li class=\"vd-pagination-item pagination-item ${safePage === currentPage ? 'active' : ''}\" data-page=\"${safePage}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Page ${safePage}\">${safePage}</a>`;\n html += `</li>`;\n lastPage = page;\n }\n });\n \n // Next button\n html += `<li class=\"vd-pagination-item vd-pagination-next pagination-item pagination-next ${currentPage === totalPages ? 'disabled' : ''}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Next\">Next</a>`;\n html += `</li>`;\n \n pagination.innerHTML = html;\n \n // Update data attributes\n pagination.dataset.currentPage = currentPage;\n },\n \n /**\n * Calculate which pages to show\n * @param {number} currentPage - Current page\n * @param {number} totalPages - Total pages\n * @param {number} maxVisible - Maximum visible pages\n * @returns {Array} Array of page numbers or 'ellipsis'\n */\n calculatePages: function(currentPage, totalPages, maxVisible) {\n const pages = [];\n const half = Math.floor(maxVisible / 2);\n \n if (totalPages <= maxVisible) {\n // Show all pages\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n \n let start = Math.max(2, currentPage - half);\n let end = Math.min(totalPages - 1, currentPage + half);\n \n // Adjust if we're near the start\n if (currentPage <= half + 1) {\n end = Math.min(totalPages - 1, maxVisible - 1);\n }\n \n // Adjust if we're near the end\n if (currentPage >= totalPages - half) {\n start = Math.max(2, totalPages - maxVisible + 2);\n }\n \n // Add ellipsis before if needed\n if (start > 2) {\n pages.push('ellipsis');\n }\n \n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n \n // Add ellipsis after if needed\n if (end < totalPages - 1) {\n pages.push('ellipsis');\n }\n \n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n \n return pages;\n },\n \n /**\n * Go to specific page\n * @param {HTMLElement} pagination - Pagination container\n * @param {number} page - Page number\n */\n goToPage: function(pagination, page) {\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n const maxVisible = parseInt(pagination.dataset.maxVisible) || 7;\n \n if (page < 1 || page > totalPages) {\n return;\n }\n \n this.render(pagination, {\n totalPages: totalPages,\n currentPage: page,\n maxVisible: maxVisible\n });\n \n // Dispatch event\n pagination.dispatchEvent(new CustomEvent('pagination:change', {\n bubbles: true,\n detail: { page, totalPages }\n }));\n },\n \n /**\n * Go to previous page\n * @param {HTMLElement} pagination - Pagination container\n */\n prevPage: function(pagination) {\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n if (currentPage > 1) {\n this.goToPage(pagination, currentPage - 1);\n }\n },\n \n /**\n * Go to next page\n * @param {HTMLElement} pagination - Pagination container\n */\n nextPage: function(pagination) {\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n if (currentPage < totalPages) {\n this.goToPage(pagination, currentPage + 1);\n }\n },\n \n /**\n * Update pagination\n * @param {HTMLElement|string} pagination - Pagination container or selector\n * @param {Object} options - Pagination options\n */\n update: function(pagination, options) {\n const el = typeof pagination === 'string' ? document.querySelector(pagination) : pagination;\n if (el) {\n if (options.totalPages !== undefined) {\n el.dataset.totalPages = options.totalPages;\n }\n if (options.currentPage !== undefined) {\n el.dataset.currentPage = options.currentPage;\n }\n if (options.maxVisible !== undefined) {\n el.dataset.maxVisible = options.maxVisible;\n }\n \n this.render(el, {\n totalPages: parseInt(el.dataset.totalPages) || 1,\n currentPage: parseInt(el.dataset.currentPage) || 1,\n maxVisible: parseInt(el.dataset.maxVisible) || 7\n });\n }\n },\n\n /**\n * Destroy a pagination instance and clean up event listeners\n * @param {HTMLElement} pagination - Pagination container\n */\n destroy: function(pagination) {\n const instance = this.instances.get(pagination);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(pagination);\n },\n\n /**\n * Destroy all pagination instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, pagination) => {\n this.destroy(pagination);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('pagination', Pagination);\n }\n \n // Expose globally\n window.VanduoPagination = Pagination;\n \n})();\n", "/**\n * Vanduo Framework - Parallax Component\n * JavaScript functionality for parallax scroll effects\n */\n\n(function () {\n 'use strict';\n\n /**\n * Parallax Component\n */\n const Parallax = {\n parallaxElements: new Map(),\n ticking: false,\n isMobile: window.innerWidth < 768,\n reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n isInitialized: false,\n _onScroll: null,\n _onResize: null,\n\n /**\n * Initialize parallax components\n */\n init: function (root) {\n // Check for reduced motion preference\n if (this.reducedMotion) {\n return; // Don't initialize if user prefers reduced motion\n }\n\n const parallaxElements = window.Vanduo.queryAll(root, '.vd-parallax');\n\n parallaxElements.forEach(element => {\n if (!element.dataset.parallaxInitialized) {\n this.initParallax(element);\n }\n });\n\n if (this.isInitialized) {\n this.refresh();\n return;\n }\n\n this.isInitialized = true;\n\n // Handle scroll\n this.handleScroll();\n this._onScroll = () => {\n this.handleScroll();\n };\n window.addEventListener('scroll', this._onScroll, { passive: true });\n\n // Handle resize\n this._onResize = () => {\n this.isMobile = window.innerWidth < 768;\n this.updateAll();\n };\n window.addEventListener('resize', this._onResize);\n },\n\n /**\n * Initialize a parallax element\n * @param {HTMLElement} element - Parallax container\n */\n initParallax: function (element) {\n element.dataset.parallaxInitialized = 'true';\n\n // Check if disabled on mobile\n const disableMobile = element.classList.contains('parallax-disable-mobile');\n if (disableMobile && this.isMobile) {\n return;\n }\n\n const layers = element.querySelectorAll('.vd-parallax-layer, .vd-parallax-bg');\n const speed = this.getSpeed(element);\n const direction = element.classList.contains('parallax-horizontal') ? 'horizontal' : 'vertical';\n\n this.parallaxElements.set(element, {\n layers: Array.from(layers),\n speed: speed,\n direction: direction,\n disableMobile: disableMobile\n });\n\n // Initial update\n this.updateParallax(element);\n },\n\n /**\n * Get parallax speed from element\n * @param {HTMLElement} element - Parallax element\n * @returns {number} Speed multiplier\n */\n getSpeed: function (element) {\n if (element.classList.contains('parallax-slow')) {\n return 0.5;\n } else if (element.classList.contains('parallax-fast')) {\n return 1.5;\n }\n return 1; // Default medium speed\n },\n\n /**\n * Handle scroll event\n */\n handleScroll: function () {\n if (!this.ticking) {\n window.requestAnimationFrame(() => {\n this.updateAll();\n this.ticking = false;\n });\n this.ticking = true;\n }\n },\n\n /**\n * Update all parallax elements\n */\n updateAll: function () {\n this.parallaxElements.forEach((config, element) => {\n // Skip if disabled on mobile\n if (config.disableMobile && this.isMobile) {\n return;\n }\n\n this.updateParallax(element);\n });\n },\n\n /**\n * Update parallax for a single element\n * @param {HTMLElement} element - Parallax element\n */\n updateParallax: function (element) {\n const config = this.parallaxElements.get(element);\n if (!config) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const elementTop = rect.top;\n const elementHeight = rect.height;\n\n // Calculate scroll progress (0 to 1)\n const scrollProgress = Math.max(0, Math.min(1,\n (windowHeight - elementTop) / (windowHeight + elementHeight)\n ));\n\n // Calculate offset based on speed and direction\n const offset = (scrollProgress - 0.5) * config.speed * 100;\n\n config.layers.forEach((layer, _index) => {\n // Different layers can have different speeds\n const layerSpeed = layer.dataset.parallaxSpeed ? parseFloat(layer.dataset.parallaxSpeed) : 1;\n const layerOffset = offset * layerSpeed;\n\n if (config.direction === 'horizontal') {\n layer.style.transform = `translateX(${layerOffset}px)`;\n } else {\n layer.style.transform = `translateY(${layerOffset}px)`;\n }\n });\n },\n\n /**\n * Destroy parallax element\n * @param {HTMLElement|string} element - Parallax element or selector\n */\n destroy: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.parallaxElements.has(el)) {\n const config = this.parallaxElements.get(el);\n config.layers.forEach(layer => {\n layer.style.transform = '';\n });\n this.parallaxElements.delete(el);\n }\n },\n\n /**\n * Refresh parallax (recalculate positions)\n */\n refresh: function () {\n this.updateAll();\n },\n\n destroyAll: function () {\n this.parallaxElements.forEach((_config, element) => {\n this.destroy(element);\n });\n this.parallaxElements.clear();\n\n if (this._onScroll) {\n window.removeEventListener('scroll', this._onScroll);\n this._onScroll = null;\n }\n\n if (this._onResize) {\n window.removeEventListener('resize', this._onResize);\n this._onResize = null;\n }\n\n this.isInitialized = false;\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('parallax', Parallax);\n }\n\n // Expose globally\n window.VanduoParallax = Parallax;\n\n})();\n", "/**\n * Vanduo Framework - Preloader Component\n * JavaScript functionality for progress bars and loaders\n */\n\n(function() {\n 'use strict';\n\n /**\n * Preloader Component\n */\n const Preloader = {\n getProgressBars: function(root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '.vd-progress-bar[data-progress], .progress-bar[data-progress]');\n }\n\n return Array.from(document.querySelectorAll('.vd-progress-bar[data-progress], .progress-bar[data-progress]'));\n },\n\n /**\n * Initialize preloader components\n */\n init: function(root) {\n const progressBars = this.getProgressBars(root);\n \n progressBars.forEach(bar => {\n if (!bar.dataset.progressInitialized) {\n this.initProgressBar(bar);\n }\n });\n },\n \n /**\n * Initialize a progress bar\n * @param {HTMLElement} bar - Progress bar element\n */\n initProgressBar: function(bar) {\n bar.dataset.progressInitialized = 'true';\n \n const initialValue = parseInt(bar.dataset.progress) || 0;\n this.setProgress(bar, initialValue, false);\n },\n \n /**\n * Set progress value\n * @param {HTMLElement|string} bar - Progress bar element or selector\n * @param {number} value - Progress value (0-100)\n * @param {boolean} animate - Whether to animate\n */\n setProgress: function(bar, value, animate = true) {\n const el = typeof bar === 'string' ? document.querySelector(bar) : bar;\n \n if (!el) {\n return;\n }\n \n // Clamp value between 0 and 100\n value = Math.max(0, Math.min(100, value));\n \n // Update width\n if (animate) {\n el.style.transition = 'width var(--vd-transition-duration-slow) var(--vd-transition-ease)';\n } else {\n el.style.transition = 'none';\n setTimeout(() => {\n el.style.transition = '';\n }, 0);\n }\n \n el.style.width = value + '%';\n el.setAttribute('aria-valuenow', value);\n el.setAttribute('aria-valuemin', 0);\n el.setAttribute('aria-valuemax', 100);\n \n // Update text if exists\n const text = el.querySelector('.vd-progress-text, .progress-text');\n if (text) {\n text.textContent = value + '%';\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('progress:update', {\n bubbles: true,\n detail: { value, max: 100 }\n }));\n \n // Complete event\n if (value >= 100) {\n el.dispatchEvent(new CustomEvent('progress:complete', {\n bubbles: true,\n detail: { value, max: 100 }\n }));\n }\n },\n \n /**\n * Animate progress from current to target\n * @param {HTMLElement|string} bar - Progress bar element or selector\n * @param {number} targetValue - Target progress value (0-100)\n * @param {number} duration - Animation duration in ms\n */\n animateProgress: function(bar, targetValue, duration = 1000) {\n const el = typeof bar === 'string' ? document.querySelector(bar) : bar;\n \n if (!el) {\n return;\n }\n \n const startValue = parseInt(el.style.width) || 0;\n const difference = targetValue - startValue;\n const startTime = performance.now();\n \n const animate = (currentTime) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n \n // Easing function (ease-out)\n const easeOut = 1 - Math.pow(1 - progress, 3);\n const currentValue = startValue + (difference * easeOut);\n \n this.setProgress(el, currentValue, false);\n \n if (progress < 1) {\n requestAnimationFrame(animate);\n }\n };\n \n requestAnimationFrame(animate);\n },\n \n /**\n * Show preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n show: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n el.style.display = 'inline-block';\n el.setAttribute('aria-hidden', 'false');\n }\n },\n \n /**\n * Hide preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n hide: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n },\n \n /**\n * Toggle preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n toggle: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n if (el.style.display === 'none' || el.getAttribute('aria-hidden') === 'true') {\n this.show(el);\n } else {\n this.hide(el);\n }\n }\n },\n\n /**\n * Destroy all progress bar instances\n */\n destroyAll: function(root) {\n const progressBars = this.getProgressBars(root || document).filter(function(bar) {\n return bar.dataset.progressInitialized === 'true';\n });\n progressBars.forEach(bar => {\n delete bar.dataset.progressInitialized;\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('preloader', Preloader);\n }\n \n // Expose globally\n window.VanduoPreloader = Preloader;\n \n})();\n", "/**\n * Vanduo Framework - Select Component\n * Custom select dropdown with enhanced functionality\n */\n\n(function () {\n 'use strict';\n\n /**\n * Select Component\n */\n const Select = {\n // Store initialized selects and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize select components\n */\n init: function (root) {\n const selects = window.Vanduo.queryAll(root, 'select.vd-custom-select-input, select[data-custom-select]');\n\n selects.forEach(select => {\n if (this.instances.has(select)) {\n return;\n }\n this.initSelect(select);\n });\n },\n\n /**\n * Initialize a single select\n * @param {HTMLSelectElement} select - Select element\n */\n initSelect: function (select) {\n // Skip if already has custom wrapper\n if (select.closest('.vd-custom-select-wrapper')) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Create wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'custom-select-wrapper';\n select.parentNode.insertBefore(wrapper, select);\n wrapper.appendChild(select);\n\n // Create custom button\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'custom-select-button';\n button.setAttribute('aria-haspopup', 'listbox');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-labelledby', select.id || this.generateId(select));\n\n // Create dropdown\n const dropdown = document.createElement('div');\n dropdown.className = 'custom-select-dropdown';\n dropdown.setAttribute('role', 'listbox');\n\n // Create search input if searchable\n if (select.dataset.searchable === 'true') {\n const searchWrapper = document.createElement('div');\n searchWrapper.className = 'custom-select-search';\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.className = 'input input-sm';\n searchInput.placeholder = 'Search...';\n searchInput.setAttribute('aria-label', 'Search options');\n searchWrapper.appendChild(searchInput);\n dropdown.appendChild(searchWrapper);\n\n const filterFn = (e) => {\n this.filterOptions(dropdown, e.target.value);\n };\n const searchHandler = typeof debounce === 'function' ? debounce(filterFn, 150) : filterFn;\n searchInput.addEventListener('input', searchHandler);\n cleanupFunctions.push(() => searchInput.removeEventListener('input', searchHandler));\n }\n\n // Build options\n this.buildOptions(select, dropdown, button);\n\n wrapper.appendChild(button);\n wrapper.appendChild(dropdown);\n\n // Update button text\n this.updateButtonText(select, button);\n\n // Event listeners\n const buttonClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleDropdown(button, dropdown);\n };\n button.addEventListener('click', buttonClickHandler);\n cleanupFunctions.push(() => button.removeEventListener('click', buttonClickHandler));\n\n // Close on outside click\n const documentClickHandler = (e) => {\n if (!wrapper.contains(e.target) && dropdown.classList.contains('is-open')) {\n this.closeDropdown(button, dropdown);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, select, button, dropdown);\n };\n button.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => button.removeEventListener('keydown', keydownHandler));\n\n // Update on select change\n const changeHandler = () => {\n this.updateButtonText(select, button);\n this.updateSelectedOptions(select, dropdown);\n };\n select.addEventListener('change', changeHandler);\n cleanupFunctions.push(() => select.removeEventListener('change', changeHandler));\n\n this.instances.set(select, { wrapper, button, dropdown, cleanup: cleanupFunctions, typeaheadBuffer: '', typeaheadTimer: null });\n },\n\n /**\n * Build options in dropdown\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} button - Button element\n */\n buildOptions: function (select, dropdown, button) {\n const options = select.querySelectorAll('option');\n const fragment = document.createDocumentFragment();\n\n options.forEach((option, index) => {\n if (option.parentElement.tagName === 'OPTGROUP') {\n // Handle option groups\n const group = option.parentElement;\n if (!dropdown.querySelector(`[data-group=\"${group.label}\"]`)) {\n const groupElement = document.createElement('div');\n groupElement.className = 'custom-select-option-group';\n groupElement.textContent = group.label;\n groupElement.dataset.group = group.label;\n fragment.appendChild(groupElement);\n }\n }\n\n if (option.value === '' && !option.textContent.trim()) {\n return; // Skip empty options\n }\n\n const optionElement = document.createElement('div');\n optionElement.className = 'custom-select-option';\n optionElement.textContent = option.textContent;\n optionElement.setAttribute('role', 'option');\n optionElement.setAttribute('data-value', option.value);\n optionElement.setAttribute('data-index', index);\n\n if (option.selected) {\n optionElement.classList.add('is-selected');\n optionElement.setAttribute('aria-selected', 'true');\n }\n\n if (option.disabled) {\n optionElement.classList.add('is-disabled');\n optionElement.setAttribute('aria-disabled', 'true');\n }\n\n optionElement.addEventListener('click', (_e) => {\n if (!option.disabled) {\n this.selectOption(select, option, optionElement, button, dropdown);\n }\n });\n\n fragment.appendChild(optionElement);\n });\n\n dropdown.appendChild(fragment);\n },\n\n /**\n * Select an option\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLOptionElement} option - Option element\n * @param {HTMLElement} optionElement - Custom option element\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n selectOption: function (select, option, optionElement, button, dropdown) {\n if (select.multiple) {\n // Multi-select\n option.selected = !option.selected;\n optionElement.classList.toggle('is-selected');\n optionElement.setAttribute('aria-selected', option.selected);\n } else {\n // Single select\n select.value = option.value;\n select.dispatchEvent(new Event('change', { bubbles: true }));\n this.closeDropdown(button, dropdown);\n }\n\n this.updateButtonText(select, button);\n },\n\n /**\n * Update button text\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} button - Button element\n */\n updateButtonText: function (select, button) {\n if (select.multiple) {\n const selected = Array.from(select.selectedOptions);\n if (selected.length === 0) {\n button.textContent = select.dataset.placeholder || 'Select options...';\n } else if (selected.length === 1) {\n button.textContent = selected[0].textContent;\n } else {\n button.textContent = `${selected.length} selected`;\n }\n } else {\n const selectedOption = select.options[select.selectedIndex];\n button.textContent = selectedOption ? selectedOption.textContent : (select.dataset.placeholder || 'Select...');\n }\n },\n\n /**\n * Update selected options in dropdown\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n updateSelectedOptions: function (select, dropdown) {\n const options = dropdown.querySelectorAll('.custom-select-option');\n const selectedValues = Array.from(select.selectedOptions).map(opt => opt.value);\n\n options.forEach(optionEl => {\n const value = optionEl.dataset.value;\n if (selectedValues.includes(value)) {\n optionEl.classList.add('is-selected');\n optionEl.setAttribute('aria-selected', 'true');\n } else {\n optionEl.classList.remove('is-selected');\n optionEl.setAttribute('aria-selected', 'false');\n }\n });\n },\n\n /**\n * Toggle dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n toggleDropdown: function (button, dropdown) {\n const isOpen = dropdown.classList.contains('is-open');\n\n if (isOpen) {\n this.closeDropdown(button, dropdown);\n } else {\n this.openDropdown(button, dropdown);\n }\n },\n\n /**\n * Open dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n openDropdown: function (button, dropdown) {\n dropdown.classList.add('is-open');\n button.setAttribute('aria-expanded', 'true');\n\n // Focus first option\n const firstOption = dropdown.querySelector('.custom-select-option:not(.is-disabled)');\n if (firstOption) {\n firstOption.focus();\n }\n },\n\n /**\n * Close dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n closeDropdown: function (button, dropdown) {\n dropdown.classList.remove('is-open');\n button.setAttribute('aria-expanded', 'false');\n },\n\n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n handleKeydown: function (e, select, button, dropdown) {\n const isOpen = dropdown.classList.contains('is-open');\n const options = Array.from(dropdown.querySelectorAll('.custom-select-option:not(.is-disabled)'));\n const currentIndex = options.findIndex(opt => opt === document.activeElement);\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && currentIndex >= 0) {\n const optionEl = options[currentIndex];\n const option = select.options[parseInt(optionEl.dataset.index)];\n this.selectOption(select, option, optionEl, button, dropdown);\n } else {\n this.openDropdown(button, dropdown);\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n this.closeDropdown(button, dropdown);\n button.focus();\n }\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n this.openDropdown(button, dropdown);\n } else {\n const nextIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n options[nextIndex].focus();\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen) {\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n options[prevIndex].focus();\n }\n break;\n\n case 'Home':\n if (isOpen) {\n e.preventDefault();\n options[0].focus();\n }\n break;\n\n case 'End':\n if (isOpen) {\n e.preventDefault();\n options[options.length - 1].focus();\n }\n break;\n\n default:\n // Typeahead: jump to matching option when typing printable characters\n if (isOpen && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n // Per-instance typeahead state to avoid cross-instance corruption\n const instance = this.instances.get(select);\n if (!instance) break;\n clearTimeout(instance.typeaheadTimer);\n instance.typeaheadBuffer += e.key.toLowerCase();\n\n const match = options.find(opt =>\n opt.textContent.trim().toLowerCase().startsWith(instance.typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n instance.typeaheadTimer = setTimeout(() => {\n instance.typeaheadBuffer = '';\n }, 500);\n }\n break;\n }\n },\n\n /**\n * Filter options by search term\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {string} searchTerm - Search term\n */\n filterOptions: function (dropdown, searchTerm) {\n const options = dropdown.querySelectorAll('.vd-custom-select-option');\n const term = searchTerm.toLowerCase();\n\n options.forEach(option => {\n const text = option.textContent.toLowerCase();\n if (text.includes(term)) {\n option.style.display = 'block';\n } else {\n option.style.display = 'none';\n }\n });\n },\n\n /**\n * Generate unique ID\n * @param {HTMLElement} element - Element\n * @returns {string} Generated ID\n */\n generateId: function (element) {\n if (element.id) {\n return element.id;\n }\n const id = 'select-' + Math.random().toString(36).substr(2, 9);\n element.id = id;\n return id;\n },\n\n /**\n * Destroy a select instance and clean up event listeners\n * @param {HTMLSelectElement} select - Select element\n */\n destroy: function (select) {\n const instance = this.instances.get(select);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n\n // Unwrap the select element back to its original parent\n if (instance.wrapper && instance.wrapper.parentNode) {\n instance.wrapper.parentNode.insertBefore(select, instance.wrapper);\n instance.wrapper.parentNode.removeChild(instance.wrapper);\n }\n\n this.instances.delete(select);\n },\n\n /**\n * Destroy all select instances\n */\n destroyAll: function () {\n this.instances.forEach((instance, select) => {\n this.destroy(select);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('select', Select);\n }\n\n})();\n", "/**\n * Vanduo Framework - Sidenav Component\n * JavaScript functionality for side navigation drawer\n */\n\n(function() {\n 'use strict';\n\n /**\n * Sidenav Component\n */\n const Sidenav = {\n sidenavs: new Map(),\n breakpoint: 992, // Desktop breakpoint\n restoreDelayMs: 450,\n __vanduoScopedDestroyAll: true,\n \n // Global cleanup functions (toggles, resize)\n _globalCleanups: [],\n _resizeCleanup: null,\n\n isFixedVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-fixed') || sidenav.classList.contains('sidenav-fixed');\n },\n\n isPushVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-push') || sidenav.classList.contains('sidenav-push');\n },\n\n isRightVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-right') || sidenav.classList.contains('sidenav-right');\n },\n\n getPortalState: function(sidenav) {\n if (!sidenav._vdPortalState) {\n sidenav._vdPortalState = {\n originalParent: null,\n originalNextSibling: null,\n placeholder: null,\n restoreTimer: null,\n restoreHandler: null\n };\n }\n return sidenav._vdPortalState;\n },\n\n cancelScheduledRestore: function(sidenav) {\n const state = this.getPortalState(sidenav);\n\n if (state.restoreHandler) {\n sidenav.removeEventListener('transitionend', state.restoreHandler);\n state.restoreHandler = null;\n }\n\n if (state.restoreTimer) {\n window.clearTimeout(state.restoreTimer);\n state.restoreTimer = null;\n }\n },\n\n portalToBody: function(sidenav) {\n if (!sidenav) {\n return;\n }\n\n if (sidenav.parentNode === document.body) {\n this.cancelScheduledRestore(sidenav);\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n state.originalParent = sidenav.parentNode;\n state.originalNextSibling = sidenav.nextSibling;\n\n if (!state.placeholder) {\n state.placeholder = document.createComment('vd-sidenav-placeholder');\n }\n\n state.originalParent.insertBefore(state.placeholder, sidenav);\n document.body.appendChild(sidenav);\n sidenav.dataset.vdPortaled = 'true';\n },\n\n restoreFromPortal: function(sidenav) {\n if (!sidenav) {\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n if (!state.placeholder) {\n delete sidenav.dataset.vdPortaled;\n return;\n }\n\n if (state.placeholder.parentNode) {\n state.placeholder.parentNode.insertBefore(sidenav, state.placeholder);\n state.placeholder.parentNode.removeChild(state.placeholder);\n } else if (state.originalParent && state.originalParent.isConnected) {\n if (state.originalNextSibling && state.originalNextSibling.parentNode === state.originalParent) {\n state.originalParent.insertBefore(sidenav, state.originalNextSibling);\n } else {\n state.originalParent.appendChild(sidenav);\n }\n }\n\n state.originalParent = null;\n state.originalNextSibling = null;\n state.placeholder = null;\n delete sidenav.dataset.vdPortaled;\n },\n\n scheduleRestoreFromPortal: function(sidenav) {\n if (!sidenav || sidenav.parentNode !== document.body) {\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n const finalizeRestore = () => {\n this.restoreFromPortal(sidenav);\n };\n\n const transitionEndHandler = (event) => {\n if (event.target !== sidenav || event.propertyName !== 'transform') {\n return;\n }\n finalizeRestore();\n };\n\n state.restoreHandler = transitionEndHandler;\n sidenav.addEventListener('transitionend', transitionEndHandler);\n state.restoreTimer = window.setTimeout(() => {\n finalizeRestore();\n }, this.restoreDelayMs);\n },\n\n /**\n * Initialize sidenav components\n */\n init: function(root) {\n const sidenavs = window.Vanduo.queryAll(root, '.vd-sidenav, .vd-offcanvas');\n\n sidenavs.forEach(sidenav => {\n if (this.sidenavs.has(sidenav)) {\n return;\n }\n this.initSidenav(sidenav);\n });\n\n // Handle toggle buttons\n const toggles = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-sidenav-toggle]')\n : document.querySelectorAll('[data-sidenav-toggle]');\n toggles.forEach(toggle => {\n if (toggle.dataset.sidenavToggleInitialized) return;\n toggle.dataset.sidenavToggleInitialized = 'true';\n\n const toggleClickHandler = (e) => {\n e.preventDefault();\n const targetId = toggle.dataset.sidenavToggle;\n const sidenav = document.querySelector(targetId);\n if (sidenav) {\n this.toggle(sidenav);\n }\n };\n toggle.addEventListener('click', toggleClickHandler);\n toggle._sidenavToggleCleanup = () => toggle.removeEventListener('click', toggleClickHandler);\n });\n\n // Handle responsive behavior\n this.handleResize();\n if (!this._resizeCleanup) {\n const resizeHandler = () => {\n this.handleResize();\n };\n window.addEventListener('resize', resizeHandler);\n this._resizeCleanup = () => window.removeEventListener('resize', resizeHandler);\n }\n },\n\n /**\n * Initialize a single sidenav\n * @param {HTMLElement} sidenav - Sidenav element\n */\n initSidenav: function(sidenav) {\n // Apply data-vd-position direction class if specified\n const position = sidenav.getAttribute('data-vd-position');\n if (position) {\n const prefix = sidenav.classList.contains('vd-offcanvas') ? 'vd-offcanvas' : 'vd-sidenav';\n sidenav.classList.add(prefix + '-' + position);\n }\n\n const overlay = this.createOverlay(sidenav);\n const closeButton = sidenav.querySelector('.vd-sidenav-close, .vd-offcanvas-close');\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n sidenav.setAttribute('role', 'navigation');\n sidenav.setAttribute('aria-hidden', 'true');\n\n // Close button handler\n if (closeButton) {\n const closeHandler = () => {\n this.close(sidenav);\n };\n closeButton.addEventListener('click', closeHandler);\n cleanupFunctions.push(() => closeButton.removeEventListener('click', closeHandler));\n }\n\n // Overlay click handler\n const overlayClickHandler = () => {\n if (sidenav.dataset.backdrop !== 'static') {\n this.close(sidenav);\n }\n };\n overlay.addEventListener('click', overlayClickHandler);\n cleanupFunctions.push(() => overlay.removeEventListener('click', overlayClickHandler));\n\n // ESC key handler\n const escKeyHandler = (e) => {\n if (e.key === 'Escape' && sidenav.classList.contains('is-open')) {\n if (sidenav.dataset.keyboard !== 'false') {\n this.close(sidenav);\n }\n }\n };\n document.addEventListener('keydown', escKeyHandler);\n cleanupFunctions.push(() => document.removeEventListener('keydown', escKeyHandler));\n\n this.sidenavs.set(sidenav, { overlay, cleanup: cleanupFunctions });\n },\n \n /**\n * Create overlay element\n * @param {HTMLElement} sidenav - Sidenav element\n * @returns {HTMLElement} Overlay element\n */\n createOverlay: function(sidenav) {\n let overlay = sidenav.querySelector('.vd-sidenav-overlay');\n \n if (!overlay) {\n overlay = document.createElement('div');\n overlay.className = 'vd-sidenav-overlay';\n document.body.appendChild(overlay);\n }\n \n return overlay;\n },\n \n /**\n * Open sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n open: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n \n if (!el || !this.sidenavs.has(el)) {\n return;\n }\n \n const { overlay } = this.sidenavs.get(el);\n\n this.portalToBody(el);\n \n // Show overlay (if not fixed)\n if (!this.isFixedVariant(el)) {\n overlay.classList.add('is-visible');\n }\n \n // Open sidenav\n el.classList.add('is-open');\n el.setAttribute('aria-hidden', 'false');\n \n // Lock body scroll\n document.body.classList.add('body-sidenav-open');\n \n // Handle push variant\n if (this.isPushVariant(el)) {\n this.handlePushVariant(el, true);\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('sidenav:open', { bubbles: true }));\n },\n \n /**\n * Close sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n close: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n \n if (!el || !this.sidenavs.has(el)) {\n return;\n }\n \n const { overlay } = this.sidenavs.get(el);\n \n // Hide overlay\n overlay.classList.remove('is-visible');\n \n // Close sidenav\n el.classList.remove('is-open');\n el.setAttribute('aria-hidden', 'true');\n \n // Unlock body scroll\n document.body.classList.remove('body-sidenav-open');\n \n // Handle push variant\n if (this.isPushVariant(el)) {\n this.handlePushVariant(el, false);\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('sidenav:close', { bubbles: true }));\n\n this.scheduleRestoreFromPortal(el);\n },\n \n /**\n * Toggle sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n toggle: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n if (el) {\n if (el.classList.contains('is-open')) {\n this.close(el);\n } else {\n this.open(el);\n }\n }\n },\n \n /**\n * Handle push variant\n * @param {HTMLElement} sidenav - Sidenav element\n * @param {boolean} isOpen - Whether sidenav is open\n */\n handlePushVariant: function(sidenav, isOpen) {\n // Find the main content wrapper\n const content = document.querySelector('main, .main-content, .content, [role=\"main\"]') || document.body;\n \n if (isOpen) {\n if (window.innerWidth >= this.breakpoint) {\n if (this.isRightVariant(sidenav)) {\n content.style.marginRight = sidenav.offsetWidth + 'px';\n } else {\n content.style.marginLeft = sidenav.offsetWidth + 'px';\n }\n }\n } else {\n content.style.marginLeft = '';\n content.style.marginRight = '';\n }\n },\n \n /**\n * Handle window resize\n */\n handleResize: function() {\n this.sidenavs.forEach(({ overlay }, sidenav) => {\n // Close overlay sidenavs on resize to desktop if they're open\n if (window.innerWidth >= this.breakpoint) {\n if (this.isFixedVariant(sidenav) && !sidenav.classList.contains('is-open')) {\n // Fixed sidenavs should be visible on desktop\n sidenav.classList.add('is-open');\n sidenav.setAttribute('aria-hidden', 'false');\n overlay.classList.remove('is-visible');\n }\n } else {\n // On mobile, fixed sidenavs become overlay\n if (this.isFixedVariant(sidenav) && sidenav.classList.contains('is-open')) {\n this.close(sidenav);\n }\n }\n });\n },\n\n /**\n * Destroy a sidenav instance and clean up event listeners\n * @param {HTMLElement} sidenav - Sidenav element\n */\n destroy: function(sidenav) {\n const data = this.sidenavs.get(sidenav);\n if (!data) return;\n\n if (sidenav.classList.contains('is-open')) {\n data.overlay.classList.remove('is-visible');\n sidenav.classList.remove('is-open');\n sidenav.setAttribute('aria-hidden', 'true');\n document.body.classList.remove('body-sidenav-open');\n }\n\n this.restoreFromPortal(sidenav);\n\n data.cleanup.forEach(fn => fn());\n\n // Remove created overlay\n if (data.overlay && data.overlay.parentNode) {\n data.overlay.parentNode.removeChild(data.overlay);\n }\n\n this.sidenavs.delete(sidenav);\n },\n\n /**\n * Destroy all sidenav instances\n */\n destroyAll: function(root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.sidenavs.forEach((data, sidenav) => {\n if (scope === document || scope === sidenav || (typeof scope.contains === 'function' && scope.contains(sidenav))) {\n this.destroy(sidenav);\n }\n });\n\n const toggles = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-sidenav-toggle][data-sidenav-toggle-initialized]')\n : document.querySelectorAll('[data-sidenav-toggle][data-sidenav-toggle-initialized]');\n toggles.forEach(toggle => {\n if (toggle._sidenavToggleCleanup) {\n toggle._sidenavToggleCleanup();\n delete toggle._sidenavToggleCleanup;\n }\n delete toggle.dataset.sidenavToggleInitialized;\n });\n\n if (scope === document) {\n if (this._resizeCleanup) {\n this._resizeCleanup();\n this._resizeCleanup = null;\n }\n this._globalCleanups.forEach(fn => fn());\n this._globalCleanups = [];\n }\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('sidenav', Sidenav);\n }\n \n // Expose globally\n window.VanduoSidenav = Sidenav;\n \n})();\n", "/**\n * Vanduo Framework - Tabs Component\n * Tabbed content navigation with keyboard support\n */\n\n(function() {\n 'use strict';\n\n /**\n * Tabs Component\n */\n const Tabs = {\n // Store initialized tab containers and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize all tab components\n */\n init: function(root) {\n const tabContainers = window.Vanduo.queryAll(root, '.vd-tabs, [data-tabs]');\n\n tabContainers.forEach(container => {\n if (this.instances.has(container)) {\n return;\n }\n this.initTabs(container);\n });\n },\n\n /**\n * Initialize a single tab container\n * @param {HTMLElement} container - Tabs container element\n */\n initTabs: function(container) {\n const tabList = container.querySelector('.vd-tab-list, [role=\"tablist\"]');\n const tabLinks = container.querySelectorAll('.vd-tab-link, [data-tab]');\n const tabPanes = container.querySelectorAll('.vd-tab-pane, [data-tab-pane]');\n\n if (!tabList || tabLinks.length === 0) return;\n\n const cleanupFunctions = [];\n\n // Set up ARIA attributes\n tabList.setAttribute('role', 'tablist');\n\n tabLinks.forEach((link, index) => {\n const tabId = this.getTabId(link, index);\n const pane = this.findPane(container, tabId, tabPanes);\n\n // Set up tab attributes\n link.setAttribute('role', 'tab');\n link.setAttribute('aria-selected', link.classList.contains('is-active') ? 'true' : 'false');\n link.setAttribute('tabindex', link.classList.contains('is-active') ? '0' : '-1');\n\n if (!link.id) {\n link.id = `tab-btn-${tabId}`;\n }\n\n // Set up pane attributes\n if (pane) {\n pane.setAttribute('role', 'tabpanel');\n pane.setAttribute('aria-labelledby', link.id);\n if (!pane.id) {\n pane.id = `tab-pane-${tabId}`;\n }\n link.setAttribute('aria-controls', pane.id);\n }\n\n // Click handler\n const clickHandler = (e) => {\n e.preventDefault();\n if (!link.classList.contains('disabled') && !link.disabled) {\n this.activateTab(container, link, tabLinks, tabPanes);\n }\n };\n link.addEventListener('click', clickHandler);\n cleanupFunctions.push(() => link.removeEventListener('click', clickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, container, link, tabLinks, tabPanes);\n };\n link.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => link.removeEventListener('keydown', keydownHandler));\n });\n\n // Ensure one tab is active\n const activeTab = container.querySelector('.vd-tab-link.is-active, [data-tab].is-active');\n if (!activeTab && tabLinks.length > 0) {\n this.activateTab(container, tabLinks[0], tabLinks, tabPanes);\n }\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n\n /**\n * Get the pane identifier associated with a tab link.\n * @param {HTMLElement} link - Tab link element\n * @param {number} [fallbackIndex] - Optional fallback index\n * @returns {string} Tab identifier\n */\n getTabId: function(link, fallbackIndex) {\n return link.dataset.tabTarget\n || link.dataset.tab\n || link.getAttribute('href')?.replace('#', '')\n || (typeof fallbackIndex === 'number' ? `tab-${fallbackIndex}` : link.id);\n },\n\n /**\n * Find the pane associated with a tab\n * @param {HTMLElement} container - Tabs container\n * @param {string} tabId - Tab identifier\n * @param {NodeList} tabPanes - All tab panes\n * @returns {HTMLElement|null} The matching pane\n */\n findPane: function(container, tabId, tabPanes) {\n // Try data attribute first\n let pane = container.querySelector(`[data-tab-pane=\"${tabId}\"]`);\n\n // Try ID\n if (!pane) {\n pane = container.querySelector(`#${tabId}`);\n }\n\n // Try matching by index\n if (!pane) {\n const tabLinks = container.querySelectorAll('.vd-tab-link, [data-tab]');\n tabLinks.forEach((link, index) => {\n const linkTabId = this.getTabId(link, index);\n if (linkTabId === tabId && tabPanes[index]) {\n pane = tabPanes[index];\n }\n });\n }\n\n return pane;\n },\n\n /**\n * Activate a tab\n * @param {HTMLElement} container - Tabs container\n * @param {HTMLElement} tab - Tab to activate\n * @param {NodeList} allTabs - All tab links\n * @param {NodeList} allPanes - All tab panes\n */\n activateTab: function(container, tab, allTabs, allPanes) {\n const tabIndex = Array.from(allTabs).indexOf(tab);\n const tabId = this.getTabId(tab, tabIndex);\n\n // Deactivate all tabs\n allTabs.forEach(t => {\n t.classList.remove('is-active');\n t.setAttribute('aria-selected', 'false');\n t.setAttribute('tabindex', '-1');\n\n // Also handle parent li if exists\n if (t.parentElement && t.parentElement.classList.contains('tab-item')) {\n t.parentElement.classList.remove('is-active');\n }\n });\n\n // Hide all panes\n allPanes.forEach(p => {\n p.classList.remove('is-active');\n });\n\n // Activate selected tab\n tab.classList.add('is-active');\n tab.setAttribute('aria-selected', 'true');\n tab.setAttribute('tabindex', '0');\n\n // Also handle parent li if exists\n if (tab.parentElement && tab.parentElement.classList.contains('tab-item')) {\n tab.parentElement.classList.add('is-active');\n }\n\n // Show corresponding pane\n const pane = this.findPane(container, tabId, allPanes);\n if (pane) {\n pane.classList.add('is-active');\n }\n\n // Dispatch custom event\n const event = new CustomEvent('tab:change', {\n bubbles: true,\n detail: {\n tab: tab,\n pane: pane,\n tabId: tabId\n }\n });\n container.dispatchEvent(event);\n },\n\n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} container - Tabs container\n * @param {HTMLElement} currentTab - Currently focused tab\n * @param {NodeList} allTabs - All tab links\n * @param {NodeList} allPanes - All tab panes\n */\n handleKeydown: function(e, container, currentTab, allTabs, allPanes) {\n const isVertical = container.classList.contains('vd-tabs-vertical') || container.classList.contains('tabs-vertical');\n const tabs = Array.from(allTabs).filter(t => !t.classList.contains('disabled') && !t.disabled);\n const currentIndex = tabs.indexOf(currentTab);\n\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n if (!isVertical) {\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;\n }\n break;\n\n case 'ArrowRight':\n if (!isVertical) {\n e.preventDefault();\n newIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;\n }\n break;\n\n case 'ArrowUp':\n if (isVertical) {\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;\n }\n break;\n\n case 'ArrowDown':\n if (isVertical) {\n e.preventDefault();\n newIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;\n }\n break;\n\n case 'Home':\n e.preventDefault();\n newIndex = 0;\n break;\n\n case 'End':\n e.preventDefault();\n newIndex = tabs.length - 1;\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.activateTab(container, currentTab, allTabs, allPanes);\n return;\n\n default:\n return;\n }\n\n // Focus and activate new tab\n if (newIndex !== currentIndex) {\n tabs[newIndex].focus();\n this.activateTab(container, tabs[newIndex], allTabs, allPanes);\n }\n },\n\n /**\n * Programmatically show a tab\n * @param {string|HTMLElement} tab - Tab identifier or element\n */\n show: function(tab) {\n let tabElement;\n\n if (typeof tab === 'string') {\n tabElement = document.querySelector(`[data-tab-target=\"${tab}\"], [data-tab=\"${tab}\"], [href=\"#${tab}\"]`);\n } else {\n tabElement = tab;\n }\n\n if (!tabElement) return;\n\n const container = tabElement.closest('.vd-tabs, [data-tabs]');\n if (!container) return;\n\n const allTabs = container.querySelectorAll('.vd-tab-link, [data-tab]');\n const allPanes = container.querySelectorAll('.vd-tab-pane, [data-tab-pane]');\n\n this.activateTab(container, tabElement, allTabs, allPanes);\n },\n\n /**\n * Destroy a tabs instance and clean up event listeners\n * @param {HTMLElement} container - Tabs container\n */\n destroy: function(container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(container);\n },\n\n /**\n * Destroy all tabs instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, container) => {\n this.destroy(container);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tabs', Tabs);\n }\n\n})();\n", "/**\n * Vanduo Framework - Theme Customizer\n * A comprehensive theme customization component for the navbar\n * Handles primary color, neutral color, radius, font, and color mode\n */\n\n(function () {\n 'use strict';\n\n const ThemeCustomizer = {\n // Storage keys\n STORAGE_KEYS: {\n PRIMARY: 'vanduo-primary-color',\n NEUTRAL: 'vanduo-neutral-color',\n RADIUS: 'vanduo-radius',\n FONT: 'vanduo-font-preference',\n THEME: 'vanduo-theme-preference'\n },\n\n // Default values\n DEFAULTS: {\n PRIMARY_LIGHT: 'black',\n PRIMARY_DARK: 'amber',\n NEUTRAL: 'charcoal',\n RADIUS: '0.5',\n FONT: 'ubuntu',\n THEME: 'system'\n },\n\n // Primary color definitions (Open Color based)\n PRIMARY_COLORS: {\n 'black': { name: 'Black', color: '#000000' },\n 'red': { name: 'Red', color: '#fa5252' },\n 'orange': { name: 'Orange', color: '#fd7e14' },\n 'amber': { name: 'Amber', color: '#f59f00' },\n 'yellow': { name: 'Yellow', color: '#fcc419' },\n 'lime': { name: 'Lime', color: '#82c91e' },\n 'green': { name: 'Green', color: '#40c057' },\n 'emerald': { name: 'Emerald', color: '#20c997' },\n 'teal': { name: 'Teal', color: '#12b886' },\n 'cyan': { name: 'Cyan', color: '#22b8cf' },\n 'sky': { name: 'Sky', color: '#3bc9db' },\n 'blue': { name: 'Blue', color: '#228be6' },\n 'indigo': { name: 'Indigo', color: '#4c6ef5' },\n 'violet': { name: 'Violet', color: '#7950f2' },\n 'purple': { name: 'Purple', color: '#be4bdb' },\n 'fuchsia': { name: 'Fuchsia', color: '#f06595' },\n 'pink': { name: 'Pink', color: '#e64980' },\n 'rose': { name: 'Rose', color: '#ff8787' }\n },\n\n // Neutral color definitions\n NEUTRAL_COLORS: {\n 'charcoal': { name: 'Charcoal', color: '#0d1117' },\n 'slate': { name: 'Slate', color: '#64748b' },\n 'gray': { name: 'Gray', color: '#6b7280' },\n 'zinc': { name: 'Zinc', color: '#71717a' },\n 'neutral': { name: 'Neutral', color: '#737373' },\n 'stone': { name: 'Stone', color: '#78716c' }\n },\n\n // Radius options\n RADIUS_OPTIONS: ['0', '0.125', '0.25', '0.375', '0.5'],\n\n // Font options\n FONT_OPTIONS: {\n 'jetbrains-mono': { name: 'JetBrains Mono', family: \"'JetBrains Mono', monospace\" },\n 'system': { name: 'System Default', family: null },\n 'ubuntu': { name: 'Ubuntu', family: \"'Ubuntu', sans-serif\" },\n 'lato': { name: 'Lato', family: \"'Lato', sans-serif\" },\n 'open-sans': { name: 'Open Sans', family: \"'Open Sans', sans-serif\" }\n },\n\n // Theme mode options\n THEME_MODES: ['system', 'dark', 'light'],\n\n // State\n state: {\n primary: null,\n neutral: null,\n radius: null,\n font: null,\n theme: null,\n isOpen: false\n },\n\n isInitialized: false,\n _cleanup: [],\n _ownsDynamicPanel: false,\n\n // DOM references\n elements: {\n customizer: null,\n trigger: null,\n activeTrigger: null,\n triggers: [],\n panel: null,\n overlay: null\n },\n\n isRoot: function (root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n normalizeRoot: function (root) {\n return this.isRoot(root) ? root : document;\n },\n\n queryAll: function (root, selector) {\n const scope = this.normalizeRoot(root);\n if (typeof window.VanduoLifecycle !== 'undefined' && typeof window.VanduoLifecycle.queryAll === 'function') {\n return window.VanduoLifecycle.queryAll(scope, selector);\n }\n\n const matches = [];\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n return matches;\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n getTriggers: function (root) {\n return this.queryAll(root, '[data-theme-customizer-trigger]');\n },\n\n pruneTriggers: function () {\n this.elements.triggers = this.elements.triggers.filter(function (trigger) {\n return trigger && trigger.isConnected;\n });\n\n if (this.elements.trigger && !this.elements.trigger.isConnected) {\n this.elements.trigger = null;\n }\n\n if (this.elements.activeTrigger && !this.elements.activeTrigger.isConnected) {\n this.elements.activeTrigger = null;\n }\n },\n\n /**\n * Initialize the Theme Customizer\n */\n init: function (root) {\n const scope = this.normalizeRoot(root);\n\n if (this.isInitialized) {\n this.bindExistingElements(scope);\n this.bindTriggerEvents(scope);\n this.bindPanelEvents();\n this.updateUI();\n return;\n }\n\n this.isInitialized = true;\n this._cleanup = [];\n\n this.loadPreferences();\n this.applyAllPreferences();\n this.bindExistingElements(scope);\n this.bindEvents(scope);\n },\n\n addListener: function (target, event, handler, options) {\n if (!target) return;\n target.addEventListener(event, handler, options);\n this._cleanup.push(() => target.removeEventListener(event, handler, options));\n },\n\n /**\n * Get default primary color based on theme\n */\n getDefaultPrimary: function (theme) {\n if (theme === 'system') {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return this.DEFAULTS.PRIMARY_DARK;\n }\n return this.DEFAULTS.PRIMARY_LIGHT;\n }\n return theme === 'dark' ? this.DEFAULTS.PRIMARY_DARK : this.DEFAULTS.PRIMARY_LIGHT;\n },\n\n /**\n * Load preferences from localStorage\n */\n loadPreferences: function () {\n this.state.theme = this.getStorageValue(this.STORAGE_KEYS.THEME, this.DEFAULTS.THEME);\n this.state.primary = this.getStorageValue(this.STORAGE_KEYS.PRIMARY, this.getDefaultPrimary(this.state.theme));\n this._normalizeDefaultPrimaryIfStaleWithStoredTheme();\n this.state.neutral = this.getStorageValue(this.STORAGE_KEYS.NEUTRAL, this.DEFAULTS.NEUTRAL);\n this.state.radius = this.getStorageValue(this.STORAGE_KEYS.RADIUS, this.DEFAULTS.RADIUS);\n this.state.font = this.getStorageValue(this.STORAGE_KEYS.FONT, this.DEFAULTS.FONT);\n },\n\n /**\n * Save a preference to localStorage\n */\n savePreference: function (key, value) {\n this.setStorageValue(key, value);\n },\n\n /**\n * Apply all preferences\n */\n applyAllPreferences: function () {\n this.applyPrimary(this.state.primary);\n this.applyNeutral(this.state.neutral);\n this.applyRadius(this.state.radius);\n this.applyFont(this.state.font);\n this.applyTheme(this.state.theme);\n },\n\n /**\n * Apply primary color\n */\n applyPrimary: function (colorKey) {\n if (!this.PRIMARY_COLORS[colorKey]) {\n colorKey = this.getDefaultPrimary(this.state.theme);\n }\n\n this.state.primary = colorKey;\n document.documentElement.setAttribute('data-primary', colorKey);\n this.savePreference(this.STORAGE_KEYS.PRIMARY, colorKey);\n\n this.dispatchEvent('primary-change', { color: colorKey });\n },\n\n /**\n * Apply neutral color\n */\n applyNeutral: function (neutralKey) {\n if (!this.NEUTRAL_COLORS[neutralKey]) {\n neutralKey = this.DEFAULTS.NEUTRAL;\n }\n\n this.state.neutral = neutralKey;\n document.documentElement.setAttribute('data-neutral', neutralKey);\n this.savePreference(this.STORAGE_KEYS.NEUTRAL, neutralKey);\n\n this.dispatchEvent('neutral-change', { neutral: neutralKey });\n },\n\n /**\n * Apply border radius\n */\n applyRadius: function (radius) {\n if (!this.RADIUS_OPTIONS.includes(radius)) {\n radius = this.DEFAULTS.RADIUS;\n }\n\n this.state.radius = radius;\n document.documentElement.setAttribute('data-radius', radius);\n document.documentElement.style.setProperty('--vd-radius-scale', radius);\n this.savePreference(this.STORAGE_KEYS.RADIUS, radius);\n\n this.dispatchEvent('radius-change', { radius: radius });\n },\n\n /**\n * Apply font family\n */\n applyFont: function (fontKey) {\n if (!this.FONT_OPTIONS[fontKey]) {\n fontKey = this.DEFAULTS.FONT;\n }\n\n this.state.font = fontKey;\n\n if (fontKey === 'system') {\n document.documentElement.removeAttribute('data-font');\n } else {\n document.documentElement.setAttribute('data-font', fontKey);\n }\n\n this.savePreference(this.STORAGE_KEYS.FONT, fontKey);\n\n // Also update the existing FontSwitcher if available\n if (window.FontSwitcher && window.FontSwitcher.setPreference) {\n window.FontSwitcher.state.preference = fontKey;\n window.FontSwitcher.applyFont();\n }\n\n this.dispatchEvent('font-change', { font: fontKey });\n },\n\n /**\n * Apply theme mode\n */\n applyTheme: function (mode) {\n if (!this.THEME_MODES.includes(mode)) {\n mode = this.DEFAULTS.THEME;\n }\n\n // Prevent circular updates\n this._isApplying = true;\n\n // Re-align black/amber when they don't match the effective primary for the target mode.\n // Covers theme toggles and stale localStorage (e.g. amber saved while theme is light).\n if (this.isUsingDefaultPrimary()) {\n const expected = this.getDefaultPrimary(mode);\n if (this.state.primary !== expected) {\n this.applyPrimary(expected);\n }\n }\n\n this.state.theme = mode;\n\n if (mode === 'system') {\n document.documentElement.removeAttribute('data-theme');\n } else {\n document.documentElement.setAttribute('data-theme', mode);\n }\n\n this.savePreference(this.STORAGE_KEYS.THEME, mode);\n\n // Also update the existing ThemeSwitcher if available\n // Only update state, don't call setPreference to avoid circular calls\n if (window.Vanduo && window.Vanduo.components.themeSwitcher) {\n const themeSwitcher = window.Vanduo.components.themeSwitcher;\n if (themeSwitcher.state && themeSwitcher.state.preference !== mode) {\n themeSwitcher.state.preference = mode;\n if (typeof themeSwitcher.setStorageValue === 'function') {\n themeSwitcher.setStorageValue(themeSwitcher.STORAGE_KEY, mode);\n }\n if (typeof themeSwitcher.updateUI === 'function') {\n themeSwitcher.updateUI();\n }\n }\n }\n\n this._isApplying = false;\n this.dispatchEvent('mode-change', { mode: mode });\n },\n\n /**\n * Dispatch custom event\n */\n dispatchEvent: function (type, detail) {\n const event = new CustomEvent('theme:' + type, {\n bubbles: true,\n detail: detail\n });\n document.dispatchEvent(event);\n\n // Also dispatch a general change event\n const changeEvent = new CustomEvent('theme:change', {\n bubbles: true,\n detail: {\n type: type,\n value: detail[Object.keys(detail)[0]],\n state: { ...this.state }\n }\n });\n document.dispatchEvent(changeEvent);\n },\n\n /**\n * Bind to existing DOM elements or create them dynamically\n */\n bindExistingElements: function (root) {\n const scope = this.normalizeRoot(root);\n this.pruneTriggers();\n\n const scopedTriggers = this.getTriggers(scope);\n scopedTriggers.forEach((trigger) => {\n if (!this.elements.triggers.includes(trigger)) {\n this.elements.triggers.push(trigger);\n }\n });\n\n if (!this.elements.trigger && this.elements.triggers.length) {\n this.elements.trigger = this.elements.triggers[0];\n }\n\n const existingCustomizer = this.queryOne(scope, '.vd-theme-customizer')\n || (this.elements.customizer && typeof this.elements.customizer.contains === 'function' ? this.elements.customizer : null)\n || document.querySelector('.vd-theme-customizer');\n\n if (existingCustomizer instanceof Element) {\n this.elements.customizer = existingCustomizer;\n this.elements.trigger = this.elements.customizer.querySelector('.vd-theme-customizer-trigger') || this.elements.trigger;\n this.elements.panel = this.elements.customizer.querySelector('.vd-theme-customizer-panel');\n this.elements.overlay = this.elements.customizer.querySelector('.vd-theme-customizer-overlay');\n } else {\n // Look for standalone trigger buttons with data attribute\n if (scopedTriggers.length && !this.elements.panel) {\n this.createDynamicPanel();\n }\n }\n\n // Update UI to reflect current state\n this.updateUI();\n },\n\n /**\n * Create the panel dynamically when only a trigger button exists\n */\n createDynamicPanel: function () {\n if (!this.elements.triggers.length || (this.elements.panel && this.elements.panel.isConnected)) {\n return;\n }\n this.elements.trigger = this.elements.triggers[0];\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.className = 'vd-theme-customizer-overlay';\n\n // Create panel\n const panel = document.createElement('div');\n panel.className = 'vd-theme-customizer-panel';\n panel.innerHTML = this.getPanelHTML();\n\n // Append to body\n document.body.appendChild(overlay);\n document.body.appendChild(panel);\n\n // Store references\n this.elements.panel = panel;\n this.elements.overlay = overlay;\n this._ownsDynamicPanel = true;\n this.elements.customizer = {\n contains: (el) => panel.contains(el) || this.elements.triggers.some((trigger) => trigger.contains(el))\n };\n\n // Position panel below trigger on desktop\n this.positionPanel();\n\n // Bind panel events after creation\n this.bindPanelEvents();\n\n // Reposition on resize\n this.addListener(window, 'resize', () => this.positionPanel());\n },\n\n /**\n * Position the panel below the trigger button on desktop\n */\n positionPanel: function () {\n if (!this.elements.panel || !this.elements.trigger) return;\n const anchorTrigger = this.elements.activeTrigger || this.elements.trigger;\n\n const isMobile = window.innerWidth < 768;\n\n if (isMobile) {\n // Mobile: full height slide-in from right - let CSS handle it\n this.elements.panel.style.top = '';\n this.elements.panel.style.right = '';\n this.elements.panel.style.left = '';\n this.elements.panel.style.height = '';\n this.elements.panel.style.maxHeight = '';\n } else {\n // Desktop: position directly below the trigger button, aligned to its right edge\n const triggerRect = anchorTrigger.getBoundingClientRect();\n const panelWidth = 320; // --vd-customizer-width\n const panelTop = triggerRect.bottom + 8;\n\n // Calculate right position: align panel's right edge with trigger's right edge\n // But ensure it doesn't overflow the viewport\n const viewportWidth = window.innerWidth;\n let panelRight = viewportWidth - triggerRect.right;\n\n // Ensure panel doesn't overflow left side of viewport\n const panelLeft = viewportWidth - panelRight - panelWidth;\n if (panelLeft < 8) {\n panelRight = viewportWidth - panelWidth - 8;\n }\n\n this.elements.panel.style.top = panelTop + 'px';\n this.elements.panel.style.right = panelRight + 'px';\n this.elements.panel.style.left = '';\n this.elements.panel.style.height = 'auto';\n this.elements.panel.style.maxHeight = 'calc(100vh - ' + panelTop + 'px)';\n }\n },\n\n /**\n * Bind events specifically for the panel (called after dynamic creation)\n */\n bindPanelEvents: function () {\n if (!this.elements.panel) return;\n if (this.elements.panel.getAttribute('data-customizer-initialized') === 'true') return;\n\n this.elements.panel.setAttribute('data-customizer-initialized', 'true');\n\n // Primary color swatches\n this.elements.panel.querySelectorAll('[data-color]').forEach(swatch => {\n this.addListener(swatch, 'click', () => {\n this.applyPrimary(swatch.dataset.color);\n this.updateUI();\n });\n });\n\n // Neutral color swatches\n this.elements.panel.querySelectorAll('[data-neutral]').forEach(swatch => {\n this.addListener(swatch, 'click', () => {\n this.applyNeutral(swatch.dataset.neutral);\n this.updateUI();\n });\n });\n\n // Radius buttons\n this.elements.panel.querySelectorAll('[data-radius]').forEach(btn => {\n this.addListener(btn, 'click', () => {\n this.applyRadius(btn.dataset.radius);\n this.updateUI();\n });\n });\n\n // Font selector\n const fontSelect = this.elements.panel.querySelector('[data-customizer-font]');\n if (fontSelect) {\n this.addListener(fontSelect, 'change', (e) => {\n this.applyFont(e.target.value);\n this.updateUI();\n });\n }\n\n // Reset button\n const resetBtn = this.elements.panel.querySelector('.customizer-reset');\n if (resetBtn) {\n this.addListener(resetBtn, 'click', () => {\n this.reset();\n });\n }\n\n // Mobile close button\n const closeBtn = this.elements.panel.querySelector('.customizer-mobile-close');\n if (closeBtn) {\n this.addListener(closeBtn, 'click', () => {\n this.close();\n });\n }\n\n // Overlay click\n if (this.elements.overlay) {\n this.addListener(this.elements.overlay, 'click', () => {\n this.close();\n });\n }\n },\n\n /**\n * Generate panel HTML\n */\n getPanelHTML: function () {\n const esc = typeof escapeHtml === 'function'\n ? escapeHtml\n : function (text) {\n const div = document.createElement('div');\n div.textContent = String(text ?? '');\n return div.innerHTML;\n };\n const safeColor = function (value) {\n const normalized = String(value ?? '').trim();\n // Allow common color formats used by palette values.\n if (/^(#[0-9a-fA-F]{3,8}|rgb[a]?\\([^)]{1,60}\\)|hsl[a]?\\([^)]{1,60}\\)|var\\(--[a-zA-Z0-9_-]{1,40}\\))$/.test(normalized)) {\n return normalized;\n }\n return '#000000';\n };\n\n // Generate primary color swatches\n let primarySwatches = '';\n for (const [key, value] of Object.entries(this.PRIMARY_COLORS)) {\n primarySwatches += `<button class=\"tc-color-swatch${key === this.state.primary ? ' is-active' : ''}\" data-color=\"${esc(key)}\" style=\"--vd-swatch-color: ${safeColor(value.color)}\" title=\"${esc(value.name)}\"></button>`;\n }\n\n // Generate neutral color swatches\n let neutralSwatches = '';\n for (const [key, value] of Object.entries(this.NEUTRAL_COLORS)) {\n neutralSwatches += `<button class=\"tc-neutral-swatch${key === this.state.neutral ? ' is-active' : ''}\" data-neutral=\"${esc(key)}\" style=\"--vd-swatch-color: ${safeColor(value.color)}\" title=\"${esc(value.name)}\"><span>${esc(value.name)}</span></button>`;\n }\n\n // Generate radius buttons\n let radiusButtons = '';\n this.RADIUS_OPTIONS.forEach(r => {\n radiusButtons += `<button class=\"tc-radius-btn${r === this.state.radius ? ' is-active' : ''}\" data-radius=\"${esc(r)}\">${esc(r)}</button>`;\n });\n\n // Generate font options\n let fontOptions = '';\n for (const [key, value] of Object.entries(this.FONT_OPTIONS)) {\n fontOptions += `<option value=\"${esc(key)}\"${key === this.state.font ? ' selected' : ''}>${esc(value.name)}</option>`;\n }\n\n return `\n <div class=\"tc-header\">\n <h3 class=\"tc-title\">Customize Theme</h3>\n <button class=\"customizer-mobile-close\" aria-label=\"Close\">\n <i class=\"ph ph-x\"></i>\n </button>\n </div>\n <div class=\"tc-body\">\n\n <div class=\"tc-section\">\n <label class=\"tc-label\">Primary Color</label>\n <div class=\"tc-color-grid\">\n ${primarySwatches}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Neutral Color</label>\n <div class=\"tc-neutral-grid\">\n ${neutralSwatches}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Border Radius</label>\n <div class=\"tc-radius-group\">\n ${radiusButtons}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Font Family</label>\n <select class=\"tc-font-select\" data-customizer-font>\n ${fontOptions}\n </select>\n </div>\n </div>\n <div class=\"tc-footer\">\n <button class=\"customizer-reset btn btn-sm btn-outline\">Reset to Defaults</button>\n </div>\n `;\n },\n\n /**\n * Bind event listeners\n */\n /**\n * Check whether the current primary color is one of the auto-defaults\n * (i.e. the user hasn't explicitly picked a non-default color).\n */\n isUsingDefaultPrimary: function () {\n return this.state.primary === this.DEFAULTS.PRIMARY_LIGHT ||\n this.state.primary === this.DEFAULTS.PRIMARY_DARK;\n },\n\n /**\n * When primary is still one of the auto-default palette keys (black/amber) but\n * localStorage was written under a different theme (or OS changed in system mode),\n * align in-memory state before applyAllPreferences runs \u2014 avoids amber+light / black+dark drift.\n */\n _normalizeDefaultPrimaryIfStaleWithStoredTheme: function () {\n if (!this.isUsingDefaultPrimary()) {\n return;\n }\n const expected = this.getDefaultPrimary(this.state.theme);\n if (this.state.primary !== expected) {\n this.state.primary = expected;\n }\n },\n\n bindEvents: function (root) {\n this.bindTriggerEvents(root);\n\n this.bindPanelEvents();\n\n // Listen for OS dark/light changes so we can swap the default primary\n if (window.matchMedia) {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => {\n if (this.state.theme === 'system' && this.isUsingDefaultPrimary()) {\n const newDefault = this.getDefaultPrimary('system');\n if (newDefault !== this.state.primary) {\n this.applyPrimary(newDefault);\n this.updateUI();\n }\n }\n };\n mq.addEventListener('change', handler);\n this._cleanup.push(() => mq.removeEventListener('change', handler));\n }\n\n // Close on outside click\n this.addListener(document, 'click', (e) => {\n if (this.state.isOpen && this.elements.customizer && !this.elements.customizer.contains(e.target)) {\n this.close();\n }\n });\n\n // Close on Escape key\n this.addListener(document, 'keydown', (e) => {\n if (e.key === 'Escape' && this.state.isOpen) {\n this.close();\n }\n });\n },\n\n bindTriggerEvents: function (root) {\n const triggers = root ? this.getTriggers(root) : this.elements.triggers;\n triggers.forEach((trigger) => {\n if (trigger.getAttribute('data-customizer-trigger-initialized') === 'true') {\n return;\n }\n\n const onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.elements.activeTrigger = trigger;\n this.elements.trigger = trigger;\n this.toggle();\n };\n\n trigger.addEventListener('click', onClick);\n trigger._themeCustomizerTriggerHandler = onClick;\n trigger.setAttribute('data-customizer-trigger-initialized', 'true');\n });\n },\n\n cleanupTrigger: function (trigger) {\n if (!trigger || trigger.getAttribute('data-customizer-trigger-initialized') !== 'true') {\n return;\n }\n\n if (trigger._themeCustomizerTriggerHandler) {\n trigger.removeEventListener('click', trigger._themeCustomizerTriggerHandler);\n delete trigger._themeCustomizerTriggerHandler;\n }\n\n trigger.setAttribute('aria-expanded', 'false');\n trigger.removeAttribute('data-customizer-trigger-initialized');\n\n if (this.elements.activeTrigger === trigger) {\n this.elements.activeTrigger = null;\n }\n\n this.elements.triggers = this.elements.triggers.filter(function (candidate) {\n return candidate !== trigger;\n });\n\n if (this.elements.trigger === trigger) {\n this.elements.trigger = this.elements.triggers[0] || null;\n }\n },\n\n /**\n * Toggle panel open/close\n */\n toggle: function () {\n if (this.state.isOpen) {\n this.close();\n } else {\n this.open();\n }\n },\n\n /**\n * Open the panel\n */\n open: function () {\n this.state.isOpen = true;\n\n // Ensure panel is positioned correctly before opening\n this.positionPanel();\n\n if (this.elements.panel) {\n this.elements.panel.classList.add('is-open');\n }\n this.elements.triggers.forEach((trigger) => trigger.setAttribute('aria-expanded', 'false'));\n if (this.elements.trigger) this.elements.trigger.setAttribute('aria-expanded', 'true');\n if (this.elements.overlay) {\n this.elements.overlay.classList.add('is-active');\n }\n\n this.dispatchEvent('panel-open', { isOpen: true });\n },\n\n /**\n * Close the panel\n */\n close: function () {\n this.state.isOpen = false;\n\n if (this.elements.panel) {\n this.elements.panel.classList.remove('is-open');\n }\n this.elements.triggers.forEach((trigger) => trigger.setAttribute('aria-expanded', 'false'));\n if (this.elements.overlay) {\n this.elements.overlay.classList.remove('is-active');\n }\n\n this.dispatchEvent('panel-close', { isOpen: false });\n },\n\n /**\n * Update UI to reflect current state\n */\n updateUI: function () {\n if (!this.elements.panel) return;\n\n // Update primary color swatches\n this.elements.panel.querySelectorAll('[data-color]').forEach(swatch => {\n swatch.classList.toggle('is-active', swatch.dataset.color === this.state.primary);\n });\n\n // Update neutral color swatches\n this.elements.panel.querySelectorAll('[data-neutral]').forEach(swatch => {\n swatch.classList.toggle('is-active', swatch.dataset.neutral === this.state.neutral);\n });\n\n // Update radius buttons\n this.elements.panel.querySelectorAll('[data-radius]').forEach(btn => {\n btn.classList.toggle('is-active', btn.dataset.radius === this.state.radius);\n });\n\n // Update font selector\n const fontSelect = this.elements.panel.querySelector('[data-customizer-font]');\n if (fontSelect) {\n fontSelect.value = this.state.font;\n }\n\n },\n\n /**\n * Reset all preferences to defaults\n */\n reset: function () {\n this.applyTheme(this.DEFAULTS.THEME);\n this.applyPrimary(this.getDefaultPrimary(this.DEFAULTS.THEME));\n this.applyNeutral(this.DEFAULTS.NEUTRAL);\n this.applyRadius(this.DEFAULTS.RADIUS);\n this.applyFont(this.DEFAULTS.FONT);\n this.updateUI();\n\n this.dispatchEvent('reset', { state: { ...this.state } });\n },\n\n /**\n * Get current state\n */\n getState: function () {\n return { ...this.state };\n },\n\n /**\n * Programmatically set preferences\n */\n setPreferences: function (prefs) {\n if (prefs.primary) this.applyPrimary(prefs.primary);\n if (prefs.neutral) this.applyNeutral(prefs.neutral);\n if (prefs.radius) this.applyRadius(prefs.radius);\n if (prefs.font) this.applyFont(prefs.font);\n if (prefs.theme) this.applyTheme(prefs.theme);\n this.updateUI();\n },\n\n getStorageValue: function (key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function (key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n },\n\n destroyAll: function (root) {\n const scope = this.normalizeRoot(root);\n\n if (scope !== document) {\n this.getTriggers(scope).forEach((trigger) => {\n this.cleanupTrigger(trigger);\n });\n this.pruneTriggers();\n\n if (!this.elements.triggers.length) {\n this.destroyAll(document);\n }\n return;\n }\n\n this._cleanup.forEach(fn => fn());\n this._cleanup = [];\n\n if (this.elements.panel) {\n this.elements.panel.removeAttribute('data-customizer-initialized');\n }\n\n this.elements.triggers.slice().forEach((trigger) => {\n this.cleanupTrigger(trigger);\n });\n\n if (this._ownsDynamicPanel) {\n if (this.elements.panel && this.elements.panel.parentNode) {\n this.elements.panel.parentNode.removeChild(this.elements.panel);\n }\n if (this.elements.overlay && this.elements.overlay.parentNode) {\n this.elements.overlay.parentNode.removeChild(this.elements.overlay);\n }\n this._ownsDynamicPanel = false;\n }\n\n this.close();\n this.elements.customizer = null;\n this.elements.trigger = null;\n this.elements.activeTrigger = null;\n this.elements.triggers = [];\n this.elements.panel = null;\n this.elements.overlay = null;\n this.isInitialized = false;\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('themeCustomizer', ThemeCustomizer);\n }\n\n // Expose globally for convenience\n window.ThemeCustomizer = ThemeCustomizer;\n})();\n", "/**\n * Vanduo Framework - Theme Switcher\n * Handles light/dark/system theme toggling and persistence\n */\n\n(function () {\n 'use strict';\n\n const ThemeSwitcher = {\n isInitialized: false,\n _mediaQuery: null,\n _onMediaChange: null,\n\n getToggles: function (root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-toggle=\"theme\"]');\n }\n\n return Array.from(document.querySelectorAll('[data-toggle=\"theme\"]'));\n },\n\n init: function (root) {\n this.STORAGE_KEY = 'vanduo-theme-preference';\n this.state = {\n preference: this.getPreference() // 'light', 'dark', or 'system'\n };\n\n if (this.isInitialized) {\n this.applyTheme();\n this.renderUI(root);\n this.updateUI(root);\n return;\n }\n\n this.isInitialized = true;\n\n this.applyTheme();\n this.listenForSystemChanges();\n this.renderUI(root);\n },\n\n getPreference: function () {\n return this.getStorageValue(this.STORAGE_KEY, 'system');\n },\n\n setPreference: function (pref) {\n this.state.preference = pref;\n this.setStorageValue(this.STORAGE_KEY, pref);\n this.applyTheme();\n \n // Coordinate with ThemeCustomizer for primary color swap if available\n // Check _isApplying flag to prevent circular updates\n if (window.ThemeCustomizer && window.ThemeCustomizer.applyTheme && !window.ThemeCustomizer._isApplying) {\n window.ThemeCustomizer.applyTheme(pref);\n }\n \n this.updateUI();\n },\n\n getStorageValue: function (key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function (key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n },\n\n applyTheme: function () {\n const pref = this.state.preference;\n\n if (pref === 'system') {\n // When in system mode, we remove the data attribute to let the media query take over\n // or we can explicitly set it. Explicitly setting it ensures consistency if we rely on [data-theme]\n // But if we rely on @media in CSS, we might want to remove attributes.\n // However, our CSS strategy uses :root:not([data-theme=\"light\"]) inside media query for system dark fallback\n // which is a bit complex.\n\n // Simpler approach: \n // If preference is system, REMOVE data-theme attribute. Let CSS media queries handle it.\n document.documentElement.removeAttribute('data-theme');\n } else {\n document.documentElement.setAttribute('data-theme', pref);\n }\n },\n\n listenForSystemChanges: function () {\n if (this._mediaQuery && this._onMediaChange) {\n return;\n }\n\n this._mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n this._onMediaChange = _e => {\n if (this.state.preference === 'system') {\n // Re-apply (effectively just to ensure consistency, though removing attribute usually suffices)\n this.applyTheme();\n // Keep default primary (black/amber) aligned when OS scheme changes while in system mode\n if (window.ThemeCustomizer && typeof window.ThemeCustomizer.applyTheme === 'function' && !window.ThemeCustomizer._isApplying) {\n window.ThemeCustomizer.applyTheme('system');\n }\n }\n };\n this._mediaQuery.addEventListener('change', this._onMediaChange);\n },\n\n // Helper to facilitate UI creation if needed, though often UI is in HTML\n renderUI: function (root) {\n // Look for any uninitialized theme toggles\n const toggles = this.getToggles(root);\n toggles.forEach(toggle => {\n if (toggle.getAttribute('data-theme-initialized') === 'true') {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n }\n return;\n }\n\n // Simplified UI Binding - assumes a select or a button cycle\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n const onChange = (e) => {\n this.setPreference(e.target.value);\n };\n toggle.addEventListener('change', onChange);\n toggle._themeToggleHandler = onChange;\n } else {\n // Button implementation (cycle)\n const onClick = () => {\n const modes = ['system', 'light', 'dark'];\n const nextIndex = (modes.indexOf(this.state.preference) + 1) % modes.length;\n this.setPreference(modes[nextIndex]);\n };\n toggle.addEventListener('click', onClick);\n toggle._themeToggleHandler = onClick;\n }\n // Mark as initialized\n toggle.setAttribute('data-theme-initialized', 'true');\n });\n },\n\n updateUI: function (root) {\n const toggles = this.getToggles(root);\n toggles.forEach(toggle => {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n } else {\n // Update button text/icon if needed\n // e.g. toggle.textContent = this.state.preference;\n // For now, assume the user handles visual state or generic text\n\n // If there is an icon or text span inside, update it\n const span = toggle.querySelector('.theme-current-label');\n if (span) {\n span.textContent = this.state.preference.charAt(0).toUpperCase() + this.state.preference.slice(1);\n }\n }\n });\n },\n\n destroyAll: function (root) {\n const scope = root || document;\n const toggles = this.getToggles(scope).filter(function (toggle) {\n return toggle.getAttribute('data-theme-initialized') === 'true';\n });\n toggles.forEach(toggle => {\n if (toggle._themeToggleHandler) {\n const eventName = toggle.tagName === 'SELECT' ? 'change' : 'click';\n toggle.removeEventListener(eventName, toggle._themeToggleHandler);\n delete toggle._themeToggleHandler;\n }\n toggle.removeAttribute('data-theme-initialized');\n });\n\n if (scope === document && this._mediaQuery && this._onMediaChange) {\n this._mediaQuery.removeEventListener('change', this._onMediaChange);\n }\n\n if (scope === document) {\n this._mediaQuery = null;\n this._onMediaChange = null;\n this.isInitialized = false;\n }\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('themeSwitcher', ThemeSwitcher);\n }\n})();\n", "/**\n * Vanduo Framework - Toast Component\n * Popup notifications for user feedback\n */\n\n(function() {\n 'use strict';\n\n /**\n * Toast Component\n */\n const Toast = {\n // Default options\n defaults: {\n position: 'top-right',\n duration: 5000,\n dismissible: true,\n showProgress: true,\n pauseOnHover: true\n },\n\n // Container cache\n containers: {},\n\n /**\n * Get or create a toast container for a position\n * @param {string} position - Container position\n * @returns {HTMLElement} Toast container element\n */\n getContainer: function(position) {\n if (this.containers[position]) {\n return this.containers[position];\n }\n\n const container = document.createElement('div');\n container.className = `vd-toast-container vd-toast-container-${position}`;\n container.setAttribute('role', 'status');\n container.setAttribute('aria-live', 'polite');\n container.setAttribute('aria-atomic', 'false');\n document.body.appendChild(container);\n this.containers[position] = container;\n\n return container;\n },\n\n /**\n * Show a toast notification\n * @param {Object|string} options - Toast options or message string\n * @param {string} [type] - Toast type (success, error, warning, info)\n * @param {number} [duration] - Auto-dismiss duration in ms\n * @returns {HTMLElement} Toast element\n */\n show: function(options, type, duration) {\n // Support simple API:\n // - Toast.show('Message', 'success', 3000)\n // - Toast.show('Message', { type: 'success', duration: 3000 })\n if (typeof options === 'string') {\n if (type && typeof type === 'object') {\n options = Object.assign({}, type, {\n message: options\n });\n } else {\n options = {\n message: options,\n type: type,\n duration: duration\n };\n }\n }\n\n const config = Object.assign({}, this.defaults, options);\n const container = this.getContainer(config.position);\n\n // Create toast element\n const toast = document.createElement('div');\n toast.className = 'vd-toast';\n\n if (config.type) {\n toast.classList.add(`vd-toast-${config.type}`);\n }\n\n if (config.solid) {\n toast.classList.add('vd-toast-solid');\n }\n\n if (config.showProgress && config.duration > 0) {\n toast.classList.add('vd-toast-with-progress');\n }\n\n // Build toast content\n let html = '';\n\n // Icon (sanitize custom icons, default icons are trusted SVG)\n if (config.icon) {\n const allowSvg = config.iconAllowSvg === true;\n const safeIcon = typeof sanitizeHtml === 'function'\n ? sanitizeHtml(config.icon, { allowSvg, allowStyle: false })\n : escapeHtml(config.icon);\n html += `<span class=\"vd-toast-icon\">${safeIcon}</span>`;\n } else if (config.type) {\n html += `<span class=\"vd-toast-icon\">${this.getDefaultIcon(config.type)}</span>`;\n }\n\n // Local escape helper \u2014 guarantees HTML-safe output even if the\n // global escapeHtml utility is not loaded in the current bundle.\n const _esc = typeof escapeHtml === 'function'\n ? escapeHtml\n : function (s) {\n const d = document.createElement('div');\n d.appendChild(document.createTextNode(s));\n return d.innerHTML;\n };\n\n // Content (escape text to prevent injection)\n html += '<div class=\"vd-toast-content\">';\n if (config.title) {\n html += `<div class=\"vd-toast-title\">${_esc(String(config.title))}</div>`;\n }\n if (config.message) {\n html += `<div class=\"vd-toast-message\">${_esc(String(config.message))}</div>`;\n }\n html += '</div>';\n\n // Close button\n if (config.dismissible) {\n html += '<button type=\"button\" class=\"vd-toast-close\" aria-label=\"Close\"></button>';\n }\n\n // Progress bar\n if (config.showProgress && config.duration > 0) {\n const safeDuration = parseInt(config.duration, 10) || 0;\n html += `<div class=\"vd-toast-progress\" style=\"animation-duration: ${safeDuration}ms\"></div>`;\n }\n\n toast.innerHTML = html;\n\n // Add to container\n container.appendChild(toast);\n\n toast._toastCleanup = [];\n\n // Set up close button handler\n if (config.dismissible) {\n const closeBtn = toast.querySelector('.vd-toast-close');\n const onClose = () => {\n this.dismiss(toast);\n };\n closeBtn.addEventListener('click', onClose);\n toast._toastCleanup.push(() => closeBtn.removeEventListener('click', onClose));\n }\n\n // Pause on hover\n let timeoutId = null;\n let remainingTime = config.duration;\n let startTime = null;\n\n const startTimer = () => {\n if (config.duration > 0) {\n startTime = Date.now();\n timeoutId = setTimeout(() => {\n this.dismiss(toast);\n }, remainingTime);\n toast._toastTimeoutId = timeoutId;\n\n // Resume progress animation\n const progress = toast.querySelector('.vd-toast-progress');\n if (progress) {\n progress.style.animationPlayState = 'running';\n }\n }\n };\n\n const pauseTimer = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n toast._toastTimeoutId = null;\n remainingTime -= Date.now() - startTime;\n\n // Pause progress animation\n const progress = toast.querySelector('.vd-toast-progress');\n if (progress) {\n progress.style.animationPlayState = 'paused';\n }\n }\n };\n\n if (config.pauseOnHover) {\n toast.addEventListener('mouseenter', pauseTimer);\n toast.addEventListener('mouseleave', startTimer);\n toast._toastCleanup.push(\n () => toast.removeEventListener('mouseenter', pauseTimer),\n () => toast.removeEventListener('mouseleave', startTimer)\n );\n }\n\n // Trigger enter animation\n requestAnimationFrame(() => {\n toast.classList.add('is-visible');\n startTimer();\n });\n\n // Store config on element for later access\n toast._toastConfig = config;\n\n // Dispatch show event\n const showEvent = new CustomEvent('toast:show', {\n bubbles: true,\n detail: { toast, config }\n });\n toast.dispatchEvent(showEvent);\n\n return toast;\n },\n\n /**\n * Dismiss a toast\n * @param {HTMLElement} toast - Toast element to dismiss\n */\n dismiss: function(toast) {\n if (!toast || toast.classList.contains('is-exiting')) return;\n\n if (toast._toastTimeoutId) {\n clearTimeout(toast._toastTimeoutId);\n toast._toastTimeoutId = null;\n }\n\n toast.classList.remove('is-visible');\n toast.classList.add('is-exiting');\n\n // Dispatch dismiss event\n const dismissEvent = new CustomEvent('toast:dismiss', {\n bubbles: true,\n detail: { toast }\n });\n toast.dispatchEvent(dismissEvent);\n\n // Remove after animation\n const handleTransitionEnd = () => {\n toast.removeEventListener('transitionend', handleTransitionEnd);\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n };\n\n toast.addEventListener('transitionend', handleTransitionEnd);\n\n // Fallback removal if transition doesn't fire\n setTimeout(() => {\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n }, 400);\n },\n\n /**\n * Destroy all toasts and containers\n */\n destroyAll: function() {\n Object.keys(this.containers).forEach(position => {\n const container = this.containers[position];\n if (!container) return;\n\n const toasts = container.querySelectorAll('.vd-toast');\n toasts.forEach(toast => {\n if (toast._toastTimeoutId) {\n clearTimeout(toast._toastTimeoutId);\n }\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n });\n\n if (container.parentElement) {\n container.parentElement.removeChild(container);\n }\n });\n\n this.containers = {};\n },\n\n /**\n * Dismiss all toasts\n * @param {string} [position] - Optional position to clear (clears all if not specified)\n */\n dismissAll: function(position) {\n if (position && this.containers[position]) {\n const toasts = this.containers[position].querySelectorAll('.vd-toast');\n toasts.forEach(toast => this.dismiss(toast));\n } else {\n Object.values(this.containers).forEach(container => {\n const toasts = container.querySelectorAll('.vd-toast');\n toasts.forEach(toast => this.dismiss(toast));\n });\n }\n },\n\n /**\n * Get default icon SVG for a type\n * @param {string} type - Toast type\n * @returns {string} SVG icon markup\n */\n getDefaultIcon: function(type) {\n const icons = {\n 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>',\n 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>',\n 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>',\n 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>'\n };\n\n return icons[type] || '';\n },\n\n /**\n * Convenience methods for common toast types\n */\n success: function(message, options) {\n return this.show(Object.assign({ message, type: 'success' }, options));\n },\n\n error: function(message, options) {\n return this.show(Object.assign({ message, type: 'error' }, options));\n },\n\n warning: function(message, options) {\n return this.show(Object.assign({ message, type: 'warning' }, options));\n },\n\n info: function(message, options) {\n return this.show(Object.assign({ message, type: 'info' }, options));\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('toast', Toast);\n }\n\n // Also expose globally for convenience\n window.Toast = Toast;\n\n})();\n", "/**\n * Vanduo Framework - Tooltips Component\n * JavaScript functionality for tooltips\n */\n\n(function () {\n 'use strict';\n\n /**\n * Tooltips Component\n */\n const Tooltips = {\n tooltips: new Map(),\n delayTimers: new Map(),\n\n /**\n * Sanitize HTML \u2014 delegates to shared sanitizeHtml from helpers.js\n * @param {string} input\n * @param {{ allowSvg?: boolean }} [options]\n * @returns {string} sanitized HTML\n */\n sanitizeHtml: function (input, options) {\n if (typeof sanitizeHtml === 'function') {\n return sanitizeHtml(input, options);\n }\n // Fallback: content originates from developer-authored data attributes,\n // so returning it as-is is no worse than any other inline HTML.\n return input || '';\n },\n\n /**\n * Initialize tooltips\n */\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '[data-tooltip], [data-tooltip-html]');\n\n elements.forEach(element => {\n if (this.tooltips.has(element)) {\n return;\n }\n this.initTooltip(element);\n });\n },\n\n /**\n * Initialize a single tooltip\n * @param {HTMLElement} element - Element with tooltip\n */\n initTooltip: function (element) {\n const tooltip = this.createTooltip(element);\n const cleanupFunctions = [];\n\n // Show on hover/focus\n const enterHandler = () => { this.showTooltip(element, tooltip); };\n const leaveHandler = () => { this.hideTooltip(element, tooltip); };\n const focusHandler = () => { this.showTooltip(element, tooltip); };\n const blurHandler = () => { this.hideTooltip(element, tooltip); };\n\n element.addEventListener('mouseenter', enterHandler);\n element.addEventListener('mouseleave', leaveHandler);\n element.addEventListener('focus', focusHandler);\n element.addEventListener('blur', blurHandler);\n\n cleanupFunctions.push(\n () => element.removeEventListener('mouseenter', enterHandler),\n () => element.removeEventListener('mouseleave', leaveHandler),\n () => element.removeEventListener('focus', focusHandler),\n () => element.removeEventListener('blur', blurHandler)\n );\n\n this.tooltips.set(element, { tooltip, cleanup: cleanupFunctions });\n },\n\n /**\n * Create tooltip element\n * @param {HTMLElement} element - Target element\n * @returns {HTMLElement} Tooltip element\n */\n createTooltip: function (element) {\n const tooltip = document.createElement('div');\n tooltip.className = 'vd-tooltip';\n tooltip.setAttribute('role', 'tooltip');\n tooltip.setAttribute('aria-hidden', 'true');\n\n // Generate unique ID and link via aria-describedby\n const tooltipId = 'tooltip-' + Math.random().toString(36).substr(2, 9);\n tooltip.id = tooltipId;\n element.setAttribute('aria-describedby', tooltipId);\n\n // Get content\n const htmlContent = element.dataset.tooltipHtml;\n const textContent = element.dataset.tooltip;\n\n if (htmlContent) {\n const allowSvg = element.hasAttribute('data-tooltip-allow-svg');\n tooltip.innerHTML = this.sanitizeHtml(htmlContent, { allowSvg, allowStyle: false });\n tooltip.classList.add('vd-tooltip-html');\n } else if (textContent) {\n tooltip.textContent = textContent;\n }\n\n // Get placement\n const placement = element.dataset.tooltipPlacement || element.dataset.placement || 'top';\n tooltip.setAttribute('data-placement', placement);\n tooltip.classList.add(`vd-tooltip-${placement}`);\n\n // Get variant\n if (element.dataset.tooltipVariant) {\n tooltip.classList.add(`vd-tooltip-${element.dataset.tooltipVariant}`);\n }\n\n // Get size\n if (element.dataset.tooltipSize) {\n tooltip.classList.add(`vd-tooltip-${element.dataset.tooltipSize}`);\n }\n\n // Get delay\n const delay = parseInt(element.dataset.tooltipDelay) || 0;\n tooltip.dataset.delay = delay;\n\n document.body.appendChild(tooltip);\n\n return tooltip;\n },\n\n /**\n * Show tooltip\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n showTooltip: function (element, tooltip) {\n const delay = parseInt(tooltip.dataset.delay) || 0;\n\n if (delay > 0) {\n const timer = setTimeout(() => {\n this.positionTooltip(element, tooltip);\n tooltip.classList.add('is-visible');\n tooltip.setAttribute('aria-hidden', 'false');\n }, delay);\n this.delayTimers.set(element, timer);\n } else {\n this.positionTooltip(element, tooltip);\n tooltip.classList.add('is-visible');\n tooltip.setAttribute('aria-hidden', 'false');\n }\n },\n\n /**\n * Hide tooltip\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n hideTooltip: function (element, tooltip) {\n // Clear delay timer if exists\n const timer = this.delayTimers.get(element);\n if (timer) {\n clearTimeout(timer);\n this.delayTimers.delete(element);\n }\n\n tooltip.classList.remove('is-visible');\n tooltip.setAttribute('aria-hidden', 'true');\n },\n\n /**\n * Position tooltip relative to element\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n positionTooltip: function (element, tooltip) {\n const placement = tooltip.dataset.placement || 'top';\n const rect = element.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'top':\n top = rect.top + scrollTop - tooltipRect.height - 8;\n left = rect.left + scrollLeft + (rect.width / 2) - (tooltipRect.width / 2);\n break;\n case 'bottom':\n top = rect.bottom + scrollTop + 8;\n left = rect.left + scrollLeft + (rect.width / 2) - (tooltipRect.width / 2);\n break;\n case 'left':\n top = rect.top + scrollTop + (rect.height / 2) - (tooltipRect.height / 2);\n left = rect.left + scrollLeft - tooltipRect.width - 8;\n break;\n case 'right':\n top = rect.top + scrollTop + (rect.height / 2) - (tooltipRect.height / 2);\n left = rect.right + scrollLeft + 8;\n break;\n }\n\n // Prevent overflow\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n if (left < padding) {\n left = padding;\n } else if (left + tooltipRect.width > viewportWidth - padding) {\n left = viewportWidth - tooltipRect.width - padding;\n }\n\n if (top < scrollTop + padding) {\n top = scrollTop + padding;\n } else if (top + tooltipRect.height > scrollTop + viewportHeight - padding) {\n top = scrollTop + viewportHeight - tooltipRect.height - padding;\n }\n\n // Use single style assignment with transform for better performance\n tooltip.style.cssText = `position: absolute; top: 0; left: 0; transform: translate(${left}px, ${top}px);`;\n },\n\n /**\n * Show tooltip programmatically\n * @param {HTMLElement|string} element - Target element or selector\n */\n show: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n this.showTooltip(el, tooltip);\n }\n },\n\n /**\n * Hide tooltip programmatically\n * @param {HTMLElement|string} element - Target element or selector\n */\n hide: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n this.hideTooltip(el, tooltip);\n }\n },\n\n /**\n * Update tooltip content\n * @param {HTMLElement|string} element - Target element or selector\n * @param {string} content - New content\n * @param {boolean} isHtml - Whether content is HTML\n */\n update: function (element, content, isHtml = false) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n if (isHtml) {\n const allowSvg = el.hasAttribute('data-tooltip-allow-svg');\n tooltip.innerHTML = this.sanitizeHtml(content, { allowSvg, allowStyle: false });\n tooltip.classList.add('vd-tooltip-html');\n } else {\n tooltip.textContent = content;\n tooltip.classList.remove('vd-tooltip-html');\n }\n }\n },\n\n /**\n * Destroy a tooltip instance and clean up\n * @param {HTMLElement} element - Element with tooltip\n */\n destroy: function (element) {\n const data = this.tooltips.get(element);\n if (!data) return;\n\n // Clear any pending timer\n const timer = this.delayTimers.get(element);\n if (timer) {\n clearTimeout(timer);\n this.delayTimers.delete(element);\n }\n\n data.cleanup.forEach(fn => fn());\n\n // Remove tooltip element from DOM\n if (data.tooltip && data.tooltip.parentNode) {\n data.tooltip.parentNode.removeChild(data.tooltip);\n }\n\n this.tooltips.delete(element);\n },\n\n /**\n * Destroy all tooltip instances\n */\n destroyAll: function () {\n this.tooltips.forEach((data, element) => {\n this.destroy(element);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tooltips', Tooltips);\n }\n\n // Expose globally\n window.VanduoTooltips = Tooltips;\n\n})();\n", "/**\n * Vanduo Framework - Search Component\n * Client-side search functionality for content pages\n * \n * @example Basic usage (initialize with defaults)\n * // HTML:\n * // <div class=\"doc-search\">\n * // <input type=\"search\" class=\"doc-search-input\" placeholder=\"Search...\">\n * // <div class=\"vd-doc-search-results\"></div>\n * // </div>\n * \n * @example Custom configuration\n * var search = Search.create({\n * containerSelector: '.my-search',\n * contentSelector: 'article[id]',\n * titleSelector: 'h2, h3',\n * maxResults: 5,\n * onSelect: function(result) {\n * console.log('Selected:', result.title);\n * }\n * });\n * \n * @example With custom data source\n * var search = Search.create({\n * containerSelector: '.my-search',\n * data: [\n * { id: 'item1', title: 'First Item', content: 'Description...', category: 'Category A' },\n * { id: 'item2', title: 'Second Item', content: 'Description...', category: 'Category B' }\n * ]\n * });\n */\n\n(function() {\n 'use strict';\n\n /**\n * Default configuration\n */\n const DEFAULTS = {\n // Behavior\n minQueryLength: 2,\n maxResults: 10,\n debounceMs: 150,\n highlightTag: 'mark',\n keyboardShortcut: true, // Enable Cmd/Ctrl+K shortcut\n \n // Selectors (for DOM-based indexing)\n containerSelector: '.vd-doc-search',\n inputSelector: '.vd-doc-search-input',\n resultsSelector: '.vd-doc-search-results',\n contentSelector: '.doc-content section[id]',\n titleSelector: '.demo-title, h2, h3',\n navSelector: '.doc-nav-link',\n sectionSelector: '.doc-nav-section',\n \n // Content extraction\n excludeFromContent: 'pre, code, script, style',\n maxContentLength: 500,\n \n // Custom data source (alternative to DOM indexing)\n data: null,\n \n // Category icons mapping\n categoryIcons: {\n 'getting-started': 'ph-rocket-launch',\n 'core': 'ph-cube',\n 'components': 'ph-puzzle-piece',\n 'interactive': 'ph-cursor-click',\n 'data-display': 'ph-table',\n 'feedback': 'ph-bell',\n 'meta': 'ph-info',\n 'default': 'ph-file-text'\n },\n \n // Callbacks\n onSelect: null, // function(result) - called when result is selected\n onSearch: null, // function(query, results) - called after search\n onOpen: null, // function() - called when results open\n onClose: null, // function() - called when results close\n \n // Text customization\n emptyTitle: 'No results found',\n emptyText: 'Try different keywords or check spelling',\n placeholder: 'Search...'\n };\n\n const ALLOWED_HIGHLIGHT_TAGS = {\n mark: true,\n span: true,\n strong: true,\n em: true\n };\n\n function isRoot(value) {\n return typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.isRoot(value);\n }\n\n function normalizeRoot(root) {\n return isRoot(root) ? root : document;\n }\n\n function normalizeHighlightTag(tagName) {\n const normalized = typeof tagName === 'string' ? tagName.toLowerCase() : 'mark';\n return ALLOWED_HIGHLIGHT_TAGS[normalized] ? normalized : 'mark';\n }\n\n /**\n * Search Component Factory\n * Creates a new search instance with the given configuration\n * \n * @param {Object} options - Configuration options\n * @returns {Object} Search instance\n */\n function createSearch(options) {\n const config = Object.assign({}, DEFAULTS, options || {});\n config.root = normalizeRoot(config.root);\n config.highlightTag = normalizeHighlightTag(config.highlightTag);\n \n // Instance state\n const state = {\n initialized: false,\n index: [],\n results: [],\n activeIndex: -1,\n isOpen: false,\n query: '',\n container: null,\n input: null,\n resultsContainer: null,\n debounceTimer: null,\n boundHandlers: {}\n };\n\n function queryAll(selector) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(config.root, selector);\n }\n\n const scope = normalizeRoot(config.root);\n if (scope === document) {\n return Array.from(document.querySelectorAll(selector));\n }\n\n const matches = [];\n if (scope instanceof Element && scope.matches(selector)) {\n matches.push(scope);\n }\n return matches.concat(Array.from(scope.querySelectorAll(selector)));\n }\n\n function queryOne(selector) {\n const matches = queryAll(selector);\n return matches.length ? matches[0] : null;\n }\n\n function safeInvokeCallback(name, fn, ...args) {\n try {\n fn(...args);\n } catch (error) {\n console.warn('[Vanduo Search] Callback error in \"' + name + '\":', error);\n }\n }\n\n function setResultsHtml(html) {\n if (!state.resultsContainer) return;\n try {\n state.resultsContainer.innerHTML = html;\n } catch (error) {\n console.warn('[Vanduo Search] Failed to render results:', error);\n }\n }\n\n /**\n * Initialize the search component\n * Idempotent \u2014 safe to call more than once on the same instance.\n * Returns the instance on success, null if required DOM elements are missing.\n */\n function init() {\n if (state.initialized) {\n return instance;\n }\n\n state.container = queryOne(config.containerSelector);\n if (!state.container) {\n state.initialized = false;\n return null;\n }\n\n state.input = state.container.querySelector(config.inputSelector);\n state.resultsContainer = state.container.querySelector(config.resultsSelector);\n\n if (!state.input || !state.resultsContainer) {\n state.initialized = false;\n return null;\n }\n\n // Set placeholder if configured\n if (config.placeholder) {\n state.input.setAttribute('placeholder', config.placeholder);\n }\n\n // Build search index\n buildIndex();\n\n // Bind events\n bindEvents();\n\n // Set up ARIA attributes\n setupAria();\n\n state.initialized = true;\n return instance;\n }\n\n /**\n * Build search index from DOM or custom data\n */\n function buildIndex() {\n state.index = [];\n \n // Use custom data if provided\n if (config.data && Array.isArray(config.data)) {\n config.data.forEach(function(item) {\n state.index.push({\n id: item.id || slugify(item.title),\n title: item.title || '',\n category: item.category || '',\n categorySlug: slugify(item.category || ''),\n content: item.content || '',\n keywords: item.keywords || extractKeywordsFromText(item.title + ' ' + item.content),\n url: item.url || '#' + (item.id || slugify(item.title)),\n icon: item.icon || ''\n });\n });\n return;\n }\n\n // Build from DOM\n const sections = queryAll(config.contentSelector);\n const categoryMap = buildCategoryMap();\n\n sections.forEach(function(section) {\n const id = section.id;\n if (!id) return;\n\n const titleEl = section.querySelector(config.titleSelector);\n const title = titleEl ? titleEl.textContent.replace(/v[\\d.]+/g, '').trim() : id;\n const category = categoryMap[id] || 'Documentation';\n const content = extractContent(section);\n const keywords = extractKeywords(section, title);\n const iconEl = titleEl ? titleEl.querySelector('i.ph') : null;\n let icon = '';\n if (iconEl && iconEl.classList) {\n for (let ci = 0; ci < iconEl.classList.length; ci++) {\n if (iconEl.classList[ci].indexOf('ph-') === 0) {\n icon = iconEl.classList[ci];\n break;\n }\n }\n }\n\n state.index.push({\n id: id,\n title: title,\n category: category,\n categorySlug: slugify(category),\n content: content,\n keywords: keywords,\n url: '#' + id,\n icon: icon\n });\n });\n }\n\n /**\n * Build a map of section IDs to their categories\n */\n function buildCategoryMap() {\n const map = {};\n let currentCategory = 'Documentation';\n const navItems = queryAll(config.navSelector + ', ' + config.sectionSelector);\n\n navItems.forEach(function(item) {\n if (item.classList.contains('doc-nav-section')) {\n currentCategory = item.textContent.trim();\n } else {\n const href = item.getAttribute('href');\n if (href && href.startsWith('#')) {\n const id = href.substring(1);\n map[id] = currentCategory;\n }\n }\n });\n\n return map;\n }\n\n /**\n * Extract searchable content from a section\n */\n function extractContent(section) {\n const clone = section.cloneNode(true);\n \n const toRemove = clone.querySelectorAll(config.excludeFromContent);\n toRemove.forEach(function(el) {\n el.remove();\n });\n\n let text = clone.textContent || '';\n text = text.replace(/\\s+/g, ' ').trim();\n \n return text.substring(0, config.maxContentLength);\n }\n\n /**\n * Extract keywords from a section\n */\n function extractKeywords(section, title) {\n const keywords = [];\n \n // Add title words\n title.toLowerCase().split(/\\s+/).forEach(function(word) {\n if (word.length > 2) {\n keywords.push(word);\n }\n });\n\n // Add class names from code examples\n const codeBlocks = section.querySelectorAll('code');\n codeBlocks.forEach(function(code) {\n const text = code.textContent || '';\n const classMatches = text.match(/\\.([\\w-]+)/g);\n if (classMatches) {\n classMatches.forEach(function(match) {\n keywords.push(match.substring(1).toLowerCase());\n });\n }\n });\n\n // Add data attributes\n const dataAttrs = section.querySelectorAll('[data-tooltip], [data-modal]');\n dataAttrs.forEach(function(el) {\n const attrs = el.getAttributeNames().filter(function(name) {\n return name.startsWith('data-');\n });\n attrs.forEach(function(attr) {\n keywords.push(attr.replace('data-', ''));\n });\n });\n\n return Array.from(new Set(keywords));\n }\n\n /**\n * Extract keywords from text string\n */\n function extractKeywordsFromText(text) {\n const words = text.toLowerCase().split(/\\s+/);\n return words.filter(function(word) {\n return word.length > 2;\n });\n }\n\n /**\n * Convert string to slug\n */\n function slugify(str) {\n return str.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n }\n\n /**\n * Bind event listeners\n */\n function bindEvents() {\n // Store bound handlers for cleanup\n state.boundHandlers.handleInput = function(e) {\n handleInput(e);\n };\n state.boundHandlers.handleFocus = function() {\n if (state.query.length >= config.minQueryLength) {\n open();\n }\n };\n state.boundHandlers.handleKeydown = function(e) {\n handleKeydown(e);\n };\n state.boundHandlers.handleOutsideClick = function(e) {\n if (!state.container.contains(e.target)) {\n close();\n }\n };\n state.boundHandlers.handleGlobalKeydown = function(e) {\n if (config.keyboardShortcut && (e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n state.input.focus();\n state.input.select();\n }\n };\n state.boundHandlers.handleResultClick = function(e) {\n const result = e.target.closest('.vd-doc-search-result');\n if (result) {\n const index = parseInt(result.dataset.index, 10);\n select(index);\n }\n };\n\n // Input events\n state.input.addEventListener('input', state.boundHandlers.handleInput);\n state.input.addEventListener('focus', state.boundHandlers.handleFocus);\n state.input.addEventListener('keydown', state.boundHandlers.handleKeydown);\n\n // Close on outside click\n document.addEventListener('click', state.boundHandlers.handleOutsideClick);\n\n // Global keyboard shortcut\n document.addEventListener('keydown', state.boundHandlers.handleGlobalKeydown);\n\n // Result click handling\n state.resultsContainer.addEventListener('click', state.boundHandlers.handleResultClick);\n }\n\n /**\n * Unbind event listeners\n */\n function unbindEvents() {\n if (state.input) {\n state.input.removeEventListener('input', state.boundHandlers.handleInput);\n state.input.removeEventListener('focus', state.boundHandlers.handleFocus);\n state.input.removeEventListener('keydown', state.boundHandlers.handleKeydown);\n }\n document.removeEventListener('click', state.boundHandlers.handleOutsideClick);\n document.removeEventListener('keydown', state.boundHandlers.handleGlobalKeydown);\n if (state.resultsContainer) {\n state.resultsContainer.removeEventListener('click', state.boundHandlers.handleResultClick);\n }\n }\n\n /**\n * Set up ARIA attributes\n */\n function setupAria() {\n const resultsId = state.resultsContainer.id || 'search-results-' + Math.random().toString(36).substr(2, 9);\n state.resultsContainer.id = resultsId;\n \n state.input.setAttribute('role', 'combobox');\n state.input.setAttribute('aria-autocomplete', 'list');\n state.input.setAttribute('aria-controls', resultsId);\n state.input.setAttribute('aria-expanded', 'false');\n \n state.resultsContainer.setAttribute('role', 'listbox');\n state.resultsContainer.setAttribute('aria-label', 'Search results');\n }\n\n /**\n * Handle input changes\n */\n function handleInput(e) {\n const query = e.target.value.trim();\n\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n }\n\n state.debounceTimer = setTimeout(function() {\n state.query = query;\n\n if (query.length < config.minQueryLength) {\n close();\n return;\n }\n\n state.results = search(query);\n state.activeIndex = -1;\n render();\n open();\n\n // Callback\n if (typeof config.onSearch === 'function') {\n safeInvokeCallback('onSearch', config.onSearch, query, state.results);\n }\n }, config.debounceMs);\n }\n\n /**\n * Handle keyboard navigation\n */\n function handleKeydown(e) {\n if (!state.isOpen) {\n if (e.key === 'ArrowDown' && state.query.length >= config.minQueryLength) {\n e.preventDefault();\n state.results = search(state.query);\n render();\n open();\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n navigate(1);\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n navigate(-1);\n break;\n\n case 'Enter':\n e.preventDefault();\n if (state.activeIndex >= 0) {\n select(state.activeIndex);\n } else if (state.results.length > 0) {\n select(0);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n close();\n break;\n\n case 'Tab':\n close();\n break;\n }\n }\n\n /**\n * Perform search\n */\n function search(query) {\n const terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n const scored = [];\n\n state.index.forEach(function(entry) {\n let score = 0;\n const titleLower = entry.title.toLowerCase();\n const categoryLower = entry.category.toLowerCase();\n const contentLower = entry.content.toLowerCase();\n\n terms.forEach(function(term) {\n // Title match - highest priority\n if (titleLower.includes(term)) {\n score += 100;\n if (titleLower === term) {\n score += 50;\n } else if (titleLower.startsWith(term)) {\n score += 25;\n }\n }\n\n // Category match\n if (categoryLower.includes(term)) {\n score += 50;\n }\n\n // Keyword match\n const keywordMatch = entry.keywords.some(function(k) {\n return k.includes(term);\n });\n if (keywordMatch) {\n score += 30;\n }\n\n // Content match\n if (contentLower.includes(term)) {\n score += 10;\n }\n });\n\n if (score > 0) {\n scored.push({\n id: entry.id,\n title: entry.title,\n category: entry.category,\n categorySlug: entry.categorySlug,\n content: entry.content,\n url: entry.url,\n icon: entry.icon,\n score: score\n });\n }\n });\n\n scored.sort(function(a, b) {\n return b.score - a.score;\n });\n\n return scored.slice(0, config.maxResults);\n }\n\n /**\n * Render search results\n */\n function render() {\n if (state.results.length === 0) {\n setResultsHtml(renderEmpty());\n return;\n }\n\n let html = '<ul class=\"vd-doc-search-results-list\" role=\"listbox\">';\n\n state.results.forEach(function(result, index) {\n const isActive = index === state.activeIndex;\n const icon = result.icon || getCategoryIcon(result.categorySlug);\n const excerpt = getExcerpt(result.content, state.query);\n\n html += '<li class=\"vd-doc-search-result' + (isActive ? ' is-active' : '') + '\"' +\n ' role=\"option\"' +\n ' id=\"vd-doc-search-result-' + index + '\"' +\n ' data-index=\"' + index + '\"' +\n ' data-category=\"' + escapeHtml(result.categorySlug) + '\"' +\n ' aria-selected=\"' + isActive + '\"' +\n '>' +\n '<div class=\"vd-doc-search-result-icon\">' +\n '<i class=\"ph ' + escapeHtml(icon) + '\"></i>' +\n '</div>' +\n '<div class=\"vd-doc-search-result-content\">' +\n '<div class=\"vd-doc-search-result-title\">' + highlight(result.title, state.query) + '</div>' +\n '<div class=\"vd-doc-search-result-category\">' + escapeHtml(result.category) + '</div>' +\n '<div class=\"vd-doc-search-result-excerpt\">' + highlight(excerpt, state.query) + '</div>' +\n '</div>' +\n '</li>';\n });\n\n html += '</ul>';\n html += renderFooter();\n\n setResultsHtml(html);\n }\n\n /**\n * Render empty state\n */\n function renderEmpty() {\n return '<div class=\"vd-doc-search-empty\">' +\n '<div class=\"vd-doc-search-empty-icon\"><i class=\"ph ph-magnifying-glass\"></i></div>' +\n '<div class=\"vd-doc-search-empty-title\">' + escapeHtml(config.emptyTitle) + '</div>' +\n '<div class=\"vd-doc-search-empty-text\">' + escapeHtml(config.emptyText) + '</div>' +\n '</div>';\n }\n\n /**\n * Render footer with keyboard hints\n */\n function renderFooter() {\n return '<div class=\"vd-doc-search-footer\">' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>\u2191</kbd><kbd>\u2193</kbd> to navigate</span>' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>\u21B5</kbd> to select</span>' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>esc</kbd> to close</span>' +\n '</div>';\n }\n\n /**\n * Get icon for category\n */\n function getCategoryIcon(categorySlug) {\n return config.categoryIcons[categorySlug] || config.categoryIcons['default'] || 'ph-file-text';\n }\n\n /**\n * Get excerpt from content\n */\n function getExcerpt(content, query) {\n const terms = query.toLowerCase().split(/\\s+/);\n const contentLower = content.toLowerCase();\n const excerptLength = 100;\n\n let matchPos = -1;\n for (let i = 0; i < terms.length; i++) {\n const pos = contentLower.indexOf(terms[i]);\n if (pos !== -1 && (matchPos === -1 || pos < matchPos)) {\n matchPos = pos;\n }\n }\n\n if (matchPos === -1) {\n return content.substring(0, excerptLength) + '...';\n }\n\n const start = Math.max(0, matchPos - 30);\n const end = Math.min(content.length, matchPos + excerptLength);\n let excerpt = content.substring(start, end);\n\n if (start > 0) {\n excerpt = '...' + excerpt;\n }\n if (end < content.length) {\n excerpt = excerpt + '...';\n }\n\n return excerpt;\n }\n\n /**\n * Highlight matched terms in text\n */\n function highlight(text, query) {\n if (!query) return escapeHtml(text);\n\n const terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n let escaped = escapeHtml(text);\n\n terms.forEach(function(term) {\n // Skip overly long terms to prevent ReDoS\n if (term.length > 50) return;\n const regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')', 'gi');\n escaped = escaped.replace(regex, '<' + config.highlightTag + '>$1</' + config.highlightTag + '>');\n });\n\n return escaped;\n }\n\n /**\n * Escape HTML entities\n */\n function escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Navigate results with keyboard\n */\n function navigate(direction) {\n let newIndex = state.activeIndex + direction;\n\n if (newIndex < 0) {\n newIndex = state.results.length - 1;\n } else if (newIndex >= state.results.length) {\n newIndex = 0;\n }\n\n setActiveIndex(newIndex);\n }\n\n /**\n * Set active result index\n */\n function setActiveIndex(index) {\n const prevActive = state.resultsContainer.querySelector('.vd-doc-search-result.is-active');\n if (prevActive) {\n prevActive.classList.remove('is-active');\n prevActive.setAttribute('aria-selected', 'false');\n }\n\n state.activeIndex = index;\n\n const newActive = state.resultsContainer.querySelector('[data-index=\"' + index + '\"]');\n if (newActive) {\n newActive.classList.add('is-active');\n newActive.setAttribute('aria-selected', 'true');\n state.input.setAttribute('aria-activedescendant', 'vd-doc-search-result-' + index);\n newActive.scrollIntoView({ block: 'nearest' });\n }\n }\n\n /**\n * Select a result\n */\n function select(index) {\n const result = state.results[index];\n if (!result) return;\n\n // Close search\n close();\n state.input.value = '';\n state.query = '';\n\n // Custom callback\n if (typeof config.onSelect === 'function') {\n safeInvokeCallback('onSelect', config.onSelect, result);\n return;\n }\n\n // Default behavior: navigate to section\n const section = queryOne(result.url) || document.querySelector(result.url);\n if (section) {\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n window.history.pushState(null, '', result.url);\n updateSidebarActive(result.id);\n }\n }\n\n /**\n * Update sidebar navigation active state\n */\n function updateSidebarActive(sectionId) {\n const navLinks = queryAll(config.navSelector);\n navLinks.forEach(function(link) {\n link.classList.remove('active');\n if (link.getAttribute('href') === '#' + sectionId) {\n link.classList.add('active');\n }\n });\n }\n\n /**\n * Open results dropdown\n */\n function open() {\n if (state.isOpen) return;\n\n state.isOpen = true;\n state.resultsContainer.classList.add('is-open');\n state.input.setAttribute('aria-expanded', 'true');\n\n if (typeof config.onOpen === 'function') {\n safeInvokeCallback('onOpen', config.onOpen);\n }\n }\n\n /**\n * Close results dropdown\n */\n function close() {\n if (!state.isOpen) return;\n\n state.isOpen = false;\n state.activeIndex = -1;\n state.resultsContainer.classList.remove('is-open');\n state.input.setAttribute('aria-expanded', 'false');\n state.input.removeAttribute('aria-activedescendant');\n\n if (typeof config.onClose === 'function') {\n safeInvokeCallback('onClose', config.onClose);\n }\n }\n\n /**\n * Destroy the component\n */\n function destroy() {\n unbindEvents();\n \n state.initialized = false;\n state.index = [];\n state.results = [];\n state.isOpen = false;\n state.query = '';\n\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n }\n\n if (state.resultsContainer) {\n setResultsHtml('');\n }\n }\n\n /**\n * Rebuild the search index\n */\n function rebuild() {\n buildIndex();\n }\n\n /**\n * Update configuration\n */\n function setConfig(newConfig) {\n Object.assign(config, newConfig);\n config.root = normalizeRoot(config.root);\n config.highlightTag = normalizeHighlightTag(config.highlightTag);\n }\n\n /**\n * Get current configuration\n */\n function getConfig() {\n return Object.assign({}, config);\n }\n\n /**\n * Get search index\n */\n function getIndex() {\n return state.index.slice();\n }\n\n // Public instance API\n const instance = {\n init: init,\n destroy: destroy,\n rebuild: rebuild,\n search: search,\n open: open,\n close: close,\n setConfig: setConfig,\n getConfig: getConfig,\n getIndex: getIndex,\n getContainer: function () {\n return state.container;\n }\n };\n\n return instance;\n }\n\n /**\n * Search Component (singleton for backward compatibility)\n */\n const Search = {\n // Factory method \u2014 creates and auto-initializes a new independent instance.\n // Always returns the instance so callers retain a reference even if the\n // DOM container is not yet available (they can retry init() later).\n create: function(options) {\n const instance = createSearch(options);\n if (instance) {\n instance.init();\n }\n return instance || null;\n },\n \n // Default instance\n _instance: null,\n \n // Configuration (for default instance)\n config: Object.assign({}, DEFAULTS),\n\n /**\n * Initialize the default search instance\n */\n init: function(rootOrOptions, maybeOptions) {\n const root = isRoot(rootOrOptions) ? rootOrOptions : null;\n const options = root ? maybeOptions : rootOrOptions;\n\n if (this._instance) {\n this._instance.destroy();\n }\n \n if (options) {\n Object.assign(this.config, options);\n }\n \n this._instance = createSearch(Object.assign({}, this.config, root ? { root: root } : {}));\n return this._instance ? this._instance.init() : null;\n },\n\n /**\n * Destroy the default instance\n */\n destroy: function(root) {\n if (root && this._instance && this._instance.getContainer() && typeof window.VanduoLifecycle !== 'undefined') {\n if (!window.VanduoLifecycle.isInRoot(root, this._instance.getContainer())) {\n return;\n }\n }\n\n if (this._instance) {\n this._instance.destroy();\n this._instance = null;\n }\n },\n\n destroyAll: function(root) {\n this.destroy(root);\n },\n\n /**\n * Rebuild the default instance index\n */\n rebuild: function() {\n if (this._instance) {\n this._instance.rebuild();\n }\n },\n\n /**\n * Search using the default instance\n */\n search: function(query) {\n return this._instance ? this._instance.search(query) : [];\n },\n\n /**\n * Open the default instance\n */\n open: function() {\n if (this._instance) {\n this._instance.open();\n }\n },\n\n /**\n * Close the default instance\n */\n close: function() {\n if (this._instance) {\n this._instance.close();\n }\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('docSearch', Search);\n }\n\n // Expose globally (both names for compatibility)\n window.Search = Search;\n window.DocSearch = Search; // Backward compatibility\n window.VanduoDocSearch = Search; // New name compatibility\n\n})();\n", "/**\n * Vanduo Framework - Draggable Component\n * JavaScript functionality for draggable elements and drop zones\n */\n\n(function () {\n 'use strict';\n\n /**\n * Draggable Component\n */\n const Draggable = {\n // Store initialized draggables and their cleanup functions\n instances: new Map(),\n // Store current drag state\n currentDrag: null,\n // Store touch state\n touchState: null,\n // Feedback element\n feedbackElement: null,\n // Shared selector used by init and touch reorder\n containerSelector: '.vd-draggable-container, .vd-draggable-container-vertical',\n\n /**\n * Initialize draggable components\n */\n init: function (root) {\n const draggables = window.Vanduo.queryAll(root, '.vd-draggable, [data-draggable]');\n\n draggables.forEach(element => {\n if (this.instances.has(element)) {\n return;\n }\n this.initDraggable(element);\n });\n\n const containers = window.Vanduo.queryAll(root, this.containerSelector);\n containers.forEach(container => {\n if (!this.instances.has(container)) {\n this.initContainer(container);\n }\n });\n\n const dropZones = window.Vanduo.queryAll(root, '.vd-drop-zone');\n dropZones.forEach(zone => {\n if (!this.instances.has(zone)) {\n this.initDropZone(zone);\n }\n });\n\n this.createFeedbackElement();\n },\n\n /**\n * Initialize a single draggable element\n * @param {HTMLElement} element - Draggable element\n */\n initDraggable: function (element) {\n const cleanupFunctions = [];\n\n // Make element draggable if not already\n if (!element.hasAttribute('draggable')) {\n element.setAttribute('draggable', 'true');\n }\n\n // Accessibility: add ARIA attributes\n if (!element.hasAttribute('tabindex')) {\n element.setAttribute('tabindex', '0');\n }\n element.setAttribute('role', 'option');\n element.setAttribute('aria-roledescription', 'draggable item');\n element.setAttribute('aria-grabbed', 'false');\n\n // Handle drag start\n const dragStartHandler = (e) => {\n this.handleDragStart(e, element);\n };\n element.addEventListener('dragstart', dragStartHandler);\n cleanupFunctions.push(() => element.removeEventListener('dragstart', dragStartHandler));\n\n // Handle drag\n const dragHandler = (e) => {\n this.handleDrag(e, element);\n };\n element.addEventListener('drag', dragHandler);\n cleanupFunctions.push(() => element.removeEventListener('drag', dragHandler));\n\n // Handle drag end\n const dragEndHandler = (e) => {\n this.handleDragEnd(e, element);\n };\n element.addEventListener('dragend', dragEndHandler);\n cleanupFunctions.push(() => element.removeEventListener('dragend', dragEndHandler));\n\n // Handle touch start (for mobile)\n const touchStartHandler = (e) => {\n this.handleTouchStart(e, element);\n };\n element.addEventListener('touchstart', touchStartHandler);\n cleanupFunctions.push(() => element.removeEventListener('touchstart', touchStartHandler));\n\n // Handle touch move (for mobile)\n // { passive: false } is required so that e.preventDefault() works\n // once the drag threshold is reached \u2014 without it, modern browsers\n // treat the listener as passive and silently ignore preventDefault().\n const touchMoveHandler = (e) => {\n this.handleTouchMove(e, element);\n };\n element.addEventListener('touchmove', touchMoveHandler, { passive: false });\n cleanupFunctions.push(() => element.removeEventListener('touchmove', touchMoveHandler));\n\n // Handle touch end (for mobile)\n const touchEndHandler = (e) => {\n this.handleTouchEnd(e, element);\n };\n element.addEventListener('touchend', touchEndHandler, { passive: false });\n cleanupFunctions.push(() => element.removeEventListener('touchend', touchEndHandler));\n\n // Handle touch cancel (for mobile)\n const touchCancelHandler = (e) => {\n this.handleTouchEnd(e, element);\n };\n element.addEventListener('touchcancel', touchCancelHandler);\n cleanupFunctions.push(() => element.removeEventListener('touchcancel', touchCancelHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, element);\n };\n element.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => element.removeEventListener('keydown', keydownHandler));\n\n this.instances.set(element, { cleanup: cleanupFunctions });\n },\n\n /**\n * Initialize a draggable container\n * @param {HTMLElement} container - Draggable container\n */\n initContainer: function (container) {\n // Accessibility: add ARIA role to container\n container.setAttribute('role', 'listbox');\n container.setAttribute('aria-label', container.getAttribute('aria-label') || 'Draggable items');\n\n const items = container.querySelectorAll('.vd-draggable-item');\n items.forEach(item => {\n if (!this.instances.has(item)) {\n this.initDraggable(item);\n }\n });\n\n const cleanupFunctions = [];\n\n // Handle drag enter\n const dragEnterHandler = (e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n };\n\n // Handle drag over for auto-sorting\n const dragOverHandler = (e) => {\n e.preventDefault(); // Necessary to allow drop\n e.dataTransfer.dropEffect = 'move';\n\n if (!this.currentDrag) return;\n const draggingEl = this.currentDrag.element;\n\n // Only reorder if dragging an item that belongs to this container (or if we support cross-container drag, but keep simple)\n if (!container.contains(draggingEl)) return;\n\n // Prevent jumps when the dragging finalizes with 0,0 coordinates near the end\n if (e.clientX === 0 && e.clientY === 0) return;\n\n this.handleReorder(container, draggingEl, e.clientX, e.clientY);\n };\n\n // Handle drop\n const dropHandler = (e) => {\n e.preventDefault(); // crucial to prevent the browser's default handling and snapping back\n };\n\n container.addEventListener('dragenter', dragEnterHandler);\n container.addEventListener('dragover', dragOverHandler);\n container.addEventListener('drop', dropHandler);\n\n cleanupFunctions.push(() => {\n container.removeEventListener('dragenter', dragEnterHandler);\n container.removeEventListener('dragover', dragOverHandler);\n container.removeEventListener('drop', dropHandler);\n });\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n\n /**\n * Initialize a drop zone\n * @param {HTMLElement} zone - Drop zone element\n */\n initDropZone: function (zone) {\n const cleanupFunctions = [];\n\n // Accessibility: add ARIA role to drop zone\n zone.setAttribute('role', 'region');\n zone.setAttribute('aria-dropeffect', 'move');\n if (!zone.hasAttribute('aria-label')) {\n zone.setAttribute('aria-label', 'Drop zone');\n }\n\n // Handle drag over\n const dragOverHandler = (e) => {\n e.preventDefault();\n this.handleDragOver(e, zone);\n };\n zone.addEventListener('dragover', dragOverHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragover', dragOverHandler));\n\n // Handle drag enter\n const dragEnterHandler = (e) => {\n e.preventDefault();\n this.handleDragEnter(e, zone);\n };\n zone.addEventListener('dragenter', dragEnterHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragenter', dragEnterHandler));\n\n // Handle drag leave\n const dragLeaveHandler = (e) => {\n this.handleDragLeave(e, zone);\n };\n zone.addEventListener('dragleave', dragLeaveHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragleave', dragLeaveHandler));\n\n // Handle drop\n const dropHandler = (e) => {\n e.preventDefault();\n this.handleDrop(e, zone);\n };\n zone.addEventListener('drop', dropHandler);\n cleanupFunctions.push(() => zone.removeEventListener('drop', dropHandler));\n\n this.instances.set(zone, { cleanup: cleanupFunctions });\n },\n\n /**\n * Create feedback element for drag operations\n */\n createFeedbackElement: function () {\n if (!this.feedbackElement) {\n // Reuse existing element if present\n const existing = document.querySelector('.vd-drag-feedback');\n if (existing) {\n this.feedbackElement = existing;\n return;\n }\n\n this.feedbackElement = document.createElement('div');\n this.feedbackElement.className = 'vd-drag-feedback hidden';\n this.feedbackElement.setAttribute('role', 'presentation');\n document.body.appendChild(this.feedbackElement);\n }\n },\n\n /**\n * Handle drag start event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDragStart: function (e, element) {\n // Add dragging class\n element.classList.add('is-dragging');\n\n // Accessibility: update aria-grabbed\n element.setAttribute('aria-grabbed', 'true');\n\n // Store drag state\n this.currentDrag = {\n element: element,\n initialPosition: { x: e.clientX, y: e.clientY },\n initialBounds: element.getBoundingClientRect(),\n data: this.getData(element)\n };\n\n // Set drag data\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', this.currentDrag.data);\n\n // We no longer suppress the native ghost image or manually update feedback\n // for mouse drags, relying on the browser's native rendering instead.\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:start', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: e.clientX, y: e.clientY }\n }\n }));\n },\n\n /**\n * Handle drag event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDrag: function (e, element) {\n // Guard against null state (race condition on fast interactions)\n if (!this.currentDrag) return;\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:drag', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: e.clientX, y: e.clientY },\n delta: {\n x: e.clientX - this.currentDrag.initialPosition.x,\n y: e.clientY - this.currentDrag.initialPosition.y\n }\n }\n }));\n },\n\n /**\n * Handle drag end event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDragEnd: function (e, element) {\n // Remove dragging class\n element.classList.remove('is-dragging');\n element.classList.add('is-dropped');\n setTimeout(() => element.classList.remove('is-dropped'), 300);\n\n // Accessibility: update aria-grabbed\n element.setAttribute('aria-grabbed', 'false');\n\n // Hide feedback\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n\n // Guard against null state\n const data = this.currentDrag?.data || this.getData(element);\n const initialPos = this.currentDrag?.initialPosition || { x: 0, y: 0 };\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:end', {\n bubbles: true,\n detail: {\n element: element,\n data: data,\n position: { x: e.clientX, y: e.clientY },\n delta: {\n x: e.clientX - initialPos.x,\n y: e.clientY - initialPos.y\n }\n }\n }));\n\n // Reset drag state\n this.currentDrag = null;\n },\n\n /**\n * Handle touch start event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchStart: function (e, element) {\n // Don't prevent default here \u2014 it blocks scrolling.\n // We only prevent default in touchmove once drag threshold is reached.\n const touch = e.touches[0];\n const rect = element.getBoundingClientRect();\n this.touchState = {\n element: element,\n startX: touch.clientX,\n startY: touch.clientY,\n lastX: touch.clientX,\n lastY: touch.clientY,\n // Keep preview anchored to the original grab point.\n offsetX: touch.clientX - rect.left,\n offsetY: touch.clientY - rect.top,\n startTime: Date.now(),\n isDragging: false\n };\n },\n\n /**\n * Handle touch move event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchMove: function (e, element) {\n if (!this.touchState) return;\n\n const touch = e.touches[0];\n this.touchState.lastX = touch.clientX;\n this.touchState.lastY = touch.clientY;\n const deltaX = touch.clientX - this.touchState.startX;\n const deltaY = touch.clientY - this.touchState.startY;\n\n // Only start dragging if moved a minimum distance\n if (Math.abs(deltaX) > 10 || Math.abs(deltaY) > 10) {\n // Now we know it's a drag, not a scroll \u2014 prevent default\n if (e.cancelable) e.preventDefault();\n\n if (!this.touchState.isDragging) {\n this.touchState.isDragging = true;\n element.classList.add('is-dragging');\n element.setAttribute('aria-grabbed', 'true');\n\n // Store drag state\n this.currentDrag = {\n element: element,\n initialPosition: { x: this.touchState.startX, y: this.touchState.startY },\n initialBounds: element.getBoundingClientRect(),\n data: this.getData(element),\n // Preserve where inside the element the drag started for accurate ghost positioning.\n offsetX: this.touchState.offsetX,\n offsetY: this.touchState.offsetY\n };\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:start', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: touch.clientX, y: touch.clientY }\n }\n }));\n }\n\n // Update feedback\n this.updateFeedback(touch.clientX, touch.clientY);\n\n // Dispatch event\n if (this.currentDrag) {\n element.dispatchEvent(new CustomEvent('draggable:drag', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: touch.clientX, y: touch.clientY },\n delta: { x: deltaX, y: deltaY }\n }\n }));\n\n this.updateTouchDropZone(touch.clientX, touch.clientY);\n\n // Reorder for touch\n const container = element.closest(this.containerSelector);\n if (container && container.contains(element)) {\n this.handleReorder(container, element, touch.clientX, touch.clientY);\n }\n }\n }\n },\n\n /**\n * Handle touch end event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchEnd: function (e, element) {\n if (this.touchState && this.touchState.isDragging) {\n if (e.cancelable) e.preventDefault();\n const endTouch = e.changedTouches?.[0];\n const endPosition = {\n x: endTouch?.clientX ?? this.touchState.lastX ?? this.touchState.startX,\n y: endTouch?.clientY ?? this.touchState.lastY ?? this.touchState.startY\n };\n\n const dropZone = this.resolveDropZoneAtPoint(endPosition.x, endPosition.y) || this.touchState.overZone;\n if (dropZone) {\n this.dispatchDrop(dropZone, endPosition);\n } else if (this.touchState.overZone) {\n this.touchState.overZone.classList.remove('is-drag-over');\n }\n\n element.classList.remove('is-dragging');\n element.classList.add('is-dropped');\n element.setAttribute('aria-grabbed', 'false');\n setTimeout(() => element.classList.remove('is-dropped'), 300);\n\n // Hide feedback\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n\n // Dispatch event\n const data = this.currentDrag?.data || this.getData(element);\n const startX = this.touchState?.startX || 0;\n const startY = this.touchState?.startY || 0;\n\n element.dispatchEvent(new CustomEvent('draggable:end', {\n bubbles: true,\n detail: {\n element: element,\n data: data,\n position: endPosition,\n delta: {\n x: endPosition.x - startX,\n y: endPosition.y - startY\n }\n }\n }));\n }\n\n // Reset states\n this.touchState = null;\n this.currentDrag = null;\n },\n\n /**\n * Handle drag over event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} _zone - Drop zone element\n */\n handleDragOver: function (e, _zone) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n },\n\n /**\n * Handle drag enter event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDragEnter: function (e, zone) {\n e.preventDefault();\n zone.classList.add('is-drag-over');\n },\n\n /**\n * Handle drag leave event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDragLeave: function (e, zone) {\n zone.classList.remove('is-drag-over');\n },\n\n /**\n * Handle drop event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDrop: function (e, zone) {\n e.preventDefault();\n this.dispatchDrop(zone, { x: e.clientX, y: e.clientY });\n },\n\n /**\n * Resolve a drop zone from viewport coordinates\n * @param {number} x\n * @param {number} y\n * @returns {HTMLElement|null}\n */\n resolveDropZoneAtPoint: function (x, y) {\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n\n // Prefer the full stacking list so overlays/top elements don't hide real drop targets.\n if (typeof document.elementsFromPoint === 'function') {\n const stacked = document.elementsFromPoint(x, y);\n for (const element of stacked) {\n const zone = element.closest('.vd-drop-zone');\n if (zone) return zone;\n }\n }\n\n const target = document.elementFromPoint(x, y);\n const targetZone = target ? target.closest('.vd-drop-zone') : null;\n if (targetZone) return targetZone;\n\n // Last-resort fallback for mobile emulation edge cases.\n const zones = document.querySelectorAll('.vd-drop-zone');\n for (const zone of zones) {\n const rect = zone.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n return zone;\n }\n }\n\n return null;\n },\n\n /**\n * Track and update active drop-zone hover state on touch devices\n * @param {number} x\n * @param {number} y\n */\n updateTouchDropZone: function (x, y) {\n if (!this.touchState) return;\n\n const nextZone = this.resolveDropZoneAtPoint(x, y);\n const prevZone = this.touchState.overZone || null;\n\n if (prevZone && prevZone !== nextZone) {\n prevZone.classList.remove('is-drag-over');\n }\n\n if (nextZone && nextZone !== prevZone) {\n nextZone.classList.add('is-drag-over');\n }\n\n this.touchState.overZone = nextZone || null;\n },\n\n /**\n * Dispatch a normalized drop event for mouse and touch flows\n * @param {HTMLElement} zone\n * @param {{x:number, y:number}} position\n */\n dispatchDrop: function (zone, position) {\n zone.classList.remove('is-drag-over');\n zone.dispatchEvent(new CustomEvent('draggable:drop', {\n bubbles: true,\n detail: {\n zone: zone,\n element: this.currentDrag?.element,\n data: this.currentDrag?.data,\n position: position\n }\n }));\n },\n\n /**\n * Reorder elements in container based on cursor position\n * @param {HTMLElement} container \n * @param {HTMLElement} element \n * @param {number} clientX \n * @param {number} clientY \n */\n handleReorder: function (container, element, clientX, clientY) {\n const isVertical = container.classList.contains('vd-draggable-container-vertical');\n const siblings = [...container.querySelectorAll('.vd-draggable-item:not(.is-dragging), .vd-draggable:not(.is-dragging)')];\n\n const nextSibling = siblings.reduce((closest, child) => {\n const box = child.getBoundingClientRect();\n const offset = isVertical\n ? clientY - box.top - box.height / 2\n : clientX - box.left - box.width / 2;\n\n if (offset < 0 && offset > closest.offset) {\n return { offset: offset, element: child };\n } else {\n return closest;\n }\n }, { offset: Number.NEGATIVE_INFINITY }).element;\n\n if (nextSibling == null) {\n container.appendChild(element);\n } else {\n container.insertBefore(element, nextSibling);\n }\n },\n\n /**\n * Handle keyboard events\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} element - Draggable element\n */\n handleKeydown: function (e, element) {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n // Trigger click or custom action\n element.click();\n break;\n case 'Escape':\n // Cancel drag if in progress\n if (element.classList.contains('is-dragging')) {\n element.classList.remove('is-dragging');\n element.setAttribute('aria-grabbed', 'false');\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n this.currentDrag = null;\n }\n break;\n case 'ArrowUp':\n case 'ArrowLeft': {\n e.preventDefault();\n const prev = element.previousElementSibling;\n if (prev && (prev.classList.contains('vd-draggable') || prev.classList.contains('vd-draggable-item'))) {\n element.parentNode.insertBefore(element, prev);\n element.focus();\n element.dispatchEvent(new CustomEvent('draggable:reorder', {\n bubbles: true,\n detail: { element: element, direction: 'up' }\n }));\n }\n break;\n }\n case 'ArrowDown':\n case 'ArrowRight': {\n e.preventDefault();\n const next = element.nextElementSibling;\n if (next && (next.classList.contains('vd-draggable') || next.classList.contains('vd-draggable-item'))) {\n element.parentNode.insertBefore(next, element);\n element.focus();\n element.dispatchEvent(new CustomEvent('draggable:reorder', {\n bubbles: true,\n detail: { element: element, direction: 'down' }\n }));\n }\n break;\n }\n }\n },\n\n /**\n * Get data from draggable element\n * @param {HTMLElement} element - Draggable element\n * @returns {string} Data associated with the element\n */\n getData: function (element) {\n return element.dataset.draggable || element.textContent.trim();\n },\n\n /**\n * Update drag feedback element\n * @param {number} x - Current X coordinate\n * @param {number} y - Current Y coordinate\n */\n updateFeedback: function (x, y) {\n if (!this.currentDrag) return;\n\n // Show feedback\n this.feedbackElement.classList.remove('hidden');\n\n // Update feedback content\n const rect = this.currentDrag.initialBounds;\n this.feedbackElement.innerHTML = '';\n const clone = this.currentDrag.element.cloneNode(true);\n this.feedbackElement.appendChild(clone);\n\n // Set styles\n const offsetX = this.currentDrag.offsetX ?? 20;\n const offsetY = this.currentDrag.offsetY ?? 20;\n Object.assign(this.feedbackElement.style, {\n left: (x - offsetX) + 'px',\n top: (y - offsetY) + 'px',\n width: rect.width + 'px',\n height: rect.height + 'px'\n });\n },\n\n /**\n * Make an element draggable programmatically\n * @param {HTMLElement|string} element - Element or selector\n * @param {Object} options - Configuration options\n */\n makeDraggable: function (element, options = {}) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n\n if (el && !this.instances.has(el)) {\n // Add classes and attributes\n el.classList.add('vd-draggable');\n el.setAttribute('draggable', 'true');\n\n // Set options\n if (options.data) {\n el.dataset.draggable = options.data;\n }\n\n // Initialize\n this.initDraggable(el);\n }\n },\n\n /**\n * Remove draggable functionality from an element\n * @param {HTMLElement|string} element - Element or selector\n */\n removeDraggable: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n\n if (el && this.instances.has(el)) {\n // Clean up\n const instance = this.instances.get(el);\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n\n // Remove classes and attributes\n el.classList.remove('vd-draggable');\n el.removeAttribute('draggable');\n el.removeAttribute('data-draggable');\n }\n },\n\n /**\n * Destroy a draggable instance and clean up event listeners\n * @param {HTMLElement} element - Draggable element\n */\n destroy: function (element) {\n this.removeDraggable(element);\n },\n\n /**\n * Destroy all draggable instances\n */\n destroyAll: function () {\n const instances = Array.from(this.instances.keys());\n instances.forEach(element => this.destroy(element));\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('draggable', Draggable);\n }\n\n // Expose globally\n window.VanduoDraggable = Draggable;\n})();\n", "/**\n * Vanduo Framework \u2013 LazyLoad Component\n * v1.2.1\n *\n * Provides two levels of API:\n *\n * LOW-LEVEL (generic IntersectionObserver wrapper)\n * VanduoLazyLoad.observe(element, callback, options?)\n * VanduoLazyLoad.unobserve(element)\n * VanduoLazyLoad.unobserveAll()\n *\n * HIGH-LEVEL (HTML-section fetcher, mirrors vanduo-docs SPA behaviour)\n * VanduoLazyLoad.loadSection(url, containerEl, options?)\n * options: { placeholder, threshold, rootMargin, onLoaded, onError }\n * placeholder: 'skeleton' | 'spinner' | HTMLString (default: 'skeleton')\n *\n * ATTRIBUTE-DRIVEN (zero-JS usage, wired by init())\n * <div data-vd-lazy=\"./path/to/section.html\"\n * data-vd-lazy-placeholder=\"skeleton|spinner\">\u2026</div>\n *\n * EVENTS dispatched on the host element:\n * lazysection:loading \u2014 fetch started\n * lazysection:loaded \u2014 content injected\n * lazysection:error \u2014 fetch failed\n */\n\n(function () {\n 'use strict';\n\n /* \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /** @type {Map<Element, IntersectionObserver>} */\n const _observerMap = new Map();\n\n function _isRoot(root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n }\n\n function _normalizeRoot(root) {\n return _isRoot(root) ? root : document;\n }\n\n function _isInRoot(root, element) {\n const scope = _normalizeRoot(root);\n if (!(element instanceof Element)) return false;\n if (scope === document) {\n return document.documentElement ? document.documentElement.contains(element) : document.contains(element);\n }\n if (scope === element) return true;\n return typeof scope.contains === 'function' && scope.contains(element);\n }\n\n function _queryAll(root, selector) {\n const scope = _normalizeRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n }\n\n /* \u2500\u2500 Security helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Returns true only if `url` resolves to the same origin as the page\n * (relative paths and same-origin absolute URLs are allowed).\n * Cross-origin URLs are rejected to prevent SSRF-style fetch abuse.\n * @param {string} url\n * @returns {boolean}\n */\n function _isSafeUrl(url) {\n try {\n // Relative URLs (no origin) are always safe\n const resolved = new URL(url, window.location.href);\n return resolved.origin === window.location.origin;\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Safely inject fetched HTML into a container by parsing it with\n * DOMParser (avoids script execution) and replacing children via\n * standard DOM APIs instead of raw innerHTML assignment.\n * @param {Element} containerEl\n * @param {string} html\n */\n function _safeInjectHtml(containerEl, html) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html.trim(), 'text/html'); // CodeQL [js/xss-through-dom] Intentional: parsed nodes are sanitized below before adoption into live DOM\n\n const DANGEROUS_TAGS = ['SCRIPT', 'IFRAME', 'OBJECT', 'EMBED', 'FORM', 'BASE', 'LINK', 'META', 'STYLE'];\n for (const tag of DANGEROUS_TAGS) {\n const els = doc.querySelectorAll(tag);\n for (let i = els.length - 1; i >= 0; i--) {\n els[i].parentNode.removeChild(els[i]);\n }\n }\n\n // Strip dangerous attributes (e.g. onerror, javascript: urls) from all elements\n function _sanitizeNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const attrs = node.attributes;\n for (let i = attrs.length - 1; i >= 0; i--) {\n const attrName = attrs[i].name.toLowerCase();\n const attrValue = attrs[i].value.toLowerCase();\n const trimmedValue = attrValue.trim();\n if (\n attrName.startsWith('on') ||\n trimmedValue.startsWith('javascript:') ||\n trimmedValue.startsWith('data:') ||\n trimmedValue.startsWith('vbscript:')\n ) {\n node.removeAttribute(attrs[i].name);\n }\n }\n const children = node.childNodes;\n for (let i = 0; i < children.length; i++) {\n _sanitizeNode(children[i]);\n }\n }\n }\n _sanitizeNode(doc.body);\n\n // Collect all top-level body children\n const nodes = Array.from(doc.body.childNodes);\n // Clear container and append parsed nodes\n while (containerEl.firstChild) {\n containerEl.removeChild(containerEl.firstChild);\n }\n nodes.forEach(function (node) {\n containerEl.appendChild(document.adoptNode(node));\n });\n }\n\n /* \u2500\u2500 Placeholder HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n function _skeletonHtml() {\n return '<div class=\"vd-skeleton-card\" style=\"position:relative;min-height:200px;padding:2rem;overflow:hidden;\">'\n + '<div class=\"vd-skeleton vd-skeleton-heading-lg\" style=\"margin-bottom:1.5rem;\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-paragraph\">'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div></div>'\n + '<div class=\"vd-dynamic-loader\" style=\"position:absolute;inset:0;\">'\n + '<div class=\"vd-dynamic-loader-grid\">'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-success\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-warning\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-error\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-info\"></div></div>'\n + '<span class=\"vd-dynamic-loader-text\">Loading\u2026</span></div></div>';\n }\n\n function _spinnerHtml() {\n return '<div class=\"vd-dynamic-loader\" style=\"min-height:180px;display:flex;align-items:center;justify-content:center;\">'\n + '<div class=\"vd-dynamic-loader-grid\">'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-success\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-warning\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-error\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-info\"></div></div>'\n + '<span class=\"vd-dynamic-loader-text\">Loading\u2026</span></div>';\n }\n\n function _resolvePlaceholder(placeholder) {\n if (!placeholder || placeholder === 'skeleton') return _skeletonHtml();\n if (placeholder === 'spinner') return _spinnerHtml();\n // Caller-supplied HTML string\n return placeholder;\n }\n\n /* \u2500\u2500 Dispatch helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n function _dispatch(el, eventName, detail) {\n el.dispatchEvent(new CustomEvent(eventName, { bubbles: true, detail: detail || {} }));\n }\n\n /* \u2500\u2500 VanduoLazyLoad \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const VanduoLazyLoad = {\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * LOW-LEVEL API\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Observe an element. `callback` is invoked once when the element\n * enters the viewport, then the element is automatically unobserved.\n *\n * @param {Element} element\n * @param {function(Element): void} callback\n * @param {{ threshold?: number, rootMargin?: string }} [options]\n */\n observe: function (element, callback, options) {\n if (!(element instanceof Element)) {\n console.warn('[VanduoLazyLoad] observe() requires a DOM Element.');\n return;\n }\n if (typeof callback !== 'function') {\n console.warn('[VanduoLazyLoad] observe() requires a callback function.');\n return;\n }\n // Already observed \u2014 ignore\n if (_observerMap.has(element)) return;\n\n const threshold = (options && options.threshold != null) ? options.threshold : 0;\n const rootMargin = (options && options.rootMargin) ? options.rootMargin : '0px';\n\n const observer = new IntersectionObserver(function (entries, obs) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n obs.unobserve(entry.target);\n _observerMap.delete(entry.target);\n if (typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.has(entry.target, 'lazyLoad')) {\n window.VanduoLifecycle.unregister(entry.target, 'lazyLoad');\n }\n try {\n callback(entry.target);\n } catch (e) {\n console.error('[VanduoLazyLoad] Callback threw:', e);\n }\n }\n });\n }, { threshold: threshold, rootMargin: rootMargin });\n\n _observerMap.set(element, observer);\n if (typeof window.VanduoLifecycle !== 'undefined' && !window.VanduoLifecycle.has(element, 'lazyLoad')) {\n window.VanduoLifecycle.register(element, 'lazyLoad', [() => {\n VanduoLazyLoad.unobserve(element, { skipLifecycle: true });\n }]);\n }\n observer.observe(element);\n },\n\n /**\n * Stop observing an element that was previously passed to observe().\n * @param {Element} element\n */\n unobserve: function (element, options) {\n const opts = options || {};\n const observer = _observerMap.get(element);\n if (observer) {\n observer.unobserve(element);\n if (typeof observer.disconnect === 'function') {\n observer.disconnect();\n }\n _observerMap.delete(element);\n }\n\n if (!opts.skipLifecycle && typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.has(element, 'lazyLoad')) {\n window.VanduoLifecycle.unregister(element, 'lazyLoad');\n }\n },\n\n /**\n * Stop observing ALL currently observed elements.\n */\n unobserveAll: function () {\n const observed = Array.from(_observerMap.keys());\n observed.forEach(function (element) {\n VanduoLazyLoad.unobserve(element);\n });\n },\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * HIGH-LEVEL API\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Fetch an HTML partial and inject it into `containerEl` when the\n * container enters the viewport. A placeholder is shown immediately.\n *\n * @param {string} url URL of the HTML partial to fetch\n * @param {Element} containerEl Target element whose content will be replaced\n * @param {{\n * placeholder?: 'skeleton'|'spinner'|string,\n * threshold?: number,\n * rootMargin?: string,\n * onLoaded?: function(Element): void,\n * onError?: function(Error): void\n * }} [options]\n */\n loadSection: function (url, containerEl, options) {\n if (typeof url !== 'string' || !url) {\n console.warn('[VanduoLazyLoad] loadSection() requires a non-empty URL string.');\n return;\n }\n if (!(containerEl instanceof Element)) {\n console.warn('[VanduoLazyLoad] loadSection() requires a DOM Element as containerEl.');\n return;\n }\n // Reject cross-origin URLs to prevent SSRF-style fetch abuse\n if (!_isSafeUrl(url)) {\n console.error('[VanduoLazyLoad] loadSection() blocked cross-origin URL:', url);\n return;\n }\n\n const opts = options || {};\n // Placeholders are known-safe static HTML strings built internally\n const placeholderHtml = _resolvePlaceholder(opts.placeholder);\n\n // Use _safeInjectHtml instead of innerHTML to prevent XSS from caller-supplied placeholders\n _safeInjectHtml(containerEl, placeholderHtml);\n _dispatch(containerEl, 'lazysection:loading', { url: url });\n\n // Fetch when visible\n this.observe(containerEl, function () {\n const controller = new window.AbortController();\n const timeoutId = setTimeout(function () { controller.abort(); }, 10000);\n\n window.fetch(url, { signal: controller.signal })\n .then(function (res) {\n clearTimeout(timeoutId);\n if (!res.ok) throw new Error('HTTP ' + res.status);\n return res.text();\n })\n .then(function (html) {\n // Use DOMParser to parse fetched content safely, avoiding\n // raw innerHTML assignment of externally-sourced strings\n _safeInjectHtml(containerEl, html);\n _dispatch(containerEl, 'lazysection:loaded', { url: url });\n // Re-init Vanduo components only inside the injected subtree\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.init(containerEl);\n }\n if (typeof opts.onLoaded === 'function') {\n opts.onLoaded(containerEl);\n }\n })\n .catch(function (err) {\n // Build error node via DOM APIs \u2014 no dynamic HTML strings\n const alertEl = document.createElement('div');\n alertEl.className = 'vd-alert vd-alert-error';\n alertEl.setAttribute('role', 'alert');\n const msgEl = document.createElement('span');\n msgEl.textContent = 'Failed to load content. ';\n const detailEl = document.createElement('small');\n detailEl.style.opacity = '0.7';\n detailEl.textContent = err.message;\n alertEl.appendChild(msgEl);\n alertEl.appendChild(detailEl);\n while (containerEl.firstChild) {\n containerEl.removeChild(containerEl.firstChild);\n }\n containerEl.appendChild(alertEl);\n _dispatch(containerEl, 'lazysection:error', { url: url, error: err });\n console.error('[VanduoLazyLoad] loadSection failed:', err);\n if (typeof opts.onError === 'function') {\n opts.onError(err);\n }\n });\n }, { threshold: opts.threshold, rootMargin: opts.rootMargin });\n },\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * ATTRIBUTE-DRIVEN INIT\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Scan the DOM for [data-vd-lazy] elements and wire them up.\n * Safe to call multiple times \u2014 already-observed elements are skipped.\n */\n init: function (root) {\n const self = this;\n const elements = _queryAll(root, '[data-vd-lazy]');\n elements.forEach(function (el) {\n // Skip already-observed or already-loaded elements\n if (_observerMap.has(el) || el.dataset.vdLazyState === 'loading' || el.dataset.vdLazyState === 'loaded') return;\n\n const url = el.getAttribute('data-vd-lazy');\n if (!url) return;\n\n el.dataset.vdLazyState = 'loading';\n const placeholder = el.getAttribute('data-vd-lazy-placeholder') || 'skeleton';\n\n self.loadSection(url, el, {\n placeholder: placeholder,\n onLoaded: function () {\n el.dataset.vdLazyState = 'loaded';\n },\n onError: function () {\n el.dataset.vdLazyState = 'error';\n }\n });\n });\n },\n\n destroy: function (element) {\n this.unobserve(element);\n },\n\n destroyAll: function (root) {\n const scope = _normalizeRoot(root);\n\n if (scope === document) {\n this.unobserveAll();\n return;\n }\n\n const observed = Array.from(_observerMap.keys());\n observed.forEach((element) => {\n if (_isInRoot(scope, element)) {\n this.unobserve(element);\n }\n });\n }\n };\n\n /* \u2500\u2500 Register with Vanduo \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('lazyLoad', VanduoLazyLoad, { aliases: ['LazyLoad'] });\n }\n\n /* \u2500\u2500 Global convenience alias \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n window.VanduoLazyLoad = VanduoLazyLoad;\n\n})();\n", "/**\n * Vanduo Framework - Glass Scroll Activation\n * Generic scroll-aware glass activation via IntersectionObserver.\n *\n * Usage:\n * Add `data-glass-scroll` to any element carrying a `.vd-glass*` class.\n * By default the previous sibling is used as the sentinel.\n * Point to a custom sentinel via `data-glass-sentinel=\"<CSS selector>\"`.\n *\n * Behaviour:\n * - Adds `.is-glass-active` when the sentinel leaves the viewport (scrolled past).\n * - Removes `.is-glass-active` when the sentinel re-enters the viewport.\n */\n(function () {\n 'use strict';\n\n const GlassScroll = {\n /** @type {Map<Element, IntersectionObserver>} */\n observers: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '[data-glass-scroll]').forEach(el => {\n if (this.observers.has(el)) return;\n this.initElement(el);\n });\n },\n\n /**\n * Wire up a single scroll-activated glass element.\n * @param {HTMLElement} el\n */\n initElement: function (el) {\n const sentinelSelector = el.dataset.glassSentinel;\n let sentinel;\n\n if (sentinelSelector) {\n sentinel = document.querySelector(sentinelSelector);\n }\n\n if (!sentinel) {\n // Fall back to the previous sibling element\n sentinel = el.previousElementSibling;\n }\n\n if (!sentinel) {\n // No sentinel available \u2014 activate immediately so glass is always shown\n el.classList.add('is-glass-active');\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n // Active when sentinel is NOT intersecting (scrolled past it)\n el.classList.toggle('is-glass-active', !entry.isIntersecting);\n });\n },\n { threshold: 0, rootMargin: '0px' }\n );\n\n observer.observe(sentinel);\n this.observers.set(el, observer);\n },\n\n /**\n * Disconnect and remove a single element's observer.\n * @param {HTMLElement} el\n */\n destroy: function (el) {\n const observer = this.observers.get(el);\n if (observer) {\n observer.disconnect();\n this.observers.delete(el);\n }\n },\n\n destroyAll: function () {\n this.observers.forEach((observer, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('glassScroll', GlassScroll);\n }\n\n window.VanduoGlassScroll = GlassScroll;\n})();\n", "/**\n * Vanduo Framework - Water Morph Effect Component\n * Liquid wave content-swap animation on click\n *\n * Usage:\n * Add .vd-morph or [data-vd-morph] to any element.\n * Provide .vd-morph-content.vd-morph-current and .vd-morph-content.vd-morph-next children.\n * Wave and shine layers are auto-created if absent.\n *\n * JS API:\n * VanduoMorph.morph(el) \u2014 trigger morph programmatically (from center)\n * VanduoMorph.destroy(el) \u2014 tear down listeners for one element\n * VanduoMorph.destroyAll() \u2014 tear down all instances\n */\n\n(function () {\n 'use strict';\n\n const MORPH_DURATION_MS = 750;\n\n const Morph = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-morph, [data-vd-morph]');\n elements.forEach(function (el) {\n if (Morph.instances.has(el)) return;\n if (el.getAttribute('data-vd-morph') === 'manual') return;\n Morph.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n Morph._ensureLayers(el);\n\n const cleanup = [];\n let morphing = false;\n\n const handleClick = function (e) {\n if (morphing) return;\n Morph._runMorph(el, e, function () { morphing = false; });\n morphing = true;\n };\n\n el.addEventListener('click', handleClick);\n cleanup.push(function () { el.removeEventListener('click', handleClick); });\n\n this.instances.set(el, { cleanup: cleanup });\n },\n\n morph: function (el) {\n if (!el) return;\n if (!this.instances.has(el)) this.initInstance(el);\n this._runMorph(el, null, null);\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(function (fn) { fn(); });\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach(function (_, el) { Morph.destroy(el); });\n },\n\n /* \u2500\u2500 Internal helpers \u2500\u2500 */\n\n _ensureLayers: function (el) {\n if (!el.querySelector('.vd-morph-wave')) {\n const wave = document.createElement('span');\n wave.className = 'vd-morph-wave';\n wave.setAttribute('aria-hidden', 'true');\n el.insertBefore(wave, el.firstChild);\n }\n if (!el.querySelector('.vd-morph-shine')) {\n const shine = document.createElement('span');\n shine.className = 'vd-morph-shine';\n shine.setAttribute('aria-hidden', 'true');\n const waveEl = el.querySelector('.vd-morph-wave');\n if (waveEl && waveEl.nextSibling) {\n el.insertBefore(shine, waveEl.nextSibling);\n } else {\n el.insertBefore(shine, el.firstChild);\n }\n }\n },\n\n _runMorph: function (el, pointerEvent, onComplete) {\n const wave = el.querySelector('.vd-morph-wave');\n if (wave) {\n const rect = el.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const px = pointerEvent ? (pointerEvent.clientX || cx) : cx;\n const py = pointerEvent ? (pointerEvent.clientY || cy) : cy;\n wave.style.left = (px - rect.left) + 'px';\n wave.style.top = (py - rect.top) + 'px';\n }\n\n el.classList.add('is-morphing');\n\n let duration = MORPH_DURATION_MS;\n const custom = getComputedStyle(el).getPropertyValue('--vd-morph-duration');\n if (custom) {\n const parsed = parseFloat(custom);\n if (!isNaN(parsed)) duration = parsed * (custom.indexOf('ms') !== -1 ? 1 : 1000);\n }\n\n setTimeout(function () {\n el.classList.remove('is-morphing');\n\n const current = el.querySelector('.vd-morph-current');\n const next = el.querySelector('.vd-morph-next');\n if (current && next) {\n current.classList.remove('vd-morph-current');\n current.classList.add('vd-morph-next');\n next.classList.remove('vd-morph-next');\n next.classList.add('vd-morph-current');\n }\n\n if (typeof onComplete === 'function') onComplete();\n }, duration);\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('morph', Morph);\n }\n\n window.VanduoMorph = Morph;\n\n})();\n", "/**\n * Vanduo Framework \u2014 Expanding flex cards\n * Click / Enter / Space / Arrow keys to change the active card.\n *\n * Usage:\n * <div class=\"vd-expanding-cards\" data-vd-expanding-cards>\n * Use data-vd-expanding-cards=\"manual\" to skip auto-init.\n */\n\n(function () {\n 'use strict';\n\n const ExpandingCards = {\n instances: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-expanding-cards').forEach(function (el) {\n if (el.getAttribute('data-vd-expanding-cards') === 'manual') return;\n if (ExpandingCards.instances.has(el)) return;\n ExpandingCards.initContainer(el);\n });\n },\n\n initContainer: function (container) {\n const cleanup = [];\n\n const getCards = function () {\n return Array.prototype.slice.call(container.querySelectorAll('.vd-expanding-card'));\n };\n\n const setActive = function (card) {\n const cards = getCards();\n if (!card || cards.indexOf(card) === -1) return;\n cards.forEach(function (c) {\n c.classList.toggle('is-active', c === card);\n });\n card.focus({ preventScroll: true });\n };\n\n const onClick = function (e) {\n const t = e.target;\n const card = t.closest ? t.closest('.vd-expanding-card') : null;\n if (!card || !container.contains(card)) return;\n setActive(card);\n };\n\n const onKeydown = function (e) {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight' && e.key !== 'Home' && e.key !== 'End') {\n return;\n }\n const cards = getCards().filter(function (c) {\n return c.offsetParent !== null || c.getClientRects().length > 0;\n });\n if (!cards.length) return;\n const activeEl = document.activeElement;\n let idx = cards.indexOf(activeEl);\n if (idx < 0) {\n idx = cards.findIndex(function (c) {\n return c.classList.contains('is-active');\n });\n }\n if (idx < 0) idx = 0;\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n setActive(cards[Math.max(0, idx - 1)]);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n setActive(cards[Math.min(cards.length - 1, idx + 1)]);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(cards[0]);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(cards[cards.length - 1]);\n }\n };\n\n container.addEventListener('click', onClick);\n cleanup.push(function () {\n container.removeEventListener('click', onClick);\n });\n\n container.addEventListener('keydown', onKeydown);\n cleanup.push(function () {\n container.removeEventListener('keydown', onKeydown);\n });\n\n getCards().forEach(function (card) {\n if (!card.hasAttribute('tabindex')) {\n card.setAttribute('tabindex', '0');\n }\n card.setAttribute('role', 'button');\n if (!card.hasAttribute('aria-pressed')) {\n card.setAttribute('aria-pressed', card.classList.contains('is-active') ? 'true' : 'false');\n }\n });\n\n const syncAria = function () {\n getCards().forEach(function (card) {\n card.setAttribute('aria-pressed', card.classList.contains('is-active') ? 'true' : 'false');\n });\n };\n\n const mo = new MutationObserver(syncAria);\n mo.observe(container, { attributes: true, subtree: true, attributeFilter: ['class'] });\n cleanup.push(function () {\n mo.disconnect();\n });\n syncAria();\n\n ExpandingCards.instances.set(container, { cleanup: cleanup });\n },\n\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n inst.cleanup.forEach(function (fn) {\n fn();\n });\n this.instances.delete(container);\n },\n\n destroyAll: function () {\n this.instances.forEach(function (_, el) {\n ExpandingCards.destroy(el);\n });\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('expandingCards', ExpandingCards);\n }\n\n window.VanduoExpandingCards = ExpandingCards;\n})();\n", "/**\n * Vanduo Framework \u2014 Timeline animated reveal\n * Opt-in: add `.vd-timeline-animated` to a `.vd-timeline` container.\n * Uses IntersectionObserver to add `.is-revealed` per item with staggered delays.\n * Optional: `.vd-timeline-playback` with `[data-vd-timeline-prev|next|play|pause]` for stepped control.\n */\n\n(function () {\n 'use strict';\n\n const STAGGER_MS = 140;\n const MAX_STAGGER_INDEX = 7;\n const PLAY_INTERVAL_MS = 800;\n\n function countRevealedPrefix(items) {\n let count = 0;\n for (let i = 0; i < items.length; i++) {\n if (!items[i].classList.contains('is-revealed')) break;\n count++;\n }\n return count;\n }\n\n function findPlaybackControls(container) {\n return container.parentElement || document.body;\n }\n\n function initPlayback(container, items, cleanup) {\n items.forEach(function (item) {\n item.classList.remove('is-revealed');\n });\n\n const scope = findPlaybackControls(container);\n const prevBtn = scope.querySelector('[data-vd-timeline-prev]');\n const nextBtn = scope.querySelector('[data-vd-timeline-next]');\n const playBtn = scope.querySelector('[data-vd-timeline-play]');\n const pauseBtn = scope.querySelector('[data-vd-timeline-pause]');\n\n let playTimer = null;\n let isPlaying = false;\n let playToken = 0;\n\n function updateNavButtons() {\n const k = countRevealedPrefix(items);\n const n = items.length;\n if (prevBtn) {\n const atStart = k === 0;\n prevBtn.disabled = atStart;\n prevBtn.setAttribute('aria-disabled', atStart ? 'true' : 'false');\n }\n if (nextBtn) {\n const atEnd = k >= n;\n nextBtn.disabled = atEnd;\n nextBtn.setAttribute('aria-disabled', atEnd ? 'true' : 'false');\n }\n if (playBtn) {\n playBtn.setAttribute('aria-pressed', isPlaying ? 'true' : 'false');\n }\n if (pauseBtn) {\n pauseBtn.disabled = !isPlaying;\n }\n }\n\n function stepNext() {\n const k = countRevealedPrefix(items);\n if (k < items.length) {\n items[k].classList.add('is-revealed');\n }\n updateNavButtons();\n }\n\n function stepPrev() {\n const k = countRevealedPrefix(items);\n if (k > 0) {\n items[k - 1].classList.remove('is-revealed');\n }\n updateNavButtons();\n }\n\n function scheduleNext() {\n const token = ++playToken;\n playTimer = setTimeout(function () {\n playTimer = null;\n\n if (!isPlaying || token !== playToken) {\n return;\n }\n\n if (countRevealedPrefix(items) >= items.length) {\n pause();\n return;\n }\n\n stepNext();\n\n if (countRevealedPrefix(items) >= items.length) {\n pause();\n return;\n }\n\n scheduleNext();\n }, PLAY_INTERVAL_MS);\n }\n\n function play() {\n if (isPlaying) return;\n isPlaying = true;\n scheduleNext();\n updateNavButtons();\n }\n\n function pause() {\n isPlaying = false;\n playToken++;\n if (playTimer) {\n clearTimeout(playTimer);\n playTimer = null;\n }\n updateNavButtons();\n }\n\n function addClick(el, fn) {\n if (!el) return;\n const handler = function (e) {\n e.preventDefault();\n fn();\n };\n el.addEventListener('click', handler);\n cleanup.push(function () {\n el.removeEventListener('click', handler);\n });\n }\n\n addClick(prevBtn, stepPrev);\n addClick(nextBtn, stepNext);\n addClick(playBtn, play);\n addClick(pauseBtn, pause);\n\n cleanup.push(function () {\n pause();\n });\n\n updateNavButtons();\n\n return {\n stepNext: stepNext,\n stepPrev: stepPrev,\n play: play,\n pause: pause\n };\n }\n\n const Timeline = {\n instances: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-timeline.vd-timeline-animated').forEach(function (el) {\n if (Timeline.instances.has(el)) return;\n Timeline.initInstance(el);\n });\n },\n\n reinit: function (root) {\n Timeline.destroyAll(root);\n Timeline.init(root);\n },\n\n initInstance: function (container) {\n const cleanup = [];\n const items = Array.prototype.filter.call(container.children, function (child) {\n return child.classList && child.classList.contains('vd-timeline-item');\n });\n\n items.forEach(function (item, i) {\n const idx = Math.min(i, MAX_STAGGER_INDEX);\n item.style.setProperty('--vd-timeline-reveal-delay', (idx * STAGGER_MS) + 'ms');\n });\n\n const reducedMotion = typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n items.forEach(function (item) {\n item.classList.add('is-revealed');\n });\n Timeline.instances.set(container, { cleanup: cleanup });\n return;\n }\n\n const playback = container.classList && container.classList.contains('vd-timeline-playback');\n\n if (playback) {\n const playbackApi = initPlayback(container, items, cleanup);\n Timeline.instances.set(container, { cleanup: cleanup, playback: playbackApi });\n return;\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n items.forEach(function (item) {\n item.classList.add('is-revealed');\n });\n Timeline.instances.set(container, { cleanup: cleanup });\n return;\n }\n\n const observer = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (!entry.isIntersecting) return;\n entry.target.classList.add('is-revealed');\n observer.unobserve(entry.target);\n });\n }, {\n root: null,\n rootMargin: '0px 0px -10% 0px',\n threshold: 0.15\n });\n\n items.forEach(function (item) {\n observer.observe(item);\n });\n\n cleanup.push(function () {\n observer.disconnect();\n });\n\n Timeline.instances.set(container, { cleanup: cleanup });\n },\n\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n inst.cleanup.forEach(function (fn) {\n fn();\n });\n this.instances.delete(container);\n },\n\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : document;\n\n this.instances.forEach(function (_, el) {\n if (scope !== document && scope !== el && (!scope.contains || !scope.contains(el))) return;\n Timeline.destroy(el);\n });\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('timeline', Timeline);\n }\n\n window.VanduoTimeline = Timeline;\n})();\n", "/**\n * Vanduo Framework - Flow (Carousel/Slider) Component\n * Touch-enabled carousel with slide/fade transitions, autoplay, indicators\n */\n\n(function () {\n 'use strict';\n\n const Flow = {\n instances: new Map(),\n\n init: function (root) {\n const carousels = window.Vanduo.queryAll(root, '.vd-flow, .vd-carousel');\n carousels.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const track = el.querySelector('.vd-flow-track');\n if (!track) return;\n\n const slides = Array.from(track.querySelectorAll('.vd-flow-slide'));\n if (slides.length === 0) return;\n\n const isFade = el.classList.contains('vd-flow-fade');\n const autoplay = el.hasAttribute('data-vd-autoplay');\n const interval = parseInt(el.getAttribute('data-vd-interval'), 10) || 5000;\n const loop = el.getAttribute('data-vd-loop') !== 'false';\n\n const state = {\n current: 0,\n total: slides.length,\n autoplayTimer: null,\n isFade: isFade,\n loop: loop,\n isDragging: false,\n startX: 0,\n currentX: 0,\n threshold: 50\n };\n\n const cleanup = [];\n\n // Set initial active slide\n slides.forEach((slide, i) => {\n slide.setAttribute('role', 'group');\n slide.setAttribute('aria-roledescription', 'slide');\n slide.setAttribute('aria-label', 'Slide ' + (i + 1) + ' of ' + slides.length);\n if (i === 0) slide.classList.add('is-active');\n });\n\n el.setAttribute('role', 'region');\n el.setAttribute('aria-roledescription', 'carousel');\n if (!el.getAttribute('aria-label')) {\n el.setAttribute('aria-label', 'Carousel');\n }\n\n // Live region for announcements\n const liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.className = 'sr-only';\n liveRegion.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);';\n el.appendChild(liveRegion);\n\n const goTo = (index, announce) => {\n if (announce === undefined) announce = true;\n let target = index;\n if (state.loop) {\n target = ((index % state.total) + state.total) % state.total;\n } else {\n target = Math.max(0, Math.min(index, state.total - 1));\n }\n\n const prev = state.current;\n state.current = target;\n\n if (state.isFade) {\n slides.forEach((s, i) => {\n s.classList.toggle('is-active', i === target);\n });\n } else {\n track.style.transform = 'translateX(-' + (target * 100) + '%)';\n }\n\n // Update indicators\n const indicators = el.querySelectorAll('.vd-flow-indicator');\n indicators.forEach((ind, i) => {\n ind.classList.toggle('is-active', i === target);\n ind.setAttribute('aria-selected', i === target ? 'true' : 'false');\n });\n\n // Update slide ARIA\n slides.forEach((s, i) => {\n s.setAttribute('aria-hidden', i !== target ? 'true' : 'false');\n });\n\n if (announce) {\n liveRegion.textContent = 'Slide ' + (target + 1) + ' of ' + state.total;\n }\n\n el.dispatchEvent(new CustomEvent('flow:change', {\n detail: { current: target, previous: prev, total: state.total }\n }));\n };\n\n const next = () => goTo(state.current + 1);\n const prev = () => goTo(state.current - 1);\n\n // Controls\n const prevBtn = el.querySelector('.vd-flow-prev');\n const nextBtn = el.querySelector('.vd-flow-next');\n\n if (prevBtn) {\n const h = () => prev();\n prevBtn.addEventListener('click', h);\n cleanup.push(() => prevBtn.removeEventListener('click', h));\n }\n if (nextBtn) {\n const h = () => next();\n nextBtn.addEventListener('click', h);\n cleanup.push(() => nextBtn.removeEventListener('click', h));\n }\n\n // Indicators\n const indicators = el.querySelectorAll('.vd-flow-indicator');\n indicators.forEach((ind, i) => {\n ind.setAttribute('role', 'tab');\n ind.setAttribute('aria-selected', i === 0 ? 'true' : 'false');\n ind.setAttribute('aria-label', 'Go to slide ' + (i + 1));\n const h = () => goTo(i);\n ind.addEventListener('click', h);\n cleanup.push(() => ind.removeEventListener('click', h));\n });\n\n // Keyboard navigation\n const keyHandler = (e) => {\n if (e.key === 'ArrowLeft') { prev(); e.preventDefault(); }\n if (e.key === 'ArrowRight') { next(); e.preventDefault(); }\n };\n el.setAttribute('tabindex', '0');\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n\n // Touch / pointer support\n const pointerDown = (e) => {\n state.isDragging = true;\n state.startX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n state.currentX = state.startX;\n el.classList.add('is-dragging');\n };\n\n const pointerMove = (e) => {\n if (!state.isDragging) return;\n state.currentX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n };\n\n const pointerUp = () => {\n if (!state.isDragging) return;\n state.isDragging = false;\n el.classList.remove('is-dragging');\n const diff = state.startX - state.currentX;\n if (Math.abs(diff) > state.threshold) {\n if (diff > 0) next();\n else prev();\n }\n };\n\n el.addEventListener('mousedown', pointerDown);\n el.addEventListener('mousemove', pointerMove);\n el.addEventListener('mouseup', pointerUp);\n el.addEventListener('mouseleave', pointerUp);\n el.addEventListener('touchstart', pointerDown, { passive: true });\n el.addEventListener('touchmove', pointerMove, { passive: true });\n el.addEventListener('touchend', pointerUp);\n\n cleanup.push(\n () => el.removeEventListener('mousedown', pointerDown),\n () => el.removeEventListener('mousemove', pointerMove),\n () => el.removeEventListener('mouseup', pointerUp),\n () => el.removeEventListener('mouseleave', pointerUp),\n () => el.removeEventListener('touchstart', pointerDown),\n () => el.removeEventListener('touchmove', pointerMove),\n () => el.removeEventListener('touchend', pointerUp)\n );\n\n // Autoplay\n const startAutoplay = () => {\n stopAutoplay();\n state.autoplayTimer = setInterval(next, interval);\n };\n\n const stopAutoplay = () => {\n if (state.autoplayTimer) {\n clearInterval(state.autoplayTimer);\n state.autoplayTimer = null;\n }\n };\n\n if (autoplay) {\n startAutoplay();\n const pauseHandler = () => stopAutoplay();\n const resumeHandler = () => startAutoplay();\n el.addEventListener('mouseenter', pauseHandler);\n el.addEventListener('mouseleave', resumeHandler);\n el.addEventListener('focusin', pauseHandler);\n el.addEventListener('focusout', resumeHandler);\n cleanup.push(\n () => el.removeEventListener('mouseenter', pauseHandler),\n () => el.removeEventListener('mouseleave', resumeHandler),\n () => el.removeEventListener('focusin', pauseHandler),\n () => el.removeEventListener('focusout', resumeHandler),\n () => stopAutoplay()\n );\n }\n\n // Initial ARIA state\n goTo(0, false);\n\n this.instances.set(el, {\n cleanup: cleanup,\n goTo: goTo,\n next: next,\n prev: prev,\n getState: () => ({ ...state })\n });\n },\n\n goTo: function (el, index) {\n const instance = this.instances.get(el);\n if (instance) instance.goTo(index);\n },\n\n next: function (el) {\n const instance = this.instances.get(el);\n if (instance) instance.next();\n },\n\n prev: function (el) {\n const instance = this.instances.get(el);\n if (instance) instance.prev();\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('flow', Flow);\n }\n\n window.VanduoFlow = Flow;\n\n})();\n", "/**\n * Vanduo Framework - Bubble (Popover) Component\n * Click-triggered rich HTML popover, reuses tooltip positioning concepts\n */\n\n(function () {\n 'use strict';\n\n const Bubble = {\n instances: new Map(),\n _globalCleanups: [],\n\n init: function (root) {\n const triggers = window.Vanduo.queryAll(root, '[data-vd-bubble], [data-vd-popover]');\n triggers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n\n if (this._globalCleanups.length === 0) {\n const outsideClick = (e) => {\n this.instances.forEach((inst, trigger) => {\n if (!inst.popover.contains(e.target) && !trigger.contains(e.target)) {\n this.hide(trigger);\n }\n });\n };\n const escHandler = (e) => {\n if (e.key === 'Escape') {\n this.instances.forEach((_, trigger) => this.hide(trigger));\n }\n };\n document.addEventListener('click', outsideClick, true);\n document.addEventListener('keydown', escHandler);\n this._globalCleanups.push(\n () => document.removeEventListener('click', outsideClick, true),\n () => document.removeEventListener('keydown', escHandler)\n );\n }\n },\n\n initInstance: function (trigger) {\n const cleanup = [];\n const placement = trigger.getAttribute('data-vd-bubble-placement') ||\n trigger.getAttribute('data-vd-popover-placement') || 'bottom';\n\n // Build popover element\n const popover = document.createElement('div');\n popover.className = 'vd-bubble-content';\n popover.setAttribute('role', 'dialog');\n popover.setAttribute('aria-modal', 'false');\n popover.setAttribute('data-placement', placement);\n\n const title = trigger.getAttribute('data-vd-bubble-title') ||\n trigger.getAttribute('data-vd-popover-title');\n const content = trigger.getAttribute('data-vd-bubble') ||\n trigger.getAttribute('data-vd-popover') || '';\n const htmlContent = trigger.getAttribute('data-vd-bubble-html') ||\n trigger.getAttribute('data-vd-popover-html');\n const allowSvg = trigger.hasAttribute('data-vd-bubble-allow-svg') ||\n trigger.hasAttribute('data-vd-popover-allow-svg');\n\n if (title) {\n const header = document.createElement('div');\n header.className = 'vd-bubble-header';\n const titleSpan = document.createElement('span');\n titleSpan.textContent = title;\n const closeBtn = document.createElement('button');\n closeBtn.className = 'vd-bubble-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.innerHTML = '&times;';\n header.appendChild(titleSpan);\n header.appendChild(closeBtn);\n popover.appendChild(header);\n\n const closeHandler = (e) => { e.stopPropagation(); this.hide(trigger); };\n closeBtn.addEventListener('click', closeHandler);\n cleanup.push(() => closeBtn.removeEventListener('click', closeHandler));\n }\n\n const body = document.createElement('div');\n body.className = 'vd-bubble-body';\n if (htmlContent) {\n if (typeof sanitizeHtml === 'function') {\n body.innerHTML = sanitizeHtml(htmlContent, { allowSvg, allowStyle: false });\n } else {\n body.textContent = htmlContent;\n }\n } else {\n body.textContent = content;\n }\n popover.appendChild(body);\n\n document.body.appendChild(popover);\n\n // ARIA on trigger\n const popId = 'vd-bubble-' + Math.random().toString(36).slice(2, 9);\n popover.id = popId;\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.setAttribute('aria-controls', popId);\n\n // Toggle on click\n const toggleHandler = (e) => {\n e.stopPropagation();\n if (popover.classList.contains('is-visible')) {\n this.hide(trigger);\n } else {\n this.hideAll();\n this.show(trigger);\n }\n };\n trigger.addEventListener('click', toggleHandler);\n cleanup.push(() => trigger.removeEventListener('click', toggleHandler));\n\n this.instances.set(trigger, { popover, cleanup, placement });\n },\n\n position: function (trigger, popover, placement) {\n const rect = trigger.getBoundingClientRect();\n const popRect = popover.getBoundingClientRect();\n const gap = 10;\n let top, left;\n\n switch (placement) {\n case 'top':\n top = rect.top - popRect.height - gap + window.scrollY;\n left = rect.left + (rect.width - popRect.width) / 2 + window.scrollX;\n break;\n case 'left':\n top = rect.top + (rect.height - popRect.height) / 2 + window.scrollY;\n left = rect.left - popRect.width - gap + window.scrollX;\n break;\n case 'right':\n top = rect.top + (rect.height - popRect.height) / 2 + window.scrollY;\n left = rect.right + gap + window.scrollX;\n break;\n default: // bottom\n top = rect.bottom + gap + window.scrollY;\n left = rect.left + (rect.width - popRect.width) / 2 + window.scrollX;\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, window.innerWidth - popRect.width - 8));\n top = Math.max(8, top);\n\n popover.style.top = top + 'px';\n popover.style.left = left + 'px';\n },\n\n show: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n const { popover, placement } = instance;\n\n popover.style.display = 'block';\n popover.classList.add('is-visible');\n trigger.setAttribute('aria-expanded', 'true');\n\n requestAnimationFrame(() => {\n this.position(trigger, popover, placement);\n });\n\n trigger.dispatchEvent(new CustomEvent('bubble:show', {\n bubbles: true,\n detail: { trigger: trigger, placement: placement }\n }));\n },\n\n hide: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n instance.popover.classList.remove('is-visible');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.dispatchEvent(new CustomEvent('bubble:hide', {\n bubbles: true,\n detail: { trigger: trigger }\n }));\n },\n\n hideAll: function () {\n this.instances.forEach((_, trigger) => this.hide(trigger));\n },\n\n destroy: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n if (instance.popover.parentNode) {\n instance.popover.parentNode.removeChild(instance.popover);\n }\n trigger.removeAttribute('aria-haspopup');\n trigger.removeAttribute('aria-expanded');\n trigger.removeAttribute('aria-controls');\n this.instances.delete(trigger);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, trigger) => this.destroy(trigger));\n this._globalCleanups.forEach(fn => fn());\n this._globalCleanups = [];\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('bubble', Bubble);\n }\n\n window.VanduoBubble = Bubble;\n\n})();\n", "/**\n * Vanduo Framework - Waypoint (Scrollspy) Component\n * Highlights navigation links based on scroll position using IntersectionObserver\n */\n\n(function () {\n 'use strict';\n\n const Waypoint = {\n instances: new Map(),\n\n init: function (root) {\n const navs = window.Vanduo.queryAll(root, '[data-vd-waypoint-nav], [data-vd-scrollspy-nav]');\n navs.forEach(nav => {\n if (this.instances.has(nav)) return;\n this.initInstance(nav);\n });\n },\n\n initInstance: function (nav) {\n const links = Array.from(nav.querySelectorAll('a[href^=\"#\"]'));\n if (links.length === 0) return;\n\n const cleanup = [];\n const offset = parseInt(nav.getAttribute('data-vd-waypoint-offset') || '80', 10);\n const sections = [];\n\n links.forEach(link => {\n const id = link.getAttribute('href').slice(1);\n const section = document.getElementById(id);\n if (section) {\n section.setAttribute('data-vd-waypoint-section', '');\n sections.push({ id, link, section });\n }\n });\n\n if (sections.length === 0) return;\n\n const activeSections = new Set();\n\n const setActive = (id) => {\n links.forEach(l => l.classList.remove('is-active'));\n const target = links.find(l => l.getAttribute('href') === '#' + id);\n if (target) {\n target.classList.add('is-active');\n nav.dispatchEvent(new CustomEvent('waypoint:change', {\n detail: { activeId: id, link: target }\n }));\n }\n };\n\n const rootMargin = '-' + offset + 'px 0px -40% 0px';\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n activeSections.add(entry.target.id);\n } else {\n activeSections.delete(entry.target.id);\n }\n });\n\n // Pick the topmost visible section\n for (let i = 0; i < sections.length; i++) {\n if (activeSections.has(sections[i].id)) {\n setActive(sections[i].id);\n return;\n }\n }\n }, {\n rootMargin: rootMargin,\n threshold: 0\n });\n\n sections.forEach(s => observer.observe(s.section));\n\n // Smooth scroll on click\n links.forEach(link => {\n const clickHandler = (e) => {\n e.preventDefault();\n const id = link.getAttribute('href').slice(1);\n const section = document.getElementById(id);\n if (section) {\n section.scrollIntoView({ behavior: 'smooth' });\n setActive(id);\n }\n };\n link.addEventListener('click', clickHandler);\n cleanup.push(() => link.removeEventListener('click', clickHandler));\n });\n\n cleanup.push(() => observer.disconnect());\n\n this.instances.set(nav, { observer, cleanup, sections, setActive });\n },\n\n refresh: function (nav) {\n this.destroy(nav);\n this.initInstance(nav);\n },\n\n destroy: function (nav) {\n const instance = this.instances.get(nav);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(nav);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, nav) => this.destroy(nav));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('waypoint', Waypoint);\n }\n\n window.VanduoWaypoint = Waypoint;\n\n})();\n", "/**\n * Vanduo Framework - Ripple (Waves Effect) Component\n * Adds expanding circle animation on click at pointer position\n */\n\n(function () {\n 'use strict';\n\n const Ripple = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-ripple, [data-vd-ripple]');\n elements.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n\n const createWave = (e) => {\n const rect = el.getBoundingClientRect();\n const size = Math.max(rect.width, rect.height);\n const x = (e.clientX || (e.touches && e.touches[0].clientX) || rect.left + rect.width / 2) - rect.left - size / 2;\n const y = (e.clientY || (e.touches && e.touches[0].clientY) || rect.top + rect.height / 2) - rect.top - size / 2;\n\n const wave = document.createElement('span');\n wave.className = 'vd-ripple-wave';\n wave.style.width = size + 'px';\n wave.style.height = size + 'px';\n wave.style.left = x + 'px';\n wave.style.top = y + 'px';\n\n el.appendChild(wave);\n\n wave.addEventListener('animationend', () => {\n if (wave.parentNode) wave.parentNode.removeChild(wave);\n });\n };\n\n el.addEventListener('mousedown', createWave);\n el.addEventListener('touchstart', createWave, { passive: true });\n\n cleanup.push(\n () => el.removeEventListener('mousedown', createWave),\n () => el.removeEventListener('touchstart', createWave)\n );\n\n this.instances.set(el, { cleanup });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n // Remove any lingering wave elements\n el.querySelectorAll('.vd-ripple-wave').forEach(w => w.remove());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('ripple', Ripple);\n }\n\n window.VanduoRipple = Ripple;\n\n})();\n", "/**\n * Vanduo Framework - Affix (Sticky) Component\n * Uses IntersectionObserver to toggle .is-stuck within the nearest scrollable parent\n */\n\n(function () {\n 'use strict';\n\n function isScrollable(element) {\n if (!element || element === document.body) return false;\n\n const style = window.getComputedStyle(element);\n const overflowY = style.overflowY;\n const overflowX = style.overflowX;\n const canScrollY = /(auto|scroll|overlay)/.test(overflowY) && element.scrollHeight > element.clientHeight;\n const canScrollX = /(auto|scroll|overlay)/.test(overflowX) && element.scrollWidth > element.clientWidth;\n\n return canScrollY || canScrollX;\n }\n\n function getScrollParent(element) {\n let parent = element.parentElement;\n\n while (parent && parent !== document.body && parent !== document.documentElement) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n\n return null;\n }\n\n const Affix = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-affix, .vd-sticky, [data-vd-affix]');\n elements.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const parsedOffset = parseInt(el.getAttribute('data-vd-affix-offset') || '0', 10);\n const offset = Number.isNaN(parsedOffset) ? 0 : parsedOffset;\n const scrollParent = getScrollParent(el);\n let isStuck = false;\n\n const sentinel = document.createElement('div');\n sentinel.style.cssText = 'display:block;height:1px;margin-bottom:-1px;visibility:hidden;pointer-events:none;';\n el.parentNode.insertBefore(sentinel, el);\n\n el.style.setProperty('--vd-affix-top-offset', offset + 'px');\n\n function stick() {\n if (isStuck) return;\n isStuck = true;\n el.classList.add('is-stuck');\n el.dispatchEvent(new CustomEvent('affix:stuck', {\n bubbles: true,\n detail: {\n offset: offset,\n root: scrollParent || window\n }\n }));\n }\n\n function unstick() {\n if (!isStuck) return;\n isStuck = false;\n el.classList.remove('is-stuck');\n el.dispatchEvent(new CustomEvent('affix:unstuck', {\n bubbles: true,\n detail: {\n offset: offset,\n root: scrollParent || window\n }\n }));\n }\n\n const observer = new IntersectionObserver(function (entries) {\n entries.forEach(entry => {\n if (!entry.isIntersecting) {\n stick();\n } else {\n unstick();\n }\n });\n }, {\n root: scrollParent,\n rootMargin: '-' + offset + 'px 0px 0px 0px',\n threshold: 0\n });\n\n observer.observe(sentinel);\n\n cleanup.push(\n () => observer.disconnect(),\n () => { if (sentinel.parentNode) sentinel.parentNode.removeChild(sentinel); },\n () => {\n el.classList.remove('is-stuck');\n el.style.removeProperty('--vd-affix-top-offset');\n }\n );\n\n this.instances.set(el, { cleanup, observer, sentinel, scrollParent });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n el.classList.remove('is-stuck');\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('affix', Affix);\n }\n\n window.VanduoAffix = Affix;\n\n})();\n", "/**\n * Vanduo Framework - Suggest (Autocomplete) Component\n * Dropdown suggestion list with keyboard navigation, static/async data sources\n */\n\n(function () {\n 'use strict';\n\n /**\n * Escape HTML entities to prevent XSS when inserting into innerHTML\n * @param {string} text\n * @returns {string}\n */\n function _escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Allow same-origin URLs by default, or an explicit allowlist of origins.\n * @param {string} url\n * @param {string[]} allowlist\n * @returns {boolean}\n */\n function _isSafeUrl(url, allowlist) {\n try {\n const resolved = new URL(url, window.location.href);\n if (resolved.origin === window.location.origin) return true;\n return allowlist.includes(resolved.origin);\n } catch (_e) {\n return false;\n }\n }\n\n const Suggest = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-suggest], [data-vd-autocomplete]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const minChars = parseInt(input.getAttribute('data-vd-suggest-min-chars') || '1', 10);\n const url = input.getAttribute('data-vd-suggest-url') || '';\n const allowlistAttr = input.getAttribute('data-vd-suggest-allowlist') || '';\n const allowlist = allowlistAttr\n .split(',')\n .map(value => value.trim())\n .filter(Boolean);\n const staticData = input.getAttribute('data-vd-suggest') || input.getAttribute('data-vd-autocomplete') || '';\n let items = [];\n\n try { items = JSON.parse(staticData); } catch (_e) {\n items = staticData.split(',').map(s => s.trim()).filter(Boolean);\n }\n\n // Wrap input if not already wrapped\n let wrapper = input.closest('.vd-suggest-wrapper, .vd-autocomplete-wrapper');\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.className = 'vd-suggest-wrapper';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n }\n\n // Create dropdown list\n const list = document.createElement('ul');\n list.className = 'vd-suggest-list';\n list.setAttribute('role', 'listbox');\n const listId = 'vd-suggest-' + Math.random().toString(36).slice(2, 9);\n list.id = listId;\n wrapper.appendChild(list);\n\n // ARIA\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-controls', listId);\n input.setAttribute('autocomplete', 'off');\n\n let highlighted = -1;\n let currentItems = [];\n let debounceTimer = null;\n\n const renderItems = (filtered, query) => {\n list.innerHTML = '';\n currentItems = filtered;\n highlighted = -1;\n\n if (filtered.length === 0) {\n const empty = document.createElement('li');\n empty.className = 'vd-suggest-empty';\n empty.textContent = 'No results';\n list.appendChild(empty);\n return;\n }\n\n filtered.forEach((item, i) => {\n const li = document.createElement('li');\n li.className = 'vd-suggest-item';\n li.setAttribute('role', 'option');\n li.id = listId + '-item-' + i;\n\n const text = typeof item === 'object' ? (item.label || item.text || String(item)) : String(item);\n if (query) {\n // Escape HTML first to prevent XSS, then highlight matches in the safe string\n const escaped = _escapeHtml(text);\n const re = new RegExp('(' + query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')', 'gi');\n li.innerHTML = escaped.replace(re, '<span class=\"vd-suggest-match\">$1</span>');\n } else {\n li.textContent = text;\n }\n\n li.addEventListener('click', () => selectItem(i));\n list.appendChild(li);\n });\n };\n\n const open = () => {\n list.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n };\n\n const close = () => {\n list.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n highlighted = -1;\n input.removeAttribute('aria-activedescendant');\n };\n\n const selectItem = (index) => {\n const item = currentItems[index];\n const value = typeof item === 'object' ? (item.value || item.label || String(item)) : String(item);\n input.value = value;\n close();\n input.dispatchEvent(new CustomEvent('suggest:select', {\n detail: { value, item, index },\n bubbles: true\n }));\n };\n\n const highlight = (index) => {\n const listItems = list.querySelectorAll('.vd-suggest-item');\n listItems.forEach(li => li.classList.remove('is-highlighted'));\n if (index >= 0 && index < listItems.length) {\n highlighted = index;\n listItems[index].classList.add('is-highlighted');\n input.setAttribute('aria-activedescendant', listItems[index].id);\n listItems[index].scrollIntoView({ block: 'nearest' });\n }\n };\n\n const doSearch = async (query) => {\n if (query.length < minChars) { close(); return; }\n\n let filtered;\n if (url) {\n try {\n if (!_isSafeUrl(url, allowlist)) {\n console.warn('[VanduoSuggest] Blocked non-allowlisted URL:', url);\n filtered = [];\n } else {\n const separator = url.includes('?') ? '&' : '?';\n const res = await window.fetch(url + separator + 'q=' + encodeURIComponent(query));\n filtered = await res.json();\n }\n } catch (_e) {\n filtered = [];\n }\n } else {\n const lower = query.toLowerCase();\n filtered = items.filter(item => {\n const text = typeof item === 'object' ? (item.label || item.text || String(item)) : String(item);\n return text.toLowerCase().includes(lower);\n });\n }\n\n renderItems(filtered, query);\n if (filtered.length > 0) open();\n else open(); // show \"no results\"\n };\n\n const inputHandler = () => {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => doSearch(input.value), 200);\n };\n\n const keyHandler = (e) => {\n if (!list.classList.contains('is-open')) {\n if (e.key === 'ArrowDown') { doSearch(input.value); e.preventDefault(); }\n return;\n }\n\n const total = currentItems.length;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n highlight(highlighted < total - 1 ? highlighted + 1 : 0);\n break;\n case 'ArrowUp':\n e.preventDefault();\n highlight(highlighted > 0 ? highlighted - 1 : total - 1);\n break;\n case 'Enter':\n e.preventDefault();\n if (highlighted >= 0) selectItem(highlighted);\n break;\n case 'Escape':\n close();\n break;\n }\n };\n\n const blurHandler = () => {\n setTimeout(close, 200);\n };\n const focusHandler = () => {\n if (input.value.length >= minChars) {\n doSearch(input.value);\n }\n };\n\n input.addEventListener('input', inputHandler);\n input.addEventListener('keydown', keyHandler);\n input.addEventListener('blur', blurHandler);\n input.addEventListener('focus', focusHandler);\n\n cleanup.push(\n () => input.removeEventListener('input', inputHandler),\n () => input.removeEventListener('keydown', keyHandler),\n () => input.removeEventListener('blur', blurHandler),\n () => input.removeEventListener('focus', focusHandler),\n () => clearTimeout(debounceTimer),\n () => { if (list.parentNode) list.parentNode.removeChild(list); }\n );\n\n this.instances.set(input, { cleanup, list, close });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('suggest', Suggest);\n }\n\n window.VanduoSuggest = Suggest;\n\n})();\n", "/**\n * Vanduo Framework - Validate (Form Validation) Component\n * Declarative validation via data attributes with real-time and on-submit modes\n */\n\n(function () {\n 'use strict';\n\n const Validate = {\n instances: new Map(),\n\n rules: {\n required: (value) => value.trim().length > 0,\n email: (value) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),\n url: (value) => { try { new URL(value); return true; } catch (_e) { return false; } },\n number: (value) => !isNaN(parseFloat(value)) && isFinite(value),\n min: (value, param) => value.length >= parseInt(param, 10),\n max: (value, param) => value.length <= parseInt(param, 10),\n minVal: (value, param) => parseFloat(value) >= parseFloat(param),\n maxVal: (value, param) => parseFloat(value) <= parseFloat(param),\n pattern: (value, param) => {\n try {\n // Cap regex length to prevent ReDoS from excessively complex patterns\n if (param.length > 100) return false;\n return new RegExp(param).test(value);\n } catch (_e) { return false; }\n },\n match: (value, param) => {\n try {\n const escaped = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(param) : param;\n const other = document.querySelector('[name=\"' + escaped + '\"]');\n return other ? value === other.value : false;\n } catch (_e) {\n return false;\n }\n }\n },\n\n messages: {\n required: 'This field is required',\n email: 'Please enter a valid email address',\n url: 'Please enter a valid URL',\n number: 'Please enter a valid number',\n min: 'Minimum {0} characters required',\n max: 'Maximum {0} characters allowed',\n minVal: 'Value must be at least {0}',\n maxVal: 'Value must be at most {0}',\n pattern: 'Invalid format',\n match: 'Fields do not match'\n },\n\n init: function (root) {\n const forms = window.Vanduo.queryAll(root, '[data-vd-validate], .vd-validate');\n forms.forEach(form => {\n if (this.instances.has(form)) return;\n this.initInstance(form);\n });\n },\n\n initInstance: function (form) {\n const cleanup = [];\n const mode = form.getAttribute('data-vd-validate-mode') || 'blur'; // blur | input | submit\n const fields = form.querySelectorAll('[data-vd-rules]');\n\n const validateField = (field) => {\n const rulesStr = field.getAttribute('data-vd-rules') || '';\n const rules = rulesStr.split('|').map(r => r.trim()).filter(Boolean);\n const value = field.value;\n const errors = [];\n\n for (const rule of rules) {\n const [name, ...params] = rule.split(':');\n const param = params.join(':');\n const validator = this.rules[name];\n\n if (validator && !validator(value, param)) {\n const customMsg = field.getAttribute('data-vd-msg-' + name);\n let msg = customMsg || this.messages[name] || 'Invalid';\n if (param) msg = msg.replace('{0}', param);\n errors.push(msg);\n break; // one error at a time\n }\n }\n\n this.setFieldState(field, errors);\n return errors.length === 0;\n };\n\n const validateAll = () => {\n let valid = true;\n fields.forEach(field => {\n if (!validateField(field)) valid = false;\n });\n return valid;\n };\n\n // Per-field listeners\n fields.forEach(field => {\n if (mode === 'input' || mode === 'blur') {\n const eventType = mode === 'input' ? 'input' : 'blur';\n const handler = () => validateField(field);\n field.addEventListener(eventType, handler);\n cleanup.push(() => field.removeEventListener(eventType, handler));\n\n if (mode === 'blur') {\n const inputClear = () => {\n if (field.classList.contains('is-invalid') || field.classList.contains('is-valid')) {\n validateField(field);\n }\n };\n field.addEventListener('input', inputClear);\n cleanup.push(() => field.removeEventListener('input', inputClear));\n }\n }\n });\n\n // Form submit\n const submitHandler = (e) => {\n const valid = validateAll();\n if (!valid) {\n e.preventDefault();\n e.stopPropagation();\n // Focus first invalid field\n const firstInvalid = form.querySelector('.is-invalid');\n if (firstInvalid) firstInvalid.focus();\n }\n form.dispatchEvent(new CustomEvent('validate:submit', {\n detail: { valid },\n bubbles: true\n }));\n };\n\n form.addEventListener('submit', submitHandler);\n cleanup.push(() => form.removeEventListener('submit', submitHandler));\n\n this.instances.set(form, { cleanup, validateAll, validateField });\n },\n\n setFieldState: function (field, errors) {\n const wrapper = field.closest('.vd-form-group') || field.parentElement;\n let errorEl = wrapper.querySelector('.vd-validate-error');\n\n field.classList.remove('is-valid', 'is-invalid');\n\n if (errors.length > 0) {\n field.classList.add('is-invalid');\n field.setAttribute('aria-invalid', 'true');\n if (!errorEl) {\n errorEl = document.createElement('div');\n errorEl.className = 'vd-validate-error';\n errorEl.id = 'vd-err-' + Math.random().toString(36).slice(2, 9);\n errorEl.setAttribute('role', 'alert');\n wrapper.appendChild(errorEl);\n }\n errorEl.textContent = errors[0];\n errorEl.style.display = '';\n field.setAttribute('aria-describedby', errorEl.id);\n } else if (field.value.trim()) {\n field.classList.add('is-valid');\n field.removeAttribute('aria-invalid');\n if (errorEl) errorEl.style.display = 'none';\n } else {\n field.removeAttribute('aria-invalid');\n if (errorEl) errorEl.style.display = 'none';\n }\n },\n\n validateForm: function (form) {\n const instance = this.instances.get(form);\n return instance ? instance.validateAll() : false;\n },\n\n addRule: function (name, validator, message) {\n this.rules[name] = validator;\n if (message) this.messages[name] = message;\n },\n\n destroy: function (form) {\n const instance = this.instances.get(form);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(form);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, form) => this.destroy(form));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('validate', Validate);\n }\n\n window.VanduoValidate = Validate;\n\n})();\n", "/**\n * Vanduo Framework - Datepicker Component\n * Calendar popup attached to input field with month/year navigation\n */\n\n(function () {\n 'use strict';\n\n const DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n function escapeRegexChar(c) {\n return c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n function buildParseFormat(format) {\n let regex = '^';\n const order = [];\n let i = 0;\n while (i < format.length) {\n const slice = format.slice(i);\n if (slice.toLowerCase().startsWith('yyyy')) {\n regex += '(\\\\d{4})';\n order.push('y');\n i += 4;\n } else if (slice.toLowerCase().startsWith('mm')) {\n regex += '(\\\\d{2})';\n order.push('m');\n i += 2;\n } else if (slice.toLowerCase().startsWith('dd')) {\n regex += '(\\\\d{2})';\n order.push('d');\n i += 2;\n } else {\n regex += escapeRegexChar(format[i]);\n i++;\n }\n }\n regex += '$';\n return { regex: new RegExp(regex), order };\n }\n\n function parseDateFromFormat(value, format) {\n if (!value || !format) return null;\n const { regex, order } = buildParseFormat(format);\n const m = value.trim().match(regex);\n if (!m) return null;\n let y;\n let mo;\n let d;\n let ci = 1;\n for (let k = 0; k < order.length; k++) {\n const part = order[k];\n const v = parseInt(m[ci++], 10);\n if (Number.isNaN(v)) return null;\n if (part === 'y') y = v;\n else if (part === 'm') mo = v - 1;\n else if (part === 'd') d = v;\n }\n if (y === undefined || mo === undefined || d === undefined) return null;\n const dt = new Date(y, mo, d);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;\n return dt;\n }\n\n function formatDate(d, format) {\n const yyyy = String(d.getFullYear());\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n let out = '';\n let i = 0;\n while (i < format.length) {\n const slice = format.slice(i);\n if (slice.toLowerCase().startsWith('yyyy')) {\n out += yyyy;\n i += 4;\n } else if (slice.toLowerCase().startsWith('mm')) {\n out += mm;\n i += 2;\n } else if (slice.toLowerCase().startsWith('dd')) {\n out += dd;\n i += 2;\n } else {\n out += format[i];\n i++;\n }\n }\n return out;\n }\n\n function dateKey(d) {\n return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n }\n\n function addDays(d, n) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n x.setDate(x.getDate() + n);\n return x;\n }\n\n function addMonthsClamped(d, n) {\n return new Date(d.getFullYear(), d.getMonth() + n, d.getDate());\n }\n\n function parseYmdLocal(ymd) {\n if (!ymd || typeof ymd !== 'string') return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(ymd.trim());\n if (!m) return null;\n const y = +m[1];\n const mo = +m[2] - 1;\n const day = +m[3];\n const dt = new Date(y, mo, day);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== day) return null;\n return dt;\n }\n\n function startOfWeekSunday(d) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const day = x.getDay();\n x.setDate(x.getDate() - day);\n return x;\n }\n\n function endOfWeekSunday(d) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const day = x.getDay();\n x.setDate(x.getDate() + (6 - day));\n return x;\n }\n\n const Datepicker = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-datepicker]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const format = input.getAttribute('data-vd-datepicker-format') || 'YYYY-MM-DD';\n const minStr = input.getAttribute('data-vd-datepicker-min');\n const maxStr = input.getAttribute('data-vd-datepicker-max');\n const minDate = minStr ? parseYmdLocal(minStr) : null;\n const maxDate = maxStr ? parseYmdLocal(maxStr) : null;\n\n const today = new Date();\n let viewYear = today.getFullYear();\n let viewMonth = today.getMonth();\n let selectedDate = null;\n let viewMode = 'days'; // days | months | years\n let focusedDate = null;\n /** Prevents focus() after close from immediately re-opening the popup */\n let skipNextFocusOpen = false;\n\n const isDisabled = (d) => {\n if (minDate) {\n const t = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n if (t < minDate.getTime()) return true;\n }\n if (maxDate) {\n const t = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n if (t > maxDate.getTime()) return true;\n }\n return false;\n };\n\n const ensureMonthInRange = (y, m) => {\n if (!minDate && !maxDate) return { y: y, m: m };\n const first = new Date(y, m, 1);\n const last = new Date(y, m + 1, 0);\n if (minDate && last.getTime() < minDate.getTime()) {\n return { y: minDate.getFullYear(), m: minDate.getMonth() };\n }\n if (maxDate && first.getTime() > maxDate.getTime()) {\n return { y: maxDate.getFullYear(), m: maxDate.getMonth() };\n }\n return { y: y, m: m };\n };\n\n const firstSelectableInMonth = (y, m) => {\n const last = new Date(y, m + 1, 0).getDate();\n for (let day = 1; day <= last; day++) {\n const dt = new Date(y, m, day);\n if (!isDisabled(dt)) return dt;\n }\n return new Date(y, m, 1);\n };\n\n if (input.value) {\n const trimmed = input.value.trim();\n let parsed = parseDateFromFormat(trimmed, format);\n if (!parsed) {\n const fallback = new Date(trimmed);\n if (!isNaN(fallback.getTime())) parsed = fallback;\n }\n if (parsed) {\n selectedDate = parsed;\n viewYear = parsed.getFullYear();\n viewMonth = parsed.getMonth();\n }\n }\n\n const clampedInit = ensureMonthInRange(viewYear, viewMonth);\n viewYear = clampedInit.y;\n viewMonth = clampedInit.m;\n\n // Create popup\n const popup = document.createElement('div');\n popup.className = 'vd-datepicker-popup';\n popup.setAttribute('role', 'dialog');\n popup.setAttribute('aria-label', 'Choose date');\n popup.tabIndex = -1;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'vd-suggest-wrapper';\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n wrapper.appendChild(popup);\n\n const isSameDay = (a, b) => a && b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n const selectDate = (date) => {\n selectedDate = date;\n viewYear = date.getFullYear();\n viewMonth = date.getMonth();\n input.value = formatDate(date, format);\n skipNextFocusOpen = true;\n close();\n input.dispatchEvent(new CustomEvent('datepicker:select', {\n detail: { date: date, formatted: input.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.focus();\n };\n\n const focusFocusedDay = () => {\n if (viewMode !== 'days' || !focusedDate) return;\n const key = dateKey(focusedDate);\n const btn = popup.querySelector('[data-vd-date=\"' + key + '\"]');\n if (btn && !btn.classList.contains('is-outside') && btn.getAttribute('aria-disabled') !== 'true') {\n btn.focus();\n }\n };\n\n const skipDisabled = (d, stepDir, maxSteps) => {\n let x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const step = stepDir > 0 ? 1 : -1;\n for (let i = 0; i < maxSteps; i++) {\n if (!isDisabled(x)) return x;\n x = addDays(x, step);\n }\n return d;\n };\n\n const createDayBtn = (day, outside, date) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-day';\n btn.textContent = day;\n btn.setAttribute('role', 'gridcell');\n\n if (outside) {\n btn.classList.add('is-outside');\n btn.tabIndex = -1;\n btn.setAttribute('aria-disabled', 'true');\n return btn;\n }\n\n btn.setAttribute('data-vd-date', dateKey(date));\n\n if (date && isSameDay(date, today)) btn.classList.add('is-today');\n if (date && isSameDay(date, selectedDate)) btn.classList.add('is-selected');\n if (date && isDisabled(date)) {\n btn.classList.add('is-disabled');\n btn.setAttribute('aria-disabled', 'true');\n btn.tabIndex = -1;\n return btn;\n }\n\n if (date) {\n const isFocused = focusedDate && isSameDay(date, focusedDate);\n btn.tabIndex = isFocused ? 0 : -1;\n\n btn.addEventListener('click', () => {\n selectedDate = date;\n viewYear = date.getFullYear();\n viewMonth = date.getMonth();\n focusedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n input.value = formatDate(date, format);\n skipNextFocusOpen = true;\n close();\n input.dispatchEvent(new CustomEvent('datepicker:select', {\n detail: { date: date, formatted: input.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.focus();\n });\n }\n\n return btn;\n };\n\n const render = () => {\n popup.innerHTML = '';\n\n // Header\n const header = document.createElement('div');\n header.className = 'vd-datepicker-header';\n\n const prevBtn = document.createElement('button');\n prevBtn.type = 'button';\n prevBtn.className = 'vd-datepicker-prev';\n prevBtn.innerHTML = '&#8249;';\n prevBtn.setAttribute('aria-label', 'Previous');\n\n const nextBtn = document.createElement('button');\n nextBtn.type = 'button';\n nextBtn.className = 'vd-datepicker-next';\n nextBtn.innerHTML = '&#8250;';\n nextBtn.setAttribute('aria-label', 'Next');\n\n const title = document.createElement('span');\n title.className = 'vd-datepicker-title';\n\n if (viewMode === 'days') {\n title.textContent = MONTHS[viewMonth] + ' ' + viewYear;\n title.addEventListener('click', () => { viewMode = 'months'; render(); });\n prevBtn.addEventListener('click', () => { viewMonth--; if (viewMonth < 0) { viewMonth = 11; viewYear--; } render(); });\n nextBtn.addEventListener('click', () => { viewMonth++; if (viewMonth > 11) { viewMonth = 0; viewYear++; } render(); });\n } else if (viewMode === 'months') {\n title.textContent = String(viewYear);\n title.addEventListener('click', () => { viewMode = 'years'; render(); });\n prevBtn.addEventListener('click', () => { viewYear--; render(); });\n nextBtn.addEventListener('click', () => { viewYear++; render(); });\n } else {\n const decadeStart = Math.floor(viewYear / 10) * 10;\n title.textContent = decadeStart + ' - ' + (decadeStart + 9);\n prevBtn.addEventListener('click', () => { viewYear -= 10; render(); });\n nextBtn.addEventListener('click', () => { viewYear += 10; render(); });\n }\n\n header.appendChild(prevBtn);\n header.appendChild(title);\n header.appendChild(nextBtn);\n popup.appendChild(header);\n\n if (viewMode === 'days') {\n const gridWrap = document.createElement('div');\n gridWrap.className = 'vd-datepicker-grid';\n gridWrap.setAttribute('role', 'grid');\n gridWrap.setAttribute('aria-label', 'Calendar');\n\n const weekdays = document.createElement('div');\n weekdays.className = 'vd-datepicker-weekdays';\n weekdays.setAttribute('role', 'row');\n DAYS.forEach(function (d) {\n const span = document.createElement('span');\n span.setAttribute('role', 'columnheader');\n span.setAttribute('aria-label', d);\n span.textContent = d;\n weekdays.appendChild(span);\n });\n gridWrap.appendChild(weekdays);\n\n const firstDay = new Date(viewYear, viewMonth, 1).getDay();\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const daysInPrev = new Date(viewYear, viewMonth, 0).getDate();\n\n const cells = [];\n\n for (let i = firstDay - 1; i >= 0; i--) {\n const dayNum = daysInPrev - i;\n const prevMonth = viewMonth === 0 ? 11 : viewMonth - 1;\n const prevYear = viewMonth === 0 ? viewYear - 1 : viewYear;\n const date = new Date(prevYear, prevMonth, dayNum);\n cells.push({ day: dayNum, outside: true, date: date });\n }\n\n for (let d = 1; d <= daysInMonth; d++) {\n const date = new Date(viewYear, viewMonth, d);\n cells.push({ day: d, outside: false, date: date });\n }\n\n const totalCells = firstDay + daysInMonth;\n const remaining = totalCells % 7 === 0 ? 0 : 7 - (totalCells % 7);\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(viewYear, viewMonth + 1, i);\n cells.push({ day: i, outside: true, date: date });\n }\n\n for (let r = 0; r < cells.length; r += 7) {\n const row = document.createElement('div');\n row.className = 'vd-datepicker-row';\n row.setAttribute('role', 'row');\n for (let c = 0; c < 7; c++) {\n const cell = cells[r + c];\n row.appendChild(createDayBtn(cell.day, cell.outside, cell.date));\n }\n gridWrap.appendChild(row);\n }\n\n popup.appendChild(gridWrap);\n } else if (viewMode === 'months') {\n const grid = document.createElement('div');\n grid.className = 'vd-datepicker-months';\n MONTHS.forEach((name, i) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-month-btn';\n btn.textContent = name.slice(0, 3);\n if (selectedDate && selectedDate.getFullYear() === viewYear && selectedDate.getMonth() === i) {\n btn.classList.add('is-selected');\n }\n btn.addEventListener('click', () => { viewMonth = i; viewMode = 'days'; render(); });\n grid.appendChild(btn);\n });\n popup.appendChild(grid);\n } else {\n const grid = document.createElement('div');\n grid.className = 'vd-datepicker-years';\n const decadeStart = Math.floor(viewYear / 10) * 10;\n for (let y = decadeStart - 1; y <= decadeStart + 10; y++) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-year-btn';\n btn.textContent = y;\n if (selectedDate && selectedDate.getFullYear() === y) btn.classList.add('is-selected');\n if (y < decadeStart || y > decadeStart + 9) btn.style.opacity = '0.4';\n btn.addEventListener('click', () => { viewYear = y; viewMode = 'months'; render(); });\n grid.appendChild(btn);\n }\n popup.appendChild(grid);\n }\n };\n\n const handleGridKeydown = (e) => {\n if (!popup.classList.contains('is-open') || viewMode !== 'days') return;\n const grid = popup.querySelector('.vd-datepicker-grid');\n if (!grid || !grid.contains(e.target)) return;\n\n const key = e.key;\n if (key !== 'ArrowLeft' && key !== 'ArrowRight' && key !== 'ArrowUp' && key !== 'ArrowDown' &&\n key !== 'Home' && key !== 'End' && key !== 'PageUp' && key !== 'PageDown' &&\n key !== 'Enter' && key !== ' ' && key !== 'Escape') {\n return;\n }\n\n if (key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n skipNextFocusOpen = true;\n close();\n input.focus();\n return;\n }\n\n if (!focusedDate) {\n focusedDate = firstSelectableInMonth(viewYear, viewMonth);\n }\n\n if (key === 'Enter' || key === ' ') {\n e.preventDefault();\n if (focusedDate && !isDisabled(focusedDate)) {\n selectDate(new Date(focusedDate.getFullYear(), focusedDate.getMonth(), focusedDate.getDate()));\n }\n return;\n }\n\n e.preventDefault();\n\n let next = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), focusedDate.getDate());\n let skipDir = 1;\n\n if (key === 'ArrowLeft') {\n next = addDays(next, -1);\n skipDir = -1;\n } else if (key === 'ArrowRight') {\n next = addDays(next, 1);\n skipDir = 1;\n } else if (key === 'ArrowUp') {\n next = addDays(next, -7);\n skipDir = -1;\n } else if (key === 'ArrowDown') {\n next = addDays(next, 7);\n skipDir = 1;\n } else if (key === 'Home') {\n next = startOfWeekSunday(next);\n skipDir = 1;\n } else if (key === 'End') {\n next = endOfWeekSunday(next);\n skipDir = -1;\n } else if (key === 'PageUp') {\n next = addMonthsClamped(next, -1);\n skipDir = -1;\n } else if (key === 'PageDown') {\n next = addMonthsClamped(next, 1);\n skipDir = 1;\n }\n\n next = skipDisabled(next, skipDir, 400);\n\n if (next.getMonth() !== viewMonth || next.getFullYear() !== viewYear) {\n viewYear = next.getFullYear();\n viewMonth = next.getMonth();\n const cl = ensureMonthInRange(viewYear, viewMonth);\n viewYear = cl.y;\n viewMonth = cl.m;\n }\n\n focusedDate = next;\n render();\n requestAnimationFrame(focusFocusedDay);\n };\n\n const open = () => {\n viewMode = 'days';\n if (selectedDate) {\n viewYear = selectedDate.getFullYear();\n viewMonth = selectedDate.getMonth();\n }\n const cl = ensureMonthInRange(viewYear, viewMonth);\n viewYear = cl.y;\n viewMonth = cl.m;\n\n if (selectedDate) {\n focusedDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\n } else {\n focusedDate = firstSelectableInMonth(viewYear, viewMonth);\n }\n\n render();\n popup.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n requestAnimationFrame(focusFocusedDay);\n };\n\n const close = () => {\n popup.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n viewMode = 'days';\n };\n\n const focusHandler = () => {\n if (skipNextFocusOpen) {\n skipNextFocusOpen = false;\n return;\n }\n open();\n };\n const outsideHandler = (e) => {\n if (!wrapper.contains(e.target)) close();\n };\n const escHandler = (e) => {\n if (e.key === 'Escape' && popup.classList.contains('is-open')) {\n skipNextFocusOpen = true;\n close();\n input.focus();\n }\n };\n\n input.addEventListener('focus', focusHandler);\n document.addEventListener('click', outsideHandler, true);\n document.addEventListener('keydown', escHandler);\n popup.addEventListener('keydown', handleGridKeydown);\n\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('autocomplete', 'off');\n\n cleanup.push(\n () => input.removeEventListener('focus', focusHandler),\n () => document.removeEventListener('click', outsideHandler, true),\n () => document.removeEventListener('keydown', escHandler),\n () => popup.removeEventListener('keydown', handleGridKeydown)\n );\n\n this.instances.set(input, { cleanup: cleanup, open: open, close: close, popup: popup });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('datepicker', Datepicker);\n }\n\n window.VanduoDatepicker = Datepicker;\n\n})();\n", "/**\n * Vanduo Framework - Timepicker Component\n * Dropdown time selection with 12h/24h format and configurable step intervals\n */\n\n(function () {\n 'use strict';\n\n const Timepicker = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-timepicker]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const is24h = input.getAttribute('data-vd-timepicker-format') === '24h';\n const step = parseInt(input.getAttribute('data-vd-timepicker-step') || '30', 10);\n\n // Create wrapper\n let wrapper = input.closest('.vd-suggest-wrapper');\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n }\n\n // Create popup\n const popup = document.createElement('div');\n popup.className = 'vd-timepicker-popup';\n popup.setAttribute('role', 'listbox');\n wrapper.appendChild(popup);\n\n // Generate time slots\n const times = [];\n for (let h = 0; h < 24; h++) {\n for (let m = 0; m < 60; m += step) {\n const hh24 = String(h).padStart(2, '0');\n const mm = String(m).padStart(2, '0');\n\n if (is24h) {\n times.push({ display: hh24 + ':' + mm, value: hh24 + ':' + mm });\n } else {\n const period = h < 12 ? 'AM' : 'PM';\n const h12 = h === 0 ? 12 : (h > 12 ? h - 12 : h);\n const display = h12 + ':' + mm + ' ' + period;\n times.push({ display, value: hh24 + ':' + mm });\n }\n }\n }\n\n const render = () => {\n popup.innerHTML = '';\n times.forEach(t => {\n const item = document.createElement('div');\n item.className = 'vd-timepicker-item';\n item.setAttribute('role', 'option');\n item.textContent = t.display;\n\n if (input.value === t.value || input.value === t.display) {\n item.classList.add('is-selected');\n }\n\n item.addEventListener('click', () => {\n input.value = t.display;\n popup.querySelectorAll('.vd-timepicker-item').forEach(i => i.classList.remove('is-selected'));\n item.classList.add('is-selected');\n close();\n input.dispatchEvent(new CustomEvent('timepicker:select', {\n detail: { display: t.display, value: t.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n });\n\n popup.appendChild(item);\n });\n };\n\n const open = () => {\n render();\n popup.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n // Scroll to selected\n const selected = popup.querySelector('.is-selected');\n if (selected) selected.scrollIntoView({ block: 'center' });\n };\n\n const close = () => {\n popup.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n };\n\n const focusHandler = () => open();\n const outsideHandler = (e) => {\n if (!wrapper.contains(e.target)) close();\n };\n const escHandler = (e) => { if (e.key === 'Escape') close(); };\n\n input.addEventListener('focus', focusHandler);\n document.addEventListener('click', outsideHandler, true);\n document.addEventListener('keydown', escHandler);\n input.setAttribute('aria-haspopup', 'listbox');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('autocomplete', 'off');\n input.readOnly = true;\n\n cleanup.push(\n () => input.removeEventListener('focus', focusHandler),\n () => document.removeEventListener('click', outsideHandler, true),\n () => document.removeEventListener('keydown', escHandler)\n );\n\n this.instances.set(input, { cleanup, open, close });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('timepicker', Timepicker);\n }\n\n window.VanduoTimepicker = Timepicker;\n\n})();\n", "/**\n * Vanduo Framework - Stepper Component\n * Multi-step progress indicator with state management\n */\n\n(function () {\n 'use strict';\n\n const Stepper = {\n instances: new Map(),\n\n init: function (root) {\n const steppers = window.Vanduo.queryAll(root, '.vd-stepper');\n steppers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const items = Array.from(el.querySelectorAll('.vd-stepper-item'));\n const isClickable = el.classList.contains('vd-stepper-clickable');\n let currentIndex = items.findIndex(i => i.classList.contains('is-active'));\n if (currentIndex === -1) currentIndex = 0;\n\n const setStep = (index) => {\n if (index < 0 || index >= items.length) return;\n const prev = currentIndex;\n currentIndex = index;\n\n items.forEach((item, i) => {\n item.classList.remove('is-active', 'is-completed');\n if (i < index) item.classList.add('is-completed');\n else if (i === index) item.classList.add('is-active');\n });\n\n el.dispatchEvent(new CustomEvent('stepper:change', {\n detail: { current: index, previous: prev, total: items.length },\n bubbles: true\n }));\n };\n\n if (isClickable) {\n items.forEach((item, i) => {\n const handler = () => setStep(i);\n item.addEventListener('click', handler);\n cleanup.push(() => item.removeEventListener('click', handler));\n });\n }\n\n // Initialize current state\n setStep(currentIndex);\n\n this.instances.set(el, {\n cleanup,\n setStep,\n next: () => setStep(currentIndex + 1),\n prev: () => setStep(currentIndex - 1),\n getCurrent: () => currentIndex\n });\n },\n\n setStep: function (el, index) {\n const inst = this.instances.get(el);\n if (inst) inst.setStep(index);\n },\n\n next: function (el) {\n const inst = this.instances.get(el);\n if (inst) inst.next();\n },\n\n prev: function (el) {\n const inst = this.instances.get(el);\n if (inst) inst.prev();\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('stepper', Stepper);\n }\n\n window.VanduoStepper = Stepper;\n\n})();\n", "/**\n * Vanduo Framework - Rating Component\n * Star-based rating input with hover preview and read-only mode\n */\n\n(function () {\n 'use strict';\n\n const Rating = {\n instances: new Map(),\n\n init: function (root) {\n const ratings = window.Vanduo.queryAll(root, '[data-vd-rating]');\n ratings.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const max = parseInt(el.getAttribute('data-vd-rating-max') || '5', 10);\n const initialValue = parseFloat(el.getAttribute('data-vd-rating-value') || '0');\n const readonly = el.classList.contains('vd-rating-readonly') || el.hasAttribute('data-vd-rating-readonly');\n let currentValue = initialValue;\n\n el.classList.add('vd-rating');\n el.setAttribute('role', 'radiogroup');\n el.setAttribute('aria-label', el.getAttribute('aria-label') || 'Rating');\n\n // Clear existing stars\n el.innerHTML = '';\n\n // Create stars\n const stars = [];\n for (let i = 1; i <= max; i++) {\n const star = document.createElement('button');\n star.type = 'button';\n star.className = 'vd-rating-star';\n star.setAttribute('role', 'radio');\n star.setAttribute('aria-label', i + ' star' + (i > 1 ? 's' : ''));\n star.setAttribute('aria-checked', i <= currentValue ? 'true' : 'false');\n if (readonly) star.tabIndex = -1;\n stars.push(star);\n el.appendChild(star);\n }\n\n // Value display\n const valueDisplay = document.createElement('span');\n valueDisplay.className = 'vd-rating-value';\n valueDisplay.textContent = currentValue > 0 ? currentValue.toString() : '';\n el.appendChild(valueDisplay);\n\n const updateStars = (value) => {\n stars.forEach((star, i) => {\n star.classList.remove('is-active', 'is-half');\n const starNum = i + 1;\n if (starNum <= Math.floor(value)) {\n star.classList.add('is-active');\n } else if (starNum - 0.5 <= value) {\n star.classList.add('is-half');\n }\n star.setAttribute('aria-checked', starNum <= value ? 'true' : 'false');\n });\n valueDisplay.textContent = value > 0 ? value.toString() : '';\n };\n\n updateStars(currentValue);\n\n if (!readonly) {\n stars.forEach((star, i) => {\n const enterHandler = () => {\n stars.forEach((s, j) => {\n s.classList.toggle('is-hovered', j <= i);\n });\n };\n const leaveHandler = () => {\n stars.forEach(s => s.classList.remove('is-hovered'));\n };\n const clickHandler = () => {\n currentValue = i + 1;\n el.setAttribute('data-vd-rating-value', currentValue);\n updateStars(currentValue);\n el.dispatchEvent(new CustomEvent('rating:change', {\n detail: { value: currentValue, max },\n bubbles: true\n }));\n };\n\n star.addEventListener('mouseenter', enterHandler);\n star.addEventListener('mouseleave', leaveHandler);\n star.addEventListener('click', clickHandler);\n\n cleanup.push(\n () => star.removeEventListener('mouseenter', enterHandler),\n () => star.removeEventListener('mouseleave', leaveHandler),\n () => star.removeEventListener('click', clickHandler)\n );\n });\n\n // Keyboard\n const keyHandler = (e) => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n if (currentValue < max) {\n currentValue++;\n updateStars(currentValue);\n stars[currentValue - 1].focus();\n el.dispatchEvent(new CustomEvent('rating:change', { detail: { value: currentValue, max }, bubbles: true }));\n }\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n if (currentValue > 1) {\n currentValue--;\n updateStars(currentValue);\n stars[currentValue - 1].focus();\n el.dispatchEvent(new CustomEvent('rating:change', { detail: { value: currentValue, max }, bubbles: true }));\n }\n }\n };\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n }\n\n this.instances.set(el, {\n cleanup,\n getValue: () => currentValue,\n setValue: (v) => { currentValue = v; updateStars(v); }\n });\n },\n\n getValue: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getValue() : 0;\n },\n\n setValue: function (el, value) {\n const inst = this.instances.get(el);\n if (inst) inst.setValue(value);\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('rating', Rating);\n }\n\n window.VanduoRating = Rating;\n\n})();\n", "/**\n * Vanduo Framework - Transfer (Dual-list) Component\n * Source-to-target list transfer with search, select-all, and move actions\n */\n\n(function () {\n 'use strict';\n\n const Transfer = {\n instances: new Map(),\n\n init: function (root) {\n const transfers = window.Vanduo.queryAll(root, '[data-vd-transfer]');\n transfers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n el.classList.add('vd-transfer');\n\n let sourceData, targetData;\n try {\n const raw = JSON.parse(el.getAttribute('data-vd-transfer') || '[]');\n sourceData = raw.map((item, i) => ({\n id: item.id || 'item-' + i,\n label: item.label || item.text || String(item),\n selected: false\n }));\n } catch (_e) {\n sourceData = [];\n }\n targetData = [];\n\n const sourceSelected = new Set();\n const targetSelected = new Set();\n\n const render = () => {\n el.innerHTML = '';\n\n // Source panel\n const sourcePanel = createPanel('Source', sourceData, sourceSelected, 'source');\n // Actions\n const actions = document.createElement('div');\n actions.className = 'vd-transfer-actions';\n\n const moveRightBtn = document.createElement('button');\n moveRightBtn.type = 'button';\n moveRightBtn.className = 'vd-transfer-btn';\n moveRightBtn.innerHTML = '&#8250;';\n moveRightBtn.setAttribute('aria-label', 'Move to target');\n moveRightBtn.disabled = sourceSelected.size === 0;\n moveRightBtn.addEventListener('click', () => moveRight());\n\n const moveLeftBtn = document.createElement('button');\n moveLeftBtn.type = 'button';\n moveLeftBtn.className = 'vd-transfer-btn';\n moveLeftBtn.innerHTML = '&#8249;';\n moveLeftBtn.setAttribute('aria-label', 'Move to source');\n moveLeftBtn.disabled = targetSelected.size === 0;\n moveLeftBtn.addEventListener('click', () => moveLeft());\n\n actions.appendChild(moveRightBtn);\n actions.appendChild(moveLeftBtn);\n\n // Target panel\n const targetPanel = createPanel('Target', targetData, targetSelected, 'target');\n\n el.appendChild(sourcePanel);\n el.appendChild(actions);\n el.appendChild(targetPanel);\n };\n\n const createPanel = (title, data, selected, _side) => {\n const panel = document.createElement('div');\n panel.className = 'vd-transfer-panel';\n\n const header = document.createElement('div');\n header.className = 'vd-transfer-header';\n const titleSpan = document.createElement('span');\n titleSpan.textContent = title;\n const count = document.createElement('span');\n count.className = 'vd-transfer-count';\n count.textContent = selected.size + '/' + data.length;\n header.appendChild(titleSpan);\n header.appendChild(count);\n panel.appendChild(header);\n\n // Search\n const searchDiv = document.createElement('div');\n searchDiv.className = 'vd-transfer-search';\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.placeholder = 'Search...';\n searchInput.setAttribute('aria-label', 'Search ' + title.toLowerCase());\n searchDiv.appendChild(searchInput);\n panel.appendChild(searchDiv);\n\n // List\n const list = document.createElement('ul');\n list.className = 'vd-transfer-list';\n list.setAttribute('role', 'listbox');\n\n const renderList = (filter) => {\n list.innerHTML = '';\n const filtered = filter ? data.filter(d => {\n const label = (d.label || d.text || String(d)).toLowerCase();\n return label.includes(filter.toLowerCase());\n }) : data;\n filtered.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vd-transfer-item';\n li.setAttribute('role', 'option');\n if (selected.has(item.id)) li.classList.add('is-selected');\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = selected.has(item.id);\n checkbox.setAttribute('aria-label', item.label);\n\n const label = document.createElement('span');\n label.textContent = item.label;\n\n li.addEventListener('click', () => {\n if (selected.has(item.id)) selected.delete(item.id);\n else selected.add(item.id);\n render();\n });\n\n li.appendChild(checkbox);\n li.appendChild(label);\n list.appendChild(li);\n });\n };\n\n searchInput.addEventListener('input', () => renderList(searchInput.value));\n renderList('');\n\n panel.appendChild(list);\n return panel;\n };\n\n const moveRight = () => {\n const toMove = sourceData.filter(d => sourceSelected.has(d.id));\n sourceData = sourceData.filter(d => !sourceSelected.has(d.id));\n targetData = targetData.concat(toMove);\n sourceSelected.clear();\n render();\n fireChange();\n };\n\n const moveLeft = () => {\n const toMove = targetData.filter(d => targetSelected.has(d.id));\n targetData = targetData.filter(d => !targetSelected.has(d.id));\n sourceData = sourceData.concat(toMove);\n targetSelected.clear();\n render();\n fireChange();\n };\n\n const fireChange = () => {\n el.dispatchEvent(new CustomEvent('transfer:change', {\n detail: {\n source: sourceData.map(d => d.id),\n target: targetData.map(d => d.id)\n },\n bubbles: true\n }));\n };\n\n render();\n\n this.instances.set(el, {\n cleanup,\n getTarget: () => targetData.map(d => d.id),\n getSource: () => sourceData.map(d => d.id)\n });\n },\n\n getSelected: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getTarget() : [];\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n el.innerHTML = '';\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('transfer', Transfer);\n }\n\n window.VanduoTransfer = Transfer;\n\n})();\n", "/**\n * Vanduo Framework - Tree View Component\n * Hierarchical collapsible tree with checkbox selection and keyboard navigation\n */\n\n(function () {\n 'use strict';\n\n const Tree = {\n instances: new Map(),\n\n init: function (root) {\n const trees = window.Vanduo.queryAll(root, '[data-vd-tree]');\n trees.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const cascade = el.getAttribute('data-vd-tree-cascade') !== 'false';\n\n let data;\n try { data = JSON.parse(el.getAttribute('data-vd-tree') || '[]'); } catch (_e) { data = []; }\n\n el.classList.add('vd-tree');\n el.setAttribute('role', 'tree');\n\n const render = (items, parent) => {\n parent.innerHTML = '';\n items.forEach(item => {\n const node = document.createElement('li');\n node.className = 'vd-tree-node';\n node.setAttribute('role', 'treeitem');\n node.setAttribute('aria-expanded', item.open ? 'true' : 'false');\n if (item.open) node.classList.add('is-open');\n\n const content = document.createElement('div');\n content.className = 'vd-tree-node-content';\n\n // Toggle\n if (item.children && item.children.length > 0) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'vd-tree-toggle';\n toggle.setAttribute('aria-label', 'Toggle');\n toggle.addEventListener('click', (e) => {\n e.stopPropagation();\n item.open = !item.open;\n node.classList.toggle('is-open');\n node.setAttribute('aria-expanded', item.open ? 'true' : 'false');\n });\n content.appendChild(toggle);\n } else {\n const ph = document.createElement('span');\n ph.className = 'vd-tree-toggle-placeholder';\n content.appendChild(ph);\n }\n\n // Checkbox\n if (el.hasAttribute('data-vd-tree-checkbox')) {\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.className = 'vd-tree-checkbox';\n cb.checked = !!item.checked;\n cb.setAttribute('aria-label', item.label);\n cb.addEventListener('change', (e) => {\n e.stopPropagation();\n item.checked = cb.checked;\n if (cascade && item.children) {\n setChildChecked(item.children, cb.checked);\n render(data, el);\n }\n el.dispatchEvent(new CustomEvent('tree:check', {\n detail: { id: item.id, checked: cb.checked, label: item.label },\n bubbles: true\n }));\n });\n content.appendChild(cb);\n }\n\n // Icon\n if (item.icon) {\n const icon = document.createElement('span');\n icon.className = 'vd-tree-icon ' + item.icon;\n content.appendChild(icon);\n }\n\n // Label\n const label = document.createElement('span');\n label.className = 'vd-tree-label';\n label.textContent = item.label || '';\n content.appendChild(label);\n\n node.appendChild(content);\n\n // Children\n if (item.children && item.children.length > 0) {\n const childList = document.createElement('ul');\n childList.className = 'vd-tree-children';\n childList.setAttribute('role', 'group');\n render(item.children, childList);\n node.appendChild(childList);\n }\n\n parent.appendChild(node);\n });\n };\n\n const setChildChecked = (items, checked) => {\n items.forEach(item => {\n item.checked = checked;\n if (item.children) setChildChecked(item.children, checked);\n });\n };\n\n // Keyboard\n const keyHandler = (e) => {\n const focused = document.activeElement;\n if (!el.contains(focused)) return;\n\n const nodes = Array.from(el.querySelectorAll('.vd-tree-node-content'));\n const idx = nodes.indexOf(focused.closest('.vd-tree-node-content'));\n if (idx === -1) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (idx < nodes.length - 1) {\n const next = nodes[idx + 1].querySelector('.vd-tree-toggle, .vd-tree-label');\n if (next) next.focus();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (idx > 0) {\n const prev = nodes[idx - 1].querySelector('.vd-tree-toggle, .vd-tree-label');\n if (prev) prev.focus();\n }\n break;\n }\n };\n\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n\n render(data, el);\n\n this.instances.set(el, {\n cleanup,\n getData: () => data,\n getChecked: () => {\n const checked = [];\n const collect = (items) => {\n items.forEach(i => {\n if (i.checked) checked.push(i.id || i.label);\n if (i.children) collect(i.children);\n });\n };\n collect(data);\n return checked;\n }\n });\n },\n\n getChecked: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getChecked() : [];\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n el.innerHTML = '';\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tree', Tree);\n }\n\n window.VanduoTree = Tree;\n\n})();\n", "/**\n * Vanduo Framework - Spotlight (Feature Discovery) Component\n * Guided tour with overlay highlight and step-through tooltip\n */\n\n(function () {\n 'use strict';\n\n const Spotlight = {\n _active: false,\n _steps: [],\n _currentStep: 0,\n _elements: {},\n _cleanup: [],\n _boundTriggers: new WeakMap(),\n _triggerElement: null,\n\n init: function (root) {\n const triggers = window.Vanduo.queryAll(root, '[data-vd-spotlight]');\n\n triggers.forEach(trigger => {\n if (this._boundTriggers.has(trigger)) return;\n\n const clickHandler = (event) => {\n event.preventDefault();\n\n const steps = this._parseSteps(trigger.getAttribute('data-vd-spotlight'));\n if (steps.length === 0) return;\n\n this.start(steps, { trigger });\n };\n\n trigger.addEventListener('click', clickHandler);\n this._boundTriggers.set(trigger, clickHandler);\n });\n },\n\n _parseSteps: function (raw) {\n if (typeof raw !== 'string' || raw.trim() === '') return [];\n\n try {\n const parsed = JSON.parse(raw);\n return this._normalizeSteps(parsed);\n } catch (error) {\n console.error('VanduoSpotlight: invalid data-vd-spotlight payload.', error);\n return [];\n }\n },\n\n _normalizeStep: function (step) {\n if (!step || typeof step !== 'object') return null;\n\n const target = step.target;\n const hasSelectorTarget = typeof target === 'string' && target.trim() !== '';\n const hasElementTarget = typeof Element !== 'undefined' && target instanceof Element;\n\n if (!hasSelectorTarget && !hasElementTarget) return null;\n\n const title = typeof step.title === 'string' ? step.title : '';\n const description = typeof step.description === 'string'\n ? step.description\n : (typeof step.content === 'string' ? step.content : '');\n\n return {\n target,\n title,\n description\n };\n },\n\n _normalizeSteps: function (steps) {\n if (!Array.isArray(steps)) return [];\n\n return steps\n .map(step => this._normalizeStep(step))\n .filter(Boolean);\n },\n\n start: function (steps, options) {\n if (this._active) this.stop();\n\n const normalizedSteps = this._normalizeSteps(steps);\n if (normalizedSteps.length === 0) return;\n\n const startOptions = options || {};\n\n this._steps = normalizedSteps;\n this._currentStep = 0;\n this._active = true;\n this._triggerElement = startOptions.trigger || (document.activeElement instanceof HTMLElement ? document.activeElement : null);\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.className = 'vd-spotlight-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n document.body.appendChild(overlay);\n\n // Create tooltip\n const tooltip = document.createElement('div');\n tooltip.className = 'vd-spotlight-tooltip';\n tooltip.setAttribute('role', 'dialog');\n tooltip.setAttribute('aria-modal', 'true');\n tooltip.tabIndex = -1;\n document.body.appendChild(tooltip);\n\n this._elements = { overlay, tooltip };\n\n // ESC to close\n const escHandler = (e) => { if (e.key === 'Escape') this.stop(); };\n document.addEventListener('keydown', escHandler);\n this._cleanup.push(() => document.removeEventListener('keydown', escHandler));\n\n // Overlay click to close\n overlay.addEventListener('click', () => this.stop());\n\n this._showStep(this._currentStep);\n },\n\n _showStep: function (index) {\n const step = this._steps[index];\n if (!step) return;\n\n const target = typeof step.target === 'string' ? document.querySelector(step.target) : step.target;\n const { tooltip } = this._elements;\n\n // Remove previous highlight\n document.querySelectorAll('.vd-spotlight-target').forEach(el => {\n el.classList.remove('vd-spotlight-target');\n });\n\n // Highlight target\n if (target) {\n target.classList.add('vd-spotlight-target');\n target.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n\n // Build tooltip content\n const total = this._steps.length;\n tooltip.innerHTML = '';\n tooltip.removeAttribute('aria-labelledby');\n tooltip.removeAttribute('aria-describedby');\n\n if (step.title) {\n const title = document.createElement('h4');\n title.className = 'vd-spotlight-title';\n title.id = 'vd-spotlight-title-' + index + '-' + Date.now();\n title.textContent = step.title;\n tooltip.appendChild(title);\n tooltip.setAttribute('aria-labelledby', title.id);\n }\n\n if (step.description) {\n const desc = document.createElement('p');\n desc.className = 'vd-spotlight-description';\n desc.id = 'vd-spotlight-description-' + index + '-' + Date.now();\n desc.textContent = step.description;\n tooltip.appendChild(desc);\n tooltip.setAttribute('aria-describedby', desc.id);\n }\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'vd-spotlight-footer';\n footer.setAttribute('aria-label', 'Step ' + (index + 1) + ' of ' + total);\n\n const counter = document.createElement('span');\n counter.className = 'vd-spotlight-counter';\n counter.textContent = (index + 1) + ' / ' + total;\n\n const actions = document.createElement('div');\n actions.className = 'vd-spotlight-actions';\n\n if (index > 0) {\n const prevBtn = document.createElement('button');\n prevBtn.type = 'button';\n prevBtn.className = 'vd-spotlight-btn';\n prevBtn.textContent = 'Back';\n prevBtn.addEventListener('click', () => this.prev());\n actions.appendChild(prevBtn);\n }\n\n const skipBtn = document.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'vd-spotlight-btn';\n skipBtn.textContent = 'Skip';\n skipBtn.addEventListener('click', () => this.stop());\n actions.appendChild(skipBtn);\n\n if (index < total - 1) {\n const nextBtn = document.createElement('button');\n nextBtn.type = 'button';\n nextBtn.className = 'vd-spotlight-btn vd-spotlight-btn-primary';\n nextBtn.textContent = 'Next';\n nextBtn.addEventListener('click', () => this.next());\n actions.appendChild(nextBtn);\n } else {\n const doneBtn = document.createElement('button');\n doneBtn.type = 'button';\n doneBtn.className = 'vd-spotlight-btn vd-spotlight-btn-primary';\n doneBtn.textContent = 'Done';\n doneBtn.addEventListener('click', () => this.stop());\n actions.appendChild(doneBtn);\n }\n\n footer.appendChild(counter);\n footer.appendChild(actions);\n tooltip.appendChild(footer);\n\n // Position tooltip near target\n if (target) {\n requestAnimationFrame(() => {\n const rect = target.getBoundingClientRect();\n const tRect = tooltip.getBoundingClientRect();\n let top = rect.bottom + 12 + window.scrollY;\n let left = rect.left + (rect.width - tRect.width) / 2 + window.scrollX;\n\n // Keep in viewport\n left = Math.max(8, Math.min(left, window.innerWidth - tRect.width - 8));\n if (top + tRect.height > window.innerHeight + window.scrollY) {\n top = rect.top - tRect.height - 12 + window.scrollY;\n }\n\n tooltip.style.top = top + 'px';\n tooltip.style.left = left + 'px';\n });\n }\n\n document.dispatchEvent(new CustomEvent('spotlight:step', {\n detail: { index, step: index, total, data: step }\n }));\n },\n\n next: function () {\n if (this._currentStep < this._steps.length - 1) {\n this._currentStep++;\n this._showStep(this._currentStep);\n }\n },\n\n prev: function () {\n if (this._currentStep > 0) {\n this._currentStep--;\n this._showStep(this._currentStep);\n }\n },\n\n stop: function () {\n if (!this._active) return;\n\n const total = this._steps.length;\n const detail = {\n completedSteps: total === 0 ? 0 : Math.min(this._currentStep + 1, total),\n total,\n completed: total > 0 && this._currentStep >= total - 1\n };\n\n this._active = false;\n\n document.querySelectorAll('.vd-spotlight-target').forEach(el => {\n el.classList.remove('vd-spotlight-target');\n });\n\n if (this._elements.overlay && this._elements.overlay.parentNode) {\n this._elements.overlay.parentNode.removeChild(this._elements.overlay);\n }\n if (this._elements.tooltip && this._elements.tooltip.parentNode) {\n this._elements.tooltip.parentNode.removeChild(this._elements.tooltip);\n }\n\n this._cleanup.forEach(fn => fn());\n this._cleanup = [];\n this._elements = {};\n this._steps = [];\n this._currentStep = 0;\n\n if (this._triggerElement && this._triggerElement.isConnected && typeof this._triggerElement.focus === 'function') {\n this._triggerElement.focus();\n }\n this._triggerElement = null;\n\n document.dispatchEvent(new CustomEvent('spotlight:end', { detail }));\n },\n\n destroyAll: function () {\n this.stop();\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('spotlight', Spotlight);\n }\n\n window.VanduoSpotlight = Spotlight;\n\n})();\n", "/**\n * Vanduo Framework - Music Player Component\n * HTML5 Audio-based music player with transport controls, volume,\n * and optional shuffle, seek bar, and playlist features.\n *\n * Options (passed to MusicPlayer.init or data-music-player-options):\n * tracks {Array} - [{name, url}] \u2014 required\n * volume {number} - Initial volume 0\u20131 (default 0.5)\n * shuffle {boolean} - Shuffle on init (default false)\n * showProgress {boolean} - Show seek/progress bar (default false)\n * showPlaylist {boolean} - Show expandable playlist panel (default false)\n * autoAdvance {boolean} - Auto-play next track on end (default true)\n * glass {boolean} - Frosted-glass surface styling (default false)\n * detachable {boolean} - Show detach/attach; float above page when detached (default false)\n * floatingPosition {string|null} - After detach: 'bottom-left' or 'bottom-right' (default null = bottom-right)\n * draggable {boolean} - When detached+detachable, drag by handle (default false)\n * minimizable {boolean} - Minimize/expand control (default false)\n * startMinimized {boolean} - On first detach, start minimized (default false)\n * persistPosition {boolean} - Save floating x/y in localStorage (default false)\n * persistKey {string} - Storage key for persist (default from element id)\n *\n * Custom events (all bubble, dispatched on container):\n * musicplayer:play \u2014 playback started\n * musicplayer:pause \u2014 playback paused\n * musicplayer:trackchange \u2014 detail: { index, name, url }\n * musicplayer:volumechange \u2014 detail: { volume }\n * musicplayer:ended \u2014 last track ended (autoAdvance=false only)\n * musicplayer:detach \u2014 after floating player is created\n * musicplayer:attach \u2014 after returned to document flow\n * musicplayer:minimize \u2014 collapsed to minimal controls\n * musicplayer:expand \u2014 full controls visible again\n *\n * Programmatic API:\n * MusicPlayer.init(container?, options?)\n * MusicPlayer.play(container)\n * MusicPlayer.pause(container)\n * MusicPlayer.toggle(container)\n * MusicPlayer.next(container)\n * MusicPlayer.previous(container)\n * MusicPlayer.setVolume(container, value)\n * MusicPlayer.setTrack(container, index)\n * MusicPlayer.shuffle(container)\n * MusicPlayer.detach(container, position?)\n * MusicPlayer.attach(container)\n * MusicPlayer.minimize(container)\n * MusicPlayer.expand(container)\n * MusicPlayer.toggleMinimize(container)\n * MusicPlayer.setPosition(container, 'bottom-left'|'bottom-right'|{x,y})\n * MusicPlayer.getState(container)\n * MusicPlayer.destroy(container)\n * MusicPlayer.destroyAll()\n */\n\n(function () {\n 'use strict';\n\n /* \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Fisher-Yates shuffle (returns new array).\n * @param {Array} arr\n * @returns {Array}\n */\n function shuffleArray(arr) {\n const shuffled = arr.slice();\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = tmp;\n }\n return shuffled;\n }\n\n /**\n * Format seconds as m:ss.\n * @param {number} seconds\n * @returns {string}\n */\n function formatTime(seconds) {\n if (!isFinite(seconds) || seconds < 0) return '0:00';\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return m + ':' + (s < 10 ? '0' : '') + s;\n }\n\n /**\n * Set CSS background-size on a range input to visually fill the track.\n * @param {HTMLInputElement} input\n */\n /**\n * @param {string|undefined} id\n * @returns {string}\n */\n function persistStorageKey(id) {\n return 'vanduo:music-player:' + (id && id.trim() ? id.trim() : 'default') + ':pos';\n }\n\n function updateRangeFill(input) {\n const min = parseFloat(input.min) || 0;\n const max = parseFloat(input.max) || 1;\n const val = parseFloat(input.value) || 0;\n const pct = ((val - min) / (max - min)) * 100;\n input.style.setProperty('--vd-fill', pct + '%');\n // Fallback inline gradient for browsers without ::-moz-range-progress\n input.style.backgroundImage =\n 'linear-gradient(to right, var(--vd-music-player-track-fill, currentColor) 0%, ' +\n 'var(--vd-music-player-track-fill, currentColor) ' + pct + '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) ' + pct + '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) 100%)';\n }\n\n /* \u2500\u2500\u2500 Phosphor icon helper (matches framework icon style) \u2500 */\n\n /**\n * Return an <i class=\"ph ph-{name}\"> element (Phosphor icon).\n * @param {string} name\n * @returns {HTMLElement}\n */\n function icon(name) {\n const el = document.createElement('i');\n el.className = 'ph ph-' + name;\n el.setAttribute('aria-hidden', 'true');\n return el;\n }\n\n /* \u2500\u2500\u2500 Component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const MusicPlayer = {\n /** @type {Map<HTMLElement, Object>} */\n instances: new Map(),\n\n /**\n * Default options.\n */\n defaults: {\n tracks: [],\n volume: 0.5,\n shuffle: false,\n showProgress: false,\n showPlaylist: false,\n autoAdvance: true,\n glass: false,\n detachable: false,\n /** @type {null|string} */\n floatingPosition: null,\n draggable: false,\n minimizable: false,\n startMinimized: false,\n persistPosition: false,\n persistKey: '',\n },\n\n /**\n * Auto-initialize all .vd-music-player / [data-music-player] elements.\n * Options can be provided via data-music-player-options (JSON string).\n */\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-music-player, [data-music-player]').forEach((el) => {\n if (this.instances.has(el)) return;\n\n let opts = {};\n const attr = el.getAttribute('data-music-player-options');\n if (attr) {\n try { opts = JSON.parse(attr); } catch (_) { /* ignore malformed JSON */ }\n }\n this.initPlayer(el, opts);\n });\n },\n\n /**\n * Initialize a single player element.\n * @param {HTMLElement} container\n * @param {Object} [options]\n */\n initPlayer: function (container, options) {\n const opts = Object.assign({}, this.defaults, options || {});\n\n // Validate and normalise tracks\n const rawTracks = Array.isArray(opts.tracks) ? opts.tracks : [];\n const tracks = rawTracks.filter((t) => t && typeof t.url === 'string' && t.url.trim());\n\n // Build shuffled working copy without mutating opts\n const trackList = opts.shuffle ? shuffleArray(tracks) : tracks.slice();\n\n /* \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const state = {\n tracks: trackList,\n originalTracks: tracks.slice(),\n currentIndex: 0,\n isPlaying: false,\n volume: Math.max(0, Math.min(1, opts.volume)),\n shuffle: opts.shuffle,\n showProgress: opts.showProgress,\n showPlaylist: opts.showPlaylist,\n autoAdvance: opts.autoAdvance,\n audio: null,\n glass: Boolean(opts.glass),\n detachable: Boolean(opts.detachable),\n floatingPosition: opts.floatingPosition || 'bottom-right',\n draggable: Boolean(opts.draggable) && Boolean(opts.detachable),\n minimizable: Boolean(opts.minimizable),\n startMinimized: Boolean(opts.startMinimized),\n persistPosition: Boolean(opts.persistPosition),\n persistKey: typeof opts.persistKey === 'string' ? opts.persistKey : '',\n isDetached: false,\n isMinimized: false,\n _startMinimizeApplied: false,\n };\n\n /* \u2500\u2500 Audio element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const audio = new Audio();\n audio.volume = state.volume;\n audio.preload = 'metadata';\n state.audio = audio;\n\n /* \u2500\u2500 Build DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this._buildDOM(container, state);\n\n // Grab references after DOM build\n const refs = {\n btnPlay: container.querySelector('.vd-music-player-btn-play'),\n btnPrev: container.querySelector('.vd-music-player-btn-prev'),\n btnNext: container.querySelector('.vd-music-player-btn-next'),\n btnShuffle: container.querySelector('.vd-music-player-btn-shuffle'),\n btnPlaylist: container.querySelector('.vd-music-player-btn-playlist'),\n btnDetach: container.querySelector('.vd-music-player-btn-detach'),\n btnAttach: container.querySelector('.vd-music-player-btn-attach'),\n btnMinimize: container.querySelector('.vd-music-player-btn-minimize'),\n dragHandle: container.querySelector('.vd-music-player-drag-handle'),\n trackName: container.querySelector('.vd-music-player-track-name'),\n volumeSlider: container.querySelector('.vd-music-player-volume-slider'),\n volumeIcon: container.querySelector('.vd-music-player-volume-icon'),\n progressBar: container.querySelector('.vd-music-player-progress-bar'),\n timeElapsed: container.querySelector('.vd-music-player-time-elapsed'),\n timeDuration: container.querySelector('.vd-music-player-time-duration'),\n playlistPanel: container.querySelector('.vd-music-player-playlist'),\n };\n\n /* \u2500\u2500 Internal render helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const renderPlayIcon = () => {\n const btn = refs.btnPlay;\n if (!btn) return;\n btn.innerHTML = '';\n btn.appendChild(icon(state.isPlaying ? 'pause' : 'play'));\n btn.setAttribute('aria-label', state.isPlaying ? 'Pause' : 'Play');\n btn.classList.toggle('is-active', state.isPlaying);\n };\n\n const renderTrackName = () => {\n const el = refs.trackName;\n if (!el) return;\n const track = state.tracks[state.currentIndex];\n if (track) {\n el.textContent = track.name || 'Unknown Track';\n el.classList.remove('is-idle');\n } else {\n el.textContent = 'No tracks loaded';\n el.classList.add('is-idle');\n }\n };\n\n const renderVolumeIcon = () => {\n const el = refs.volumeIcon;\n if (!el) return;\n el.innerHTML = '';\n const v = state.volume;\n const name = v === 0 ? 'speaker-none' : v < 0.5 ? 'speaker-low' : 'speaker-high';\n el.appendChild(icon(name));\n };\n\n const renderShuffleBtn = () => {\n const btn = refs.btnShuffle;\n if (!btn) return;\n btn.classList.toggle('is-active', state.shuffle);\n btn.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n };\n\n const renderPlaylistItems = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n panel.innerHTML = '';\n state.tracks.forEach((track, i) => {\n const item = document.createElement('button');\n item.className =\n 'vd-music-player-playlist-item' + (i === state.currentIndex ? ' is-active' : '');\n item.type = 'button';\n item.setAttribute('data-index', String(i));\n item.setAttribute('aria-current', i === state.currentIndex ? 'true' : 'false');\n\n const num = document.createElement('span');\n num.className = 'vd-music-player-playlist-num';\n num.textContent = String(i + 1);\n\n const name = document.createElement('span');\n name.className = 'vd-music-player-playlist-name';\n name.textContent = track.name || 'Track ' + (i + 1);\n\n item.appendChild(num);\n item.appendChild(name);\n panel.appendChild(item);\n });\n };\n\n const renderProgress = () => {\n const bar = refs.progressBar;\n if (!bar || !audio.duration) return;\n const pct = (audio.currentTime / audio.duration) * 100;\n bar.value = String(pct);\n updateRangeFill(bar);\n if (refs.timeElapsed) refs.timeElapsed.textContent = formatTime(audio.currentTime);\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n };\n\n /* \u2500\u2500 Load track \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const loadTrack = (index, autoPlay) => {\n const track = state.tracks[index];\n if (!track) return;\n state.currentIndex = index;\n audio.src = track.url;\n renderTrackName();\n renderPlaylistItems();\n\n // Reset progress\n if (refs.progressBar) {\n refs.progressBar.value = '0';\n updateRangeFill(refs.progressBar);\n }\n if (refs.timeElapsed) refs.timeElapsed.textContent = '0:00';\n if (refs.timeDuration) refs.timeDuration.textContent = '0:00';\n\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n })\n );\n\n if (autoPlay) {\n audio.play().catch(() => { /* browser may block autoplay */ });\n }\n };\n\n /* \u2500\u2500 Audio event listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const cleanupFunctions = [];\n\n const onPlay = () => {\n state.isPlaying = true;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:play', { bubbles: true }));\n };\n\n const onPause = () => {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:pause', { bubbles: true }));\n };\n\n const onEnded = () => {\n if (state.autoAdvance && state.tracks.length > 1) {\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, true);\n } else {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:ended', { bubbles: true }));\n }\n };\n\n const onTimeUpdate = () => {\n if (state.showProgress) renderProgress();\n };\n\n const onLoadedMetadata = () => {\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n if (refs.progressBar) {\n refs.progressBar.max = '100';\n updateRangeFill(refs.progressBar);\n }\n };\n\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onLoadedMetadata);\n cleanupFunctions.push(() => {\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onLoadedMetadata);\n audio.pause();\n audio.src = '';\n });\n\n /* \u2500\u2500 Control button listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n if (refs.btnPlay) {\n const handler = () => {\n if (!audio.src && state.tracks.length) loadTrack(state.currentIndex, false);\n if (state.isPlaying) {\n audio.pause();\n } else {\n audio.play().catch(() => {});\n }\n };\n refs.btnPlay.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('click', handler));\n\n // Keyboard: Space / Enter (already native for <button>; guard for edge cases)\n const keyHandler = (e) => {\n if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handler(); }\n };\n refs.btnPlay.addEventListener('keydown', keyHandler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('keydown', keyHandler));\n }\n\n if (refs.btnPrev) {\n const handler = () => {\n if (!state.tracks.length) return;\n // If more than 3s into track, restart; otherwise go to previous\n if (audio.currentTime > 3) {\n audio.currentTime = 0;\n } else {\n const prev =\n state.currentIndex === 0 ? state.tracks.length - 1 : state.currentIndex - 1;\n loadTrack(prev, state.isPlaying);\n }\n };\n refs.btnPrev.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPrev.removeEventListener('click', handler));\n }\n\n if (refs.btnNext) {\n const handler = () => {\n if (!state.tracks.length) return;\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, state.isPlaying);\n };\n refs.btnNext.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnNext.removeEventListener('click', handler));\n }\n\n if (refs.btnShuffle) {\n const handler = () => {\n state.shuffle = !state.shuffle;\n if (state.shuffle) {\n const current = state.tracks[state.currentIndex];\n state.tracks = shuffleArray(state.tracks);\n // Keep current track at position 0 of the new order\n const newIdx = state.tracks.findIndex((t) => t === current);\n if (newIdx > 0) {\n state.tracks.splice(newIdx, 1);\n state.tracks.unshift(current);\n }\n state.currentIndex = 0;\n } else {\n // Restore original order, keep same track\n const current = state.tracks[state.currentIndex];\n state.tracks = state.originalTracks.slice();\n state.currentIndex = state.tracks.findIndex((t) => t === current);\n if (state.currentIndex < 0) state.currentIndex = 0;\n }\n renderShuffleBtn();\n renderPlaylistItems();\n };\n refs.btnShuffle.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnShuffle.removeEventListener('click', handler));\n }\n\n if (refs.btnPlaylist) {\n const handler = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n const isOpen = panel.classList.toggle('is-open');\n refs.btnPlaylist.classList.toggle('is-active', isOpen);\n refs.btnPlaylist.setAttribute('aria-expanded', isOpen ? 'true' : 'false');\n };\n refs.btnPlaylist.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlaylist.removeEventListener('click', handler));\n }\n\n if (refs.volumeSlider) {\n const handler = (e) => {\n const v = parseFloat(e.target.value);\n state.volume = v;\n audio.volume = v;\n renderVolumeIcon();\n updateRangeFill(refs.volumeSlider);\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } })\n );\n };\n refs.volumeSlider.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.volumeSlider.removeEventListener('input', handler));\n // Initial fill\n updateRangeFill(refs.volumeSlider);\n }\n\n if (refs.progressBar) {\n const handler = (e) => {\n if (!audio.duration) return;\n const pct = parseFloat(e.target.value);\n audio.currentTime = (pct / 100) * audio.duration;\n updateRangeFill(refs.progressBar);\n };\n refs.progressBar.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.progressBar.removeEventListener('input', handler));\n }\n\n // Playlist item click (event delegation)\n if (refs.playlistPanel) {\n const panelHandler = (e) => {\n const item = e.target.closest('.vd-music-player-playlist-item');\n if (!item) return;\n const idx = parseInt(item.getAttribute('data-index'), 10);\n if (!isNaN(idx)) loadTrack(idx, true);\n };\n refs.playlistPanel.addEventListener('click', panelHandler);\n cleanupFunctions.push(() =>\n refs.playlistPanel.removeEventListener('click', panelHandler)\n );\n }\n\n /* \u2500\u2500 Detach / attach / minimize chrome \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n if (refs.btnDetach) {\n const h = () => {\n this.detach(container);\n };\n refs.btnDetach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnDetach.removeEventListener('click', h));\n }\n if (refs.btnAttach) {\n const h = () => {\n this.attach(container);\n };\n refs.btnAttach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnAttach.removeEventListener('click', h));\n }\n if (refs.btnMinimize) {\n const h = () => {\n this.toggleMinimize(container);\n };\n refs.btnMinimize.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnMinimize.removeEventListener('click', h));\n }\n\n /* \u2500\u2500 Initial render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n renderPlayIcon();\n renderTrackName();\n renderVolumeIcon();\n if (opts.showPlaylist) renderPlaylistItems();\n\n /* \u2500\u2500 Persist instance \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this.instances.set(container, {\n state,\n audio,\n refs,\n cleanup: cleanupFunctions,\n ui: { restore: null, unbindDrag: null },\n });\n container.setAttribute('data-music-player-initialized', 'true');\n },\n\n /* \u2500\u2500\u2500 DOM builder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Build the inner DOM structure inside container.\n * Pre-existing inner content is replaced only if it has no\n * recognised child elements (allows server-rendered markup).\n * @param {HTMLElement} container\n * @param {Object} state\n */\n _buildDOM: function (container, state) {\n // Skip if already has the expected structure\n if (container.querySelector('.vd-music-player-controls')) return;\n\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Music Player');\n\n if (state.showProgress) container.classList.add('has-progress');\n if (state.showPlaylist) container.classList.add('has-playlist');\n if (state.glass) container.classList.add('vd-music-player-glass');\n if (state.draggable) container.classList.add('vd-music-player-draggable');\n\n // Detach / minimize / drag handle\n if (state.detachable || state.minimizable) {\n const tb = document.createElement('div');\n tb.className = 'vd-music-player-toolbar';\n tb.setAttribute('role', 'toolbar');\n tb.setAttribute('aria-label', 'Player window');\n if (state.draggable) {\n const h = document.createElement('button');\n h.type = 'button';\n h.className = 'vd-music-player-drag-handle';\n h.setAttribute('aria-label', 'Drag to move player');\n h.appendChild(icon('dots-six-vertical'));\n tb.appendChild(h);\n }\n const tSp = document.createElement('span');\n tSp.className = 'vd-music-player-toolbar-spacer';\n tSp.setAttribute('aria-hidden', 'true');\n tb.appendChild(tSp);\n if (state.minimizable) {\n const bMin = document.createElement('button');\n bMin.type = 'button';\n bMin.className = 'vd-music-player-btn vd-music-player-btn-minimize';\n bMin.setAttribute('aria-label', 'Minimize player');\n bMin.setAttribute('aria-expanded', 'true');\n bMin.appendChild(icon('minus'));\n tb.appendChild(bMin);\n }\n if (state.detachable) {\n const bOut = document.createElement('button');\n bOut.type = 'button';\n bOut.className = 'vd-music-player-btn vd-music-player-btn-detach';\n bOut.setAttribute('aria-label', 'Detach player');\n bOut.appendChild(icon('arrows-out'));\n tb.appendChild(bOut);\n const bIn = document.createElement('button');\n bIn.type = 'button';\n bIn.className = 'vd-music-player-btn vd-music-player-btn-attach';\n bIn.setAttribute('aria-label', 'Attach player');\n bIn.appendChild(icon('arrows-in'));\n tb.appendChild(bIn);\n }\n container.classList.add('vd-music-player-has-chrome');\n container.appendChild(tb);\n }\n\n // Track info row\n const info = document.createElement('div');\n info.className = 'vd-music-player-info';\n\n const iconWrap = document.createElement('span');\n iconWrap.className = 'vd-music-player-icon';\n iconWrap.setAttribute('aria-hidden', 'true');\n iconWrap.appendChild(icon('music-note'));\n\n const trackName = document.createElement('span');\n trackName.className = 'vd-music-player-track-name';\n trackName.setAttribute('aria-live', 'polite');\n trackName.setAttribute('aria-atomic', 'true');\n\n info.appendChild(iconWrap);\n info.appendChild(trackName);\n container.appendChild(info);\n\n // Controls row\n const controls = document.createElement('div');\n controls.className = 'vd-music-player-controls';\n controls.setAttribute('role', 'group');\n controls.setAttribute('aria-label', 'Playback controls');\n\n const btnPrev = document.createElement('button');\n btnPrev.type = 'button';\n btnPrev.className = 'vd-music-player-btn vd-music-player-btn-prev';\n btnPrev.setAttribute('aria-label', 'Previous track');\n btnPrev.appendChild(icon('skip-back'));\n\n const btnPlay = document.createElement('button');\n btnPlay.type = 'button';\n btnPlay.className = 'vd-music-player-btn vd-music-player-btn-play';\n btnPlay.setAttribute('aria-label', 'Play');\n btnPlay.appendChild(icon('play'));\n\n const btnNext = document.createElement('button');\n btnNext.type = 'button';\n btnNext.className = 'vd-music-player-btn vd-music-player-btn-next';\n btnNext.setAttribute('aria-label', 'Next track');\n btnNext.appendChild(icon('skip-forward'));\n\n controls.appendChild(btnPrev);\n controls.appendChild(btnPlay);\n controls.appendChild(btnNext);\n\n // Optional shuffle button\n if (state.showPlaylist || state.shuffle !== undefined) {\n // Always render shuffle so it can be shown when shuffle option is used\n const btnShuffle = document.createElement('button');\n btnShuffle.type = 'button';\n btnShuffle.className = 'vd-music-player-btn vd-music-player-btn-shuffle';\n btnShuffle.setAttribute('aria-label', 'Shuffle');\n btnShuffle.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n btnShuffle.appendChild(icon('shuffle'));\n controls.appendChild(btnShuffle);\n }\n\n // Spacer\n const spacer = document.createElement('span');\n spacer.className = 'vd-music-player-spacer';\n spacer.setAttribute('aria-hidden', 'true');\n controls.appendChild(spacer);\n\n // Volume\n const volumeWrap = document.createElement('div');\n volumeWrap.className = 'vd-music-player-volume';\n\n const volumeIcon = document.createElement('span');\n volumeIcon.className = 'vd-music-player-volume-icon';\n volumeIcon.setAttribute('aria-hidden', 'true');\n\n const volumeSlider = document.createElement('input');\n volumeSlider.type = 'range';\n volumeSlider.className = 'vd-music-player-volume-slider';\n volumeSlider.min = '0';\n volumeSlider.max = '1';\n volumeSlider.step = '0.01';\n volumeSlider.value = String(state.volume);\n volumeSlider.setAttribute('aria-label', 'Volume');\n\n volumeWrap.appendChild(volumeIcon);\n volumeWrap.appendChild(volumeSlider);\n controls.appendChild(volumeWrap);\n\n // Optional playlist toggle button\n if (state.showPlaylist) {\n const btnPlaylist = document.createElement('button');\n btnPlaylist.type = 'button';\n btnPlaylist.className = 'vd-music-player-btn vd-music-player-btn-playlist';\n btnPlaylist.setAttribute('aria-label', 'Show playlist');\n btnPlaylist.setAttribute('aria-expanded', 'false');\n btnPlaylist.appendChild(icon('playlist'));\n controls.appendChild(btnPlaylist);\n }\n\n container.appendChild(controls);\n\n // Optional progress bar\n if (state.showProgress) {\n const progressRow = document.createElement('div');\n progressRow.className = 'vd-music-player-progress';\n\n const timeElapsed = document.createElement('span');\n timeElapsed.className = 'vd-music-player-time vd-music-player-time-elapsed';\n timeElapsed.textContent = '0:00';\n timeElapsed.setAttribute('aria-hidden', 'true');\n\n const progressBar = document.createElement('input');\n progressBar.type = 'range';\n progressBar.className = 'vd-music-player-progress-bar';\n progressBar.min = '0';\n progressBar.max = '100';\n progressBar.step = '0.1';\n progressBar.value = '0';\n progressBar.setAttribute('aria-label', 'Seek');\n\n const timeDuration = document.createElement('span');\n timeDuration.className = 'vd-music-player-time vd-music-player-time-duration';\n timeDuration.textContent = '0:00';\n timeDuration.setAttribute('aria-hidden', 'true');\n\n progressRow.appendChild(timeElapsed);\n progressRow.appendChild(progressBar);\n progressRow.appendChild(timeDuration);\n container.appendChild(progressRow);\n }\n\n // Optional playlist panel (hidden until toggled)\n if (state.showPlaylist) {\n const playlist = document.createElement('div');\n playlist.className = 'vd-music-player-playlist';\n playlist.setAttribute('aria-label', 'Playlist');\n container.appendChild(playlist);\n }\n },\n\n /* \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * @param {HTMLElement} container\n */\n play: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (!inst.audio.src && inst.state.tracks.length) {\n inst.audio.src = inst.state.tracks[inst.state.currentIndex].url;\n }\n inst.audio.play().catch(() => {});\n },\n\n /**\n * @param {HTMLElement} container\n */\n pause: function (container) {\n const inst = this.instances.get(container);\n if (inst) inst.audio.pause();\n },\n\n /**\n * @param {HTMLElement} container\n */\n toggle: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (inst.state.isPlaying) {\n this.pause(container);\n } else {\n this.play(container);\n }\n },\n\n /**\n * @param {HTMLElement} container\n */\n next: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const next = (inst.state.currentIndex + 1) % inst.state.tracks.length;\n this._loadTrack(inst, next, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n */\n previous: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const len = inst.state.tracks.length;\n const prev = (inst.state.currentIndex - 1 + len) % len;\n this._loadTrack(inst, prev, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} value - 0 to 1\n */\n setVolume: function (container, value) {\n const inst = this.instances.get(container);\n if (!inst) return;\n const v = Math.max(0, Math.min(1, value));\n inst.state.volume = v;\n inst.audio.volume = v;\n if (inst.refs.volumeSlider) {\n inst.refs.volumeSlider.value = String(v);\n updateRangeFill(inst.refs.volumeSlider);\n }\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } })\n );\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} index - Track index\n */\n setTrack: function (container, index) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._loadTrack(inst, index, inst.state.isPlaying);\n },\n\n /**\n * Shuffle or un-shuffle the track list.\n * @param {HTMLElement} container\n */\n shuffle: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.refs.btnShuffle) return;\n inst.refs.btnShuffle.click();\n },\n\n /**\n * Float the player above the page. Requires { detachable: true } at init.\n * @param {HTMLElement} container\n * @param {string} [position] 'bottom-left' or 'bottom-right'\n */\n detach: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.detachable || inst.state.isDetached) return;\n const s = inst.state;\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n s.isDetached = true;\n inst.ui.restore = {\n parent: container.parentNode,\n next: container.nextSibling,\n };\n document.body.appendChild(container);\n container.classList.add('vd-music-player-floating', 'vd-music-player-detached');\n const pos = position != null && position !== undefined ? position : s.floatingPosition;\n this._setCornerPosition(\n container,\n pos === 'bottom-left' || pos === 'bottom-right' ? pos : 'bottom-right'\n );\n this._loadPersistedPosition(container, inst);\n if (s.startMinimized && !s._startMinimizeApplied) {\n s._startMinimizeApplied = true;\n this.minimize(container);\n }\n this._bindFloatingDrag(inst);\n container.dispatchEvent(new CustomEvent('musicplayer:detach', { bubbles: true }));\n },\n\n /**\n * Return a detached player to its original place in the document.\n * @param {HTMLElement} container\n */\n attach: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n this._unbindFloatingDrag(inst);\n inst.state.isDetached = false;\n const r = inst.ui && inst.ui.restore;\n container.classList.remove(\n 'vd-music-player-floating',\n 'vd-music-player-detached',\n 'vd-music-player-floating-bottom-left',\n 'vd-music-player-floating-bottom-right',\n 'is-position-custom'\n );\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n if (r && r.parent && r.parent.isConnected) {\n r.parent.insertBefore(container, r.next);\n }\n if (inst.ui) {\n inst.ui.restore = null;\n inst.ui.unbindDrag = null;\n }\n container.dispatchEvent(new CustomEvent('musicplayer:attach', { bubbles: true }));\n },\n\n /**\n * Collapse to essential controls. Requires { minimizable: true } at init.\n * @param {HTMLElement} container\n */\n minimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || inst.state.isMinimized) return;\n const s = inst.state;\n s.isMinimized = true;\n container.classList.add('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, true);\n if (\n inst.refs.playlistPanel &&\n inst.refs.playlistPanel.classList.contains('is-open') &&\n inst.refs.btnPlaylist\n ) {\n inst.refs.playlistPanel.classList.remove('is-open');\n inst.refs.btnPlaylist.classList.remove('is-active');\n inst.refs.btnPlaylist.setAttribute('aria-expanded', 'false');\n }\n container.dispatchEvent(new CustomEvent('musicplayer:minimize', { bubbles: true }));\n },\n\n /**\n * Restore from minimized state.\n * @param {HTMLElement} container\n */\n expand: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || !inst.state.isMinimized) return;\n inst.state.isMinimized = false;\n container.classList.remove('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, false);\n container.dispatchEvent(new CustomEvent('musicplayer:expand', { bubbles: true }));\n },\n\n /**\n * Toggle minimize / expand.\n * @param {HTMLElement} container\n */\n toggleMinimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable) return;\n if (inst.state.isMinimized) {\n this.expand(container);\n } else {\n this.minimize(container);\n }\n },\n\n /**\n * Set floating corner or pixel position (detached only).\n * @param {HTMLElement} container\n * @param {string|{x:number,y:number}} position 'bottom-left' | 'bottom-right' | { x, y } viewport\n */\n setPosition: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n if (typeof position === 'string') {\n this._setCornerPosition(\n container,\n position === 'bottom-left' || position === 'bottom-right' ? position : 'bottom-right'\n );\n } else if (position && typeof position.x === 'number' && typeof position.y === 'number') {\n this._setCustomPositionFromRect(container, position.x, position.y);\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n this._savePositionPixels(inst, r.left, r.top);\n }\n },\n\n /**\n * @param {Object} inst\n * @param {boolean} minimized\n */\n _setMinimizeButtonState: function (inst, minimized) {\n const b = inst.refs && inst.refs.btnMinimize;\n if (!b) return;\n b.innerHTML = '';\n b.appendChild(icon(minimized ? 'plus' : 'minus'));\n b.setAttribute('aria-label', minimized ? 'Expand player' : 'Minimize player');\n b.setAttribute('aria-expanded', minimized ? 'false' : 'true');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {string} which 'bottom-left' | 'bottom-right'\n */\n _setCornerPosition: function (container, which) {\n container.classList.remove('is-position-custom', 'vd-music-player-floating-bottom-left', 'vd-music-player-floating-bottom-right');\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n if (which === 'bottom-left') {\n container.classList.add('vd-music-player-floating-bottom-left');\n } else {\n container.classList.add('vd-music-player-floating-bottom-right');\n }\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} left\n * @param {number} top\n */\n _setCustomPositionFromRect: function (container, left, top) {\n container.classList.remove('vd-music-player-floating-bottom-left', 'vd-music-player-floating-bottom-right');\n container.classList.add('is-position-custom');\n container.style.setProperty('--vd-music-player-floating-left', left + 'px');\n container.style.setProperty('--vd-music-player-floating-top', top + 'px');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {Object} inst\n */\n _loadPersistedPosition: function (container, inst) {\n if (!inst.state.persistPosition) return;\n const key = this._persistKeyForInstance(inst, container);\n let raw = null;\n if (typeof window.safeStorageGet === 'function') {\n raw = window.safeStorageGet(key, null);\n } else {\n try {\n raw = localStorage.getItem(key);\n } catch (_e) {\n /* ignore unavailable storage */\n }\n }\n if (!raw) return;\n try {\n const o = JSON.parse(raw);\n if (o && typeof o.x === 'number' && typeof o.y === 'number') {\n this._setCustomPositionFromRect(container, o.x, o.y);\n }\n } catch (_err) { /* ignore */ }\n },\n\n /**\n * @param {Object} inst\n * @param {number} x\n * @param {number} y\n */\n _savePositionPixels: function (inst, x, y) {\n if (!inst.state.persistPosition) return;\n const container = this._containerOf(inst);\n if (!container) return;\n const key = this._persistKeyForInstance(inst, container);\n const val = JSON.stringify({ x, y });\n if (typeof window.safeStorageSet === 'function') {\n window.safeStorageSet(key, val);\n } else {\n try {\n localStorage.setItem(key, val);\n } catch (_e) { /* ignore */ }\n }\n },\n\n /**\n * @param {Object} inst\n * @param {HTMLElement} container\n * @returns {string}\n */\n _persistKeyForInstance: function (inst, container) {\n const pk = inst.state.persistKey;\n if (pk && String(pk).trim()) return persistStorageKey(String(pk).trim());\n return persistStorageKey(container.id || '');\n },\n\n /**\n * @param {Object} inst\n */\n _unbindFloatingDrag: function (inst) {\n if (inst.ui && typeof inst.ui.unbindDrag === 'function') {\n inst.ui.unbindDrag();\n inst.ui.unbindDrag = null;\n }\n },\n\n /**\n * Free-form pointer drag on the handle. Vanduo's `draggable` component uses HTML5\n * drag/drop for list reordering; floating players use pointer events on the handle instead.\n * @param {Object} inst\n */\n _bindFloatingDrag: function (inst) {\n this._unbindFloatingDrag(inst);\n const h = inst.refs && inst.refs.dragHandle;\n if (!h || !inst.state || !inst.state.draggable) return;\n const self = this;\n const container = this._containerOf(inst);\n if (!container) return;\n let startX = 0;\n let startY = 0;\n let origL = 0;\n let origT = 0;\n let activeDrag = false;\n const onDown = function (e) {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.preventDefault();\n activeDrag = true;\n const r = container.getBoundingClientRect();\n origL = r.left;\n origT = r.top;\n startX = e.clientX;\n startY = e.clientY;\n self._setCustomPositionFromRect(container, origL, origT);\n try {\n h.setPointerCapture(e.pointerId);\n } catch (_err) { /* empty */ }\n };\n const onMove = function (e) {\n if (!activeDrag) return;\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n let nl = origL + dx;\n let nt = origT + dy;\n const r = container.getBoundingClientRect();\n const w = r.width;\n const ph = r.height;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = 8;\n nl = Math.max(pad, Math.min(nl, vw - w - pad));\n nt = Math.max(pad, Math.min(nt, vh - ph - pad));\n self._setCustomPositionFromRect(container, nl, nt);\n };\n const onUp = function (e) {\n if (!activeDrag) return;\n activeDrag = false;\n if (typeof h.hasPointerCapture === 'function' && h.hasPointerCapture(e.pointerId)) {\n try {\n h.releasePointerCapture(e.pointerId);\n } catch (_e) { /* empty */ }\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n self._savePositionPixels(inst, r.left, r.top);\n }\n };\n h.addEventListener('pointerdown', onDown);\n h.addEventListener('pointermove', onMove);\n h.addEventListener('pointerup', onUp);\n h.addEventListener('pointercancel', onUp);\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n inst.ui.unbindDrag = function () {\n h.removeEventListener('pointerdown', onDown);\n h.removeEventListener('pointermove', onMove);\n h.removeEventListener('pointerup', onUp);\n h.removeEventListener('pointercancel', onUp);\n };\n },\n\n /**\n * Return a shallow copy of the current player state.\n * @param {HTMLElement} container\n * @returns {Object|null}\n */\n getState: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return null;\n const s = inst.state;\n return {\n isPlaying: s.isPlaying,\n currentIndex: s.currentIndex,\n currentTrack: s.tracks[s.currentIndex] || null,\n volume: s.volume,\n shuffle: s.shuffle,\n tracks: s.tracks.slice(),\n isDetached: Boolean(s.isDetached),\n isMinimized: Boolean(s.isMinimized),\n };\n },\n\n /**\n * Stop playback, clean up listeners, remove instance.\n * @param {HTMLElement} container\n */\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._unbindFloatingDrag(inst);\n if (inst.state && inst.state.isDetached) {\n try {\n this.attach(container);\n } catch (_e) { /* empty */ }\n }\n inst.cleanup.forEach((fn) => fn());\n this.instances.delete(container);\n container.removeAttribute('data-music-player-initialized');\n },\n\n /**\n * Destroy all instances.\n */\n destroyAll: function () {\n this.instances.forEach((_, container) => this.destroy(container));\n },\n\n /* \u2500\u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Load track by index on an already-initialised instance object.\n * @param {Object} inst\n * @param {number} index\n * @param {boolean} autoPlay\n */\n _loadTrack: function (inst, index, autoPlay) {\n const track = inst.state.tracks[index];\n if (!track) return;\n const container = this._containerOf(inst);\n\n inst.state.currentIndex = index;\n inst.audio.src = track.url;\n\n if (inst.refs.trackName) {\n inst.refs.trackName.textContent = track.name || 'Unknown Track';\n inst.refs.trackName.classList.remove('is-idle');\n }\n\n // Update playlist highlights\n if (inst.refs.playlistPanel) {\n inst.refs.playlistPanel.querySelectorAll('.vd-music-player-playlist-item').forEach((item, i) => {\n const active = i === index;\n item.classList.toggle('is-active', active);\n item.setAttribute('aria-current', active ? 'true' : 'false');\n });\n }\n\n // Reset progress\n if (inst.refs.progressBar) {\n inst.refs.progressBar.value = '0';\n updateRangeFill(inst.refs.progressBar);\n }\n if (inst.refs.timeElapsed) inst.refs.timeElapsed.textContent = '0:00';\n if (inst.refs.timeDuration) inst.refs.timeDuration.textContent = '0:00';\n\n if (container) {\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n })\n );\n }\n\n if (autoPlay) inst.audio.play().catch(() => {});\n },\n\n /**\n * Reverse-lookup the container element for a given instance object.\n * @param {Object} inst\n * @returns {HTMLElement|null}\n */\n _containerOf: function (inst) {\n for (const [container, i] of this.instances) {\n if (i === inst) return container;\n }\n return null;\n },\n };\n\n // Register with Vanduo framework\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('musicPlayer', MusicPlayer);\n }\n\n // Convenience global\n window.VanduoMusicPlayer = MusicPlayer;\n})();\n", "/**\n * Vanduo Framework - Bundle Entry Point\n * This file imports all framework components for bundling.\n *\n * All component files are side-effect modules that:\n * 1. Define their component object\n * 2. Register with window.Vanduo via Vanduo.register()\n * 3. Expose a convenience global (e.g. window.VanduoTooltips)\n *\n * The IIFE build uses `globalName: 'VanduoBundle'` so that esbuild's\n * wrapper variable does NOT shadow the real `window.Vanduo` that the\n * side-effect scripts create. After the bundle executes, `window.Vanduo`\n * is the fully-populated framework object.\n *\n * For ESM/CJS consumers we re-export `window.Vanduo` as the default\n * and named export so `import { Vanduo }` and `const { Vanduo } = require()`\n * both work.\n */\n\n// Utilities (must load first \u2014 helpers defines `ready()`, `safeStorageGet()` etc.)\nimport './utils/helpers.js';\nimport './utils/lifecycle.js';\n\n// Core framework object (creates window.Vanduo)\nimport './vanduo.js';\n\n// Components (each registers itself with window.Vanduo)\nimport './components/code-snippet.js';\nimport './components/collapsible.js';\nimport './components/dropdown.js';\nimport './components/font-switcher.js';\nimport './components/grid.js';\nimport './components/image-box.js';\nimport './components/modals.js';\nimport './components/navbar.js';\nimport './components/pagination.js';\nimport './components/parallax.js';\nimport './components/preloader.js';\nimport './components/select.js';\nimport './components/sidenav.js';\nimport './components/tabs.js';\nimport './components/theme-customizer.js';\nimport './components/theme-switcher.js';\nimport './components/toast.js';\nimport './components/tooltips.js';\nimport './components/doc-search.js';\nimport './components/draggable.js';\nimport './components/lazy-load.js';\n\n// Effects (glass scroll activation, water morph)\nimport './components/glass.js';\nimport './components/morph.js';\nimport './components/expanding-cards.js';\nimport './components/timeline.js';\n\n// Phase 10 (v1.2.7) components\nimport './components/flow.js';\nimport './components/bubble.js';\nimport './components/waypoint.js';\nimport './components/ripple.js';\nimport './components/affix.js';\nimport './components/suggest.js';\nimport './components/validate.js';\nimport './components/datepicker.js';\nimport './components/timepicker.js';\nimport './components/stepper.js';\nimport './components/rating.js';\nimport './components/transfer.js';\nimport './components/tree.js';\nimport './components/spotlight.js';\nimport './components/music-player.js';\n\n// Re-export for ESM / CJS consumers\nconst Vanduo = window.Vanduo;\nexport { Vanduo };\nexport default Vanduo;\n"],
5
- "mappings": "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",
6
- "names": ["normalizeCallbacks", "value", "fn", "normalizeOptions", "options", "callSafely", "label", "error", "Lifecycle", "root", "element", "scope", "selector", "matches", "descendants", "i", "componentName", "cleanupFns", "optionBag", "cleanup", "onDestroy", "componentEntries", "existing", "entry", "entries", "toRemove", "container", "result", "VANDUO_VERSION", "hasOwn", "Vanduo", "name", "root", "selector", "scope", "matches", "descendants", "i", "component", "key", "lifecycle", "componentName", "instance", "element", "cleanup", "framework", "originalInit", "args", "scopedRoot", "result", "syncRoot", "originalDestroyAll", "e", "options", "opts", "alias", "canonicalName", "names", "CodeSnippet", "root", "selector", "scope", "matches", "descendants", "snippet", "baseId", "target", "event", "handler", "toggle", "content", "tabs", "panes", "copyBtn", "pane", "isExpanded", "expanded", "snippetId", "tabList", "tab", "index", "lang", "isActive", "e", "activeTab", "activePane", "tabArray", "currentIndex", "newIndex", "code", "copySuccess", "text", "textarea", "success", "err", "announcement", "source", "html", "codeEl", "lines", "indent", "indentSize", "formattedLines", "line", "hasOpenTag", "isSelfClosing", "div", "normalized", "rawCode", "escaped", "mode", "highlighted", "nextCodeEl", "css", "js", "kw", "regex", "lineCount", "lineNumbers", "i", "lineNum", "codeWrapper", "fn", "Collapsible", "root", "container", "isAccordion", "items", "cleanupFunctions", "item", "header", "body", "trigger", "clickHandler", "e", "otherItem", "otherBody", "animate", "height", "el", "instance", "fn", "Dropdown", "root", "dropdown", "toggle", "menu", "cleanupFunctions", "toggleClickHandler", "e", "documentClickHandler", "keydownHandler", "item", "itemClickHandler", "itemKeydownHandler", "otherMenu", "otherDropdown", "otherToggle", "firstItem", "rect", "menuRect", "viewportWidth", "viewportHeight", "padding", "isOpen", "items", "currentIndex", "nextIndex", "prevIndex", "instance", "match", "i", "el", "fn", "FontSwitcher", "root", "fontKey", "event", "toggle", "onChange", "e", "onClick", "fontKeys", "nextIndex", "label", "eventName", "key", "fallback", "value", "supportsHas", "GridLayout", "root", "container", "mode", "cleanupFunctions", "button", "clickHandler", "e", "targetSelector", "target", "row", "count", "btn", "isActive", "instance", "event", "newMode", "fn", "scope", "ImageBox", "root", "self", "backdropClickHandler", "e", "imgClickHandler", "closeBtnHandler", "escHandler", "scrollHandler", "currentScrollY", "trigger", "errorHandler", "loadHandler", "clickHandler", "keyHandler", "originalCleanup", "imgSrc", "captionText", "scrollbarWidth", "fn", "Modals", "modal", "state", "root", "trigger", "triggerClickHandler", "e", "modalId", "backdrop", "closeButtons", "dialog", "cleanupFunctions", "title", "button", "closeHandler", "backdropClickHandler", "topModal", "el", "modalData", "_dialog", "scrollbarWidth", "trapHandler", "firstFocusable", "index", "self", "focusableElements", "firstElement", "lastElement", "fn", "scope", "data", "Navbar", "breakpointValue", "parsed", "root", "navbar", "isGlass", "isTransparent", "getThreshold", "attr", "onScroll", "scrolled", "toggle", "menu", "overlay", "cleanupFunctions", "scrollWatcherCleanup", "toggleClickHandler", "e", "overlayClickHandler", "keydownHandler", "resizeTimer", "resizeHandler", "breakpoint", "documentClickHandler", "dropdownToggle", "dropdownClickHandler", "dropdownMenu", "instance", "fn", "_navbar", "Pagination", "root", "pagination", "totalPages", "currentPage", "maxVisible", "clickHandler", "e", "link", "item", "page", "options", "html", "pages", "lastPage", "safePage", "half", "start", "end", "i", "el", "instance", "fn", "Parallax", "root", "element", "disableMobile", "layers", "speed", "direction", "config", "rect", "windowHeight", "elementTop", "elementHeight", "offset", "layer", "_index", "layerSpeed", "layerOffset", "el", "_config", "Preloader", "root", "bar", "initialValue", "value", "animate", "el", "text", "targetValue", "duration", "startValue", "difference", "startTime", "currentTime", "elapsed", "progress", "easeOut", "currentValue", "preloader", "Select", "root", "select", "cleanupFunctions", "wrapper", "button", "dropdown", "searchWrapper", "searchInput", "filterFn", "e", "searchHandler", "buttonClickHandler", "documentClickHandler", "keydownHandler", "changeHandler", "options", "fragment", "option", "index", "group", "groupElement", "optionElement", "_e", "selected", "selectedOption", "selectedValues", "opt", "optionEl", "value", "firstOption", "isOpen", "currentIndex", "nextIndex", "prevIndex", "instance", "match", "searchTerm", "term", "element", "id", "fn", "Sidenav", "sidenav", "state", "finalizeRestore", "transitionEndHandler", "event", "root", "toggle", "toggleClickHandler", "e", "targetId", "resizeHandler", "position", "prefix", "overlay", "closeButton", "cleanupFunctions", "closeHandler", "overlayClickHandler", "escKeyHandler", "el", "isOpen", "content", "data", "fn", "scope", "Tabs", "root", "container", "tabList", "tabLinks", "tabPanes", "cleanupFunctions", "link", "index", "tabId", "pane", "clickHandler", "e", "keydownHandler", "fallbackIndex", "tab", "allTabs", "allPanes", "tabIndex", "t", "p", "event", "currentTab", "isVertical", "tabs", "currentIndex", "newIndex", "tabElement", "instance", "fn", "ThemeCustomizer", "root", "selector", "scope", "matches", "descendants", "trigger", "target", "event", "handler", "options", "theme", "key", "value", "colorKey", "neutralKey", "radius", "fontKey", "mode", "expected", "themeSwitcher", "type", "detail", "changeEvent", "scopedTriggers", "existingCustomizer", "overlay", "panel", "el", "anchorTrigger", "triggerRect", "panelWidth", "panelTop", "viewportWidth", "panelRight", "swatch", "btn", "fontSelect", "e", "resetBtn", "closeBtn", "esc", "text", "div", "safeColor", "normalized", "primarySwatches", "neutralSwatches", "radiusButtons", "r", "fontOptions", "mq", "newDefault", "onClick", "candidate", "prefs", "fallback", "fn", "ThemeSwitcher", "root", "pref", "key", "fallback", "value", "_e", "toggle", "onChange", "e", "onClick", "modes", "nextIndex", "span", "scope", "eventName", "Toast", "position", "container", "options", "type", "duration", "config", "toast", "html", "allowSvg", "safeIcon", "_esc", "s", "d", "safeDuration", "closeBtn", "onClose", "timeoutId", "remainingTime", "startTime", "startTimer", "progress", "pauseTimer", "showEvent", "dismissEvent", "handleTransitionEnd", "fn", "message", "Tooltips", "input", "options", "root", "element", "tooltip", "cleanupFunctions", "enterHandler", "leaveHandler", "focusHandler", "blurHandler", "tooltipId", "htmlContent", "textContent", "allowSvg", "placement", "delay", "timer", "rect", "tooltipRect", "scrollTop", "scrollLeft", "top", "left", "viewportWidth", "viewportHeight", "padding", "el", "content", "isHtml", "data", "fn", "DEFAULTS", "ALLOWED_HIGHLIGHT_TAGS", "isRoot", "value", "normalizeRoot", "root", "normalizeHighlightTag", "tagName", "normalized", "createSearch", "options", "config", "state", "queryAll", "selector", "scope", "matches", "queryOne", "safeInvokeCallback", "name", "fn", "args", "error", "setResultsHtml", "html", "init", "instance", "buildIndex", "bindEvents", "setupAria", "item", "slugify", "extractKeywordsFromText", "sections", "categoryMap", "buildCategoryMap", "section", "id", "titleEl", "title", "category", "content", "extractContent", "keywords", "extractKeywords", "iconEl", "icon", "ci", "map", "currentCategory", "href", "clone", "el", "text", "word", "code", "classMatches", "match", "attr", "str", "e", "handleInput", "open", "handleKeydown", "close", "result", "index", "select", "unbindEvents", "resultsId", "query", "search", "render", "navigate", "terms", "t", "scored", "entry", "score", "titleLower", "categoryLower", "contentLower", "term", "k", "a", "b", "renderEmpty", "isActive", "getCategoryIcon", "excerpt", "getExcerpt", "escapeHtml", "highlight", "renderFooter", "categorySlug", "excerptLength", "matchPos", "i", "pos", "start", "end", "escaped", "regex", "div", "direction", "newIndex", "setActiveIndex", "prevActive", "newActive", "updateSidebarActive", "sectionId", "link", "destroy", "rebuild", "setConfig", "newConfig", "getConfig", "getIndex", "Search", "rootOrOptions", "maybeOptions", "Draggable", "root", "element", "container", "zone", "cleanupFunctions", "dragStartHandler", "e", "dragHandler", "dragEndHandler", "touchStartHandler", "touchMoveHandler", "touchEndHandler", "touchCancelHandler", "keydownHandler", "item", "dragEnterHandler", "dragOverHandler", "draggingEl", "dropHandler", "dragLeaveHandler", "existing", "data", "initialPos", "touch", "rect", "deltaX", "deltaY", "endTouch", "endPosition", "dropZone", "startX", "startY", "_zone", "x", "y", "stacked", "target", "targetZone", "zones", "nextZone", "prevZone", "position", "clientX", "clientY", "isVertical", "nextSibling", "closest", "child", "box", "offset", "prev", "next", "clone", "offsetX", "offsetY", "options", "el", "fn", "_observerMap", "_isRoot", "root", "_normalizeRoot", "_isInRoot", "element", "scope", "_queryAll", "selector", "matches", "descendants", "i", "_isSafeUrl", "url", "_safeInjectHtml", "containerEl", "html", "doc", "DANGEROUS_TAGS", "tag", "els", "_sanitizeNode", "node", "attrs", "attrName", "trimmedValue", "children", "nodes", "_skeletonHtml", "_spinnerHtml", "_resolvePlaceholder", "placeholder", "_dispatch", "el", "eventName", "detail", "VanduoLazyLoad", "callback", "options", "threshold", "rootMargin", "observer", "entries", "obs", "entry", "e", "opts", "placeholderHtml", "controller", "timeoutId", "res", "err", "alertEl", "msgEl", "detailEl", "self", "GlassScroll", "root", "el", "sentinelSelector", "sentinel", "observer", "entries", "entry", "Morph", "root", "el", "cleanup", "morphing", "handleClick", "e", "instance", "fn", "_", "wave", "shine", "waveEl", "pointerEvent", "onComplete", "rect", "cx", "cy", "px", "py", "duration", "custom", "parsed", "current", "next", "ExpandingCards", "root", "el", "container", "cleanup", "getCards", "setActive", "card", "cards", "c", "onClick", "e", "t", "onKeydown", "activeEl", "idx", "syncAria", "mo", "inst", "fn", "_", "countRevealedPrefix", "items", "count", "i", "findPlaybackControls", "container", "initPlayback", "cleanup", "item", "scope", "prevBtn", "nextBtn", "playBtn", "pauseBtn", "playTimer", "isPlaying", "playToken", "updateNavButtons", "k", "n", "atStart", "atEnd", "stepNext", "stepPrev", "scheduleNext", "token", "pause", "play", "addClick", "el", "fn", "handler", "e", "Timeline", "root", "child", "idx", "playbackApi", "observer", "entries", "entry", "inst", "_", "Flow", "root", "el", "track", "slides", "isFade", "autoplay", "interval", "loop", "state", "cleanup", "slide", "i", "liveRegion", "goTo", "index", "announce", "target", "prev", "s", "ind", "next", "prevBtn", "nextBtn", "h", "keyHandler", "e", "pointerDown", "pointerMove", "pointerUp", "diff", "startAutoplay", "stopAutoplay", "pauseHandler", "resumeHandler", "instance", "fn", "_", "Bubble", "root", "el", "outsideClick", "e", "inst", "trigger", "escHandler", "_", "cleanup", "placement", "popover", "title", "content", "htmlContent", "allowSvg", "header", "titleSpan", "closeBtn", "closeHandler", "body", "popId", "toggleHandler", "rect", "popRect", "gap", "top", "left", "instance", "fn", "Waypoint", "root", "nav", "links", "cleanup", "offset", "sections", "link", "id", "section", "activeSections", "setActive", "l", "target", "rootMargin", "observer", "entries", "entry", "i", "s", "clickHandler", "e", "instance", "fn", "_", "Ripple", "root", "el", "cleanup", "createWave", "e", "rect", "size", "x", "y", "wave", "instance", "fn", "w", "_", "isScrollable", "element", "style", "overflowY", "overflowX", "canScrollY", "canScrollX", "getScrollParent", "parent", "Affix", "root", "el", "cleanup", "parsedOffset", "offset", "scrollParent", "isStuck", "sentinel", "stick", "unstick", "observer", "entries", "entry", "instance", "fn", "_", "_escapeHtml", "text", "div", "_isSafeUrl", "url", "allowlist", "resolved", "Suggest", "root", "el", "input", "cleanup", "minChars", "value", "staticData", "items", "s", "wrapper", "list", "listId", "highlighted", "currentItems", "debounceTimer", "renderItems", "filtered", "query", "empty", "item", "i", "li", "escaped", "re", "selectItem", "open", "close", "index", "highlight", "listItems", "doSearch", "separator", "lower", "inputHandler", "keyHandler", "e", "total", "blurHandler", "focusHandler", "instance", "fn", "_", "Validate", "value", "param", "escaped", "other", "root", "form", "cleanup", "mode", "fields", "validateField", "field", "rules", "r", "errors", "rule", "name", "params", "validator", "msg", "validateAll", "valid", "eventType", "handler", "inputClear", "submitHandler", "e", "firstInvalid", "wrapper", "errorEl", "instance", "message", "fn", "_", "DAYS", "MONTHS", "escapeRegexChar", "c", "buildParseFormat", "format", "regex", "order", "i", "slice", "parseDateFromFormat", "value", "m", "y", "mo", "d", "ci", "k", "part", "v", "dt", "formatDate", "yyyy", "mm", "dd", "out", "dateKey", "addDays", "n", "x", "addMonthsClamped", "parseYmdLocal", "ymd", "day", "startOfWeekSunday", "endOfWeekSunday", "Datepicker", "root", "el", "input", "cleanup", "minStr", "maxStr", "minDate", "maxDate", "today", "viewYear", "viewMonth", "selectedDate", "viewMode", "focusedDate", "skipNextFocusOpen", "isDisabled", "ensureMonthInRange", "first", "last", "firstSelectableInMonth", "trimmed", "parsed", "fallback", "clampedInit", "popup", "wrapper", "isSameDay", "a", "b", "selectDate", "date", "close", "focusFocusedDay", "key", "btn", "skipDisabled", "stepDir", "maxSteps", "step", "createDayBtn", "outside", "isFocused", "render", "header", "prevBtn", "nextBtn", "title", "decadeStart", "gridWrap", "weekdays", "span", "firstDay", "daysInMonth", "daysInPrev", "cells", "dayNum", "prevMonth", "prevYear", "totalCells", "remaining", "r", "row", "cell", "grid", "name", "handleGridKeydown", "e", "next", "skipDir", "cl", "open", "focusHandler", "outsideHandler", "escHandler", "instance", "fn", "_", "Timepicker", "root", "el", "input", "cleanup", "is24h", "step", "wrapper", "popup", "times", "h", "m", "hh24", "mm", "period", "display", "render", "t", "item", "i", "close", "open", "selected", "focusHandler", "outsideHandler", "e", "escHandler", "instance", "fn", "_", "Stepper", "root", "el", "cleanup", "items", "isClickable", "currentIndex", "i", "setStep", "index", "prev", "item", "handler", "inst", "fn", "_", "Rating", "root", "el", "cleanup", "max", "initialValue", "readonly", "currentValue", "stars", "i", "star", "valueDisplay", "updateStars", "value", "starNum", "enterHandler", "s", "j", "leaveHandler", "clickHandler", "keyHandler", "e", "v", "inst", "fn", "_", "Transfer", "root", "el", "cleanup", "sourceData", "targetData", "item", "i", "sourceSelected", "targetSelected", "render", "sourcePanel", "createPanel", "actions", "moveRightBtn", "moveRight", "moveLeftBtn", "moveLeft", "targetPanel", "title", "data", "selected", "_side", "panel", "header", "titleSpan", "count", "searchDiv", "searchInput", "list", "renderList", "filter", "d", "li", "checkbox", "label", "toMove", "fireChange", "inst", "fn", "_", "Tree", "root", "el", "cleanup", "cascade", "data", "render", "items", "parent", "item", "node", "content", "toggle", "e", "ph", "cb", "setChildChecked", "icon", "label", "childList", "checked", "keyHandler", "focused", "nodes", "idx", "next", "prev", "collect", "i", "inst", "fn", "_", "Spotlight", "root", "trigger", "clickHandler", "event", "steps", "raw", "parsed", "error", "step", "target", "hasSelectorTarget", "hasElementTarget", "title", "description", "options", "normalizedSteps", "startOptions", "overlay", "tooltip", "escHandler", "e", "index", "el", "total", "desc", "footer", "counter", "actions", "prevBtn", "skipBtn", "nextBtn", "doneBtn", "rect", "tRect", "top", "left", "detail", "fn", "shuffleArray", "arr", "shuffled", "i", "j", "tmp", "formatTime", "seconds", "m", "s", "persistStorageKey", "id", "updateRangeFill", "input", "min", "max", "pct", "icon", "name", "el", "MusicPlayer", "root", "opts", "attr", "container", "options", "tracks", "t", "state", "audio", "refs", "renderPlayIcon", "btn", "renderTrackName", "track", "renderVolumeIcon", "v", "renderShuffleBtn", "renderPlaylistItems", "panel", "item", "num", "renderProgress", "bar", "loadTrack", "index", "autoPlay", "cleanupFunctions", "onPlay", "onPause", "onEnded", "next", "onTimeUpdate", "onLoadedMetadata", "handler", "keyHandler", "e", "prev", "current", "newIdx", "isOpen", "panelHandler", "idx", "h", "tb", "tSp", "bMin", "bOut", "bIn", "info", "iconWrap", "trackName", "controls", "btnPrev", "btnPlay", "btnNext", "btnShuffle", "spacer", "volumeWrap", "volumeIcon", "volumeSlider", "btnPlaylist", "progressRow", "timeElapsed", "progressBar", "timeDuration", "playlist", "inst", "len", "value", "position", "pos", "r", "minimized", "b", "which", "left", "top", "key", "raw", "o", "x", "y", "val", "pk", "self", "startX", "startY", "origL", "origT", "activeDrag", "onDown", "onMove", "dx", "dy", "nl", "nt", "w", "ph", "vw", "vh", "pad", "onUp", "fn", "_", "active", "Vanduo", "index_default", "Vanduo"]
4
+ "sourcesContent": ["/**\n * Vanduo Framework - Lifecycle Manager\n * Central registry for scoped init/destroy, instance cleanup, and DOM queries.\n */\n\n(function () {\n 'use strict';\n\n function normalizeCallbacks(value) {\n if (!value) return [];\n if (Array.isArray(value)) {\n return value.filter(function (fn) {\n return typeof fn === 'function';\n });\n }\n return typeof value === 'function' ? [value] : [];\n }\n\n function normalizeOptions(options) {\n if (typeof options === 'function') {\n return { onDestroy: [options] };\n }\n return options || {};\n }\n\n function callSafely(label, fn) {\n try {\n fn();\n } catch (error) {\n console.warn('[Vanduo Lifecycle] ' + label + ' error:', error);\n }\n }\n\n const Lifecycle = {\n // Map<Element, Map<componentName, { cleanup, onDestroy, registeredAt }>>\n instances: new Map(),\n\n isRoot: function (root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n normalizeRoot: function (root) {\n return this.isRoot(root) ? root : document;\n },\n\n isInRoot: function (root, element) {\n const scope = this.normalizeRoot(root);\n if (!(element instanceof Element)) return false;\n if (scope === document) {\n return document.documentElement ? document.documentElement.contains(element) : document.contains(element);\n }\n if (scope === element) return true;\n return typeof scope.contains === 'function' && scope.contains(element);\n },\n\n queryAll: function (root, selector) {\n const scope = this.normalizeRoot(root);\n const matches = [];\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n return matches;\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n runInRoot: function (root, fn) {\n const scope = this.normalizeRoot(root);\n return fn(scope);\n },\n\n register: function (element, componentName, cleanupFns, options) {\n if (!(element instanceof Element) || !componentName) return;\n\n const optionBag = normalizeOptions(options);\n const cleanup = normalizeCallbacks(cleanupFns);\n const onDestroy = normalizeCallbacks(optionBag.onDestroy);\n const componentEntries = this.instances.get(element) || new Map();\n const existing = componentEntries.get(componentName);\n\n if (existing) {\n existing.cleanup = existing.cleanup.concat(cleanup);\n existing.onDestroy = existing.onDestroy.concat(onDestroy);\n return;\n }\n\n componentEntries.set(componentName, {\n component: componentName,\n cleanup: cleanup,\n onDestroy: onDestroy,\n registeredAt: Date.now()\n });\n\n this.instances.set(element, componentEntries);\n },\n\n unregister: function (element, componentName) {\n const componentEntries = this.instances.get(element);\n if (!componentEntries) return;\n\n if (componentName) {\n const entry = componentEntries.get(componentName);\n if (!entry) return;\n\n componentEntries.delete(componentName);\n if (!componentEntries.size) {\n this.instances.delete(element);\n }\n\n entry.cleanup.forEach(function (fn) {\n callSafely('Cleanup', fn);\n });\n entry.onDestroy.forEach(function (fn) {\n callSafely('Destroy', fn);\n });\n return;\n }\n\n const entries = Array.from(componentEntries.values());\n this.instances.delete(element);\n entries.forEach(function (entry) {\n entry.cleanup.forEach(function (fn) {\n callSafely('Cleanup', fn);\n });\n entry.onDestroy.forEach(function (fn) {\n callSafely('Destroy', fn);\n });\n });\n },\n\n destroyAll: function (componentName) {\n const toRemove = [];\n this.instances.forEach(function (componentEntries, element) {\n if (!componentName) {\n toRemove.push([element, null]);\n return;\n }\n\n if (componentEntries.has(componentName)) {\n toRemove.push([element, componentName]);\n }\n });\n\n toRemove.forEach(function (entry) {\n Lifecycle.unregister(entry[0], entry[1] || undefined);\n });\n\n return toRemove.length;\n },\n\n destroyAllInContainer: function (container, componentName) {\n const scope = this.normalizeRoot(container);\n const toRemove = [];\n\n this.instances.forEach(function (componentEntries, element) {\n if (!Lifecycle.isInRoot(scope, element)) return;\n\n if (!componentName) {\n toRemove.push([element, null]);\n return;\n }\n\n if (componentEntries.has(componentName)) {\n toRemove.push([element, componentName]);\n }\n });\n\n toRemove.forEach(function (entry) {\n Lifecycle.unregister(entry[0], entry[1] || undefined);\n });\n\n return toRemove.length;\n },\n\n getAll: function () {\n const result = [];\n this.instances.forEach(function (componentEntries, element) {\n componentEntries.forEach(function (entry) {\n result.push({\n element: element,\n component: entry.component,\n registeredAt: entry.registeredAt\n });\n });\n });\n return result;\n },\n\n has: function (element, componentName) {\n const componentEntries = this.instances.get(element);\n if (!componentEntries) return false;\n return componentName ? componentEntries.has(componentName) : componentEntries.size > 0;\n }\n };\n\n window.addEventListener('beforeunload', function () {\n Lifecycle.destroyAll();\n });\n\n window.VanduoLifecycle = Lifecycle;\n})();\n", "/**\n * Vanduo Framework - Main JavaScript File\n */\n\n(function () {\n 'use strict';\n\n const VANDUO_VERSION = typeof __VANDUO_VERSION__ !== 'undefined' ? __VANDUO_VERSION__ : '0.0.0-dev';\n const hasOwn = Object.prototype.hasOwnProperty;\n\n /**\n * Vanduo Framework Object\n */\n const Vanduo = {\n version: VANDUO_VERSION,\n components: {},\n aliases: {},\n _decoratedComponents: new WeakSet(),\n\n resolveComponentName: function (name) {\n return this.aliases[name] || name;\n },\n\n _isRoot: function (root) {\n if (typeof window.VanduoLifecycle !== 'undefined' && typeof window.VanduoLifecycle.isRoot === 'function') {\n return window.VanduoLifecycle.isRoot(root);\n }\n\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n _normalizeRoot: function (root) {\n return this._isRoot(root) ? root : document;\n },\n\n _queryAll: function (root, selector) {\n const scope = this._normalizeRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n },\n\n queryAll: function (root, selector) {\n if (typeof selector === 'undefined') {\n selector = root;\n root = document;\n }\n\n return this._queryAll(root, selector);\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n _isLifecycleManagedComponent: function (component) {\n if (!component || typeof component !== 'object') return false;\n\n for (const key in component) {\n if (hasOwn.call(component, key) && component[key] instanceof Map) {\n return true;\n }\n }\n\n return false;\n },\n\n _syncComponentLifecycle: function (name, component, root) {\n const lifecycle = window.VanduoLifecycle;\n if (!lifecycle || !this._isLifecycleManagedComponent(component)) return;\n\n const componentName = this.resolveComponentName(name);\n const scope = this._normalizeRoot(root);\n\n for (const key in component) {\n if (!hasOwn.call(component, key) || !(component[key] instanceof Map)) {\n continue;\n }\n\n component[key].forEach(function (instance, element) {\n if (!(element instanceof Element) || !lifecycle.isInRoot(scope, element) || lifecycle.has(element, componentName)) {\n return;\n }\n\n if (typeof component.destroy === 'function') {\n lifecycle.register(element, componentName, [], function () {\n component.destroy(element);\n });\n return;\n }\n\n const cleanup = instance && Array.isArray(instance.cleanup) ? instance.cleanup : [];\n lifecycle.register(element, componentName, cleanup, function () {\n component[key].delete(element);\n });\n });\n }\n },\n\n _decorateComponent: function (name, component) {\n const framework = this;\n const lifecycle = window.VanduoLifecycle;\n if (!component || typeof component !== 'object' || this._decoratedComponents.has(component)) {\n return;\n }\n\n const originalInit = typeof component.init === 'function' ? component.init : null;\n if (originalInit) {\n component.init = function (...args) {\n const scopedRoot = framework._isRoot(args[0]) ? args[0] : null;\n const result = originalInit.apply(this, args);\n\n if (window.Vanduo) {\n const syncRoot = scopedRoot || document;\n window.Vanduo._syncComponentLifecycle(name, this, syncRoot);\n }\n\n return result;\n };\n }\n\n const originalDestroyAll = typeof component.destroyAll === 'function' ? component.destroyAll : null;\n if (originalDestroyAll) {\n component.destroyAll = function (...args) {\n const scopedRoot = framework._isRoot(args[0]) ? args[0] : null;\n const componentName = window.Vanduo ? window.Vanduo.resolveComponentName(name) : name;\n\n if (lifecycle && window.Vanduo && window.Vanduo._isLifecycleManagedComponent(this)) {\n if (scopedRoot && scopedRoot !== document) {\n lifecycle.destroyAllInContainer(scopedRoot, componentName);\n if (this.__vanduoScopedDestroyAll === true) {\n return originalDestroyAll.apply(this, args);\n }\n return;\n }\n\n lifecycle.destroyAll(componentName);\n }\n\n return originalDestroyAll.apply(this, args);\n };\n }\n\n this._decoratedComponents.add(component);\n },\n\n /**\n * Initialize framework\n * Call this after DOM is ready and all components are loaded\n */\n init: function (root) {\n const scope = this._normalizeRoot(root);\n\n if (scope !== document) {\n this.initComponents(scope);\n return;\n }\n\n if (typeof ready !== 'undefined') {\n ready(() => {\n this.initComponents(document);\n });\n return;\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.initComponents(document);\n });\n return;\n }\n\n this.initComponents(document);\n },\n\n /**\n * Initialize all components\n */\n initComponents: function (root) {\n const scope = this._normalizeRoot(root);\n\n Object.keys(this.components).forEach((name) => {\n const component = this.components[name];\n if (component.init && typeof component.init === 'function') {\n try {\n component.init(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to initialize component \"' + name + '\":', e);\n }\n }\n });\n },\n\n /**\n * Register a component\n * @param {string} name - Component name\n * @param {Object} component - Component object with init method\n */\n register: function (name, component, options) {\n const opts = options || {};\n this._decorateComponent(name, component);\n this.components[name] = component;\n\n if (Array.isArray(opts.aliases)) {\n opts.aliases.forEach((alias) => {\n this.aliases[alias] = name;\n });\n }\n },\n\n registerAlias: function (alias, name) {\n const canonicalName = this.resolveComponentName(name);\n if (this.components[canonicalName]) {\n this.aliases[alias] = canonicalName;\n }\n },\n\n /**\n * Re-initialize a component (useful after dynamic DOM changes)\n * @param {string} name - Component name\n */\n reinit: function (name, root) {\n const scope = this._normalizeRoot(root);\n const componentName = this.resolveComponentName(name);\n const component = this.components[componentName];\n if (component && component.init && typeof component.init === 'function') {\n try {\n if (component.destroyAll && typeof component.destroyAll === 'function') {\n component.destroyAll(scope);\n }\n component.init(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to reinitialize component \"' + componentName + '\":', e);\n }\n }\n },\n\n /**\n * Destroy component instances within the provided root.\n */\n destroy: function (root) {\n const scope = this._normalizeRoot(root);\n const names = Object.keys(this.components);\n\n for (let i = 0; i < names.length; i++) {\n const component = this.components[names[i]];\n if (component && component.destroyAll && typeof component.destroyAll === 'function') {\n try {\n component.destroyAll(scope);\n } catch (e) {\n console.warn('[Vanduo] Failed to destroy component \"' + names[i] + '\":', e);\n }\n }\n }\n },\n\n /**\n * Destroy all component instances and clean up event listeners.\n */\n destroyAll: function () {\n this.destroy(document);\n },\n\n /**\n * Get component instance\n * @param {string} name - Component name\n * @returns {Object|null}\n */\n getComponent: function (name) {\n const componentName = this.resolveComponentName(name);\n return this.components[componentName] || null;\n }\n };\n\n // Expose to global scope\n window.Vanduo = Vanduo;\n\n})();\n", "/**\n * Vanduo Framework - Code Snippet Component\n * Copyable code blocks with tabs, syntax highlighting, and HTML extraction\n */\n\n(function () {\n 'use strict';\n\n /**\n * Code Snippet Component\n */\n const CodeSnippet = {\n _snippetIdCounter: 0,\n\n resolveRoot: function (root) {\n if (root && (root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11)) {\n return root;\n }\n return document;\n },\n\n queryWithin: function (root, selector) {\n const scope = this.resolveRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n },\n\n getSnippetInstanceId: function (snippet) {\n if (snippet.dataset.codeSnippetId) {\n return snippet.dataset.codeSnippetId;\n }\n\n const baseId = (snippet.id || '').trim();\n if (baseId) {\n snippet.dataset.codeSnippetId = `snippet-${baseId}`;\n return snippet.dataset.codeSnippetId;\n }\n\n this._snippetIdCounter += 1;\n snippet.dataset.codeSnippetId = `snippet-auto-${this._snippetIdCounter}`;\n return snippet.dataset.codeSnippetId;\n },\n\n addListener: function (snippet, target, event, handler) {\n if (!target) return;\n target.addEventListener(event, handler);\n if (!snippet._codeSnippetCleanup) {\n snippet._codeSnippetCleanup = [];\n }\n snippet._codeSnippetCleanup.push(() => target.removeEventListener(event, handler));\n },\n\n /**\n * Initialize all code snippet components\n */\n init: function (root) {\n const snippets = this.queryWithin(root, '.vd-code-snippet');\n\n snippets.forEach(snippet => {\n if (!snippet.dataset.initialized) {\n this.initSnippet(snippet);\n }\n });\n },\n\n /**\n * Initialize a single code snippet\n * @param {HTMLElement} snippet - Code snippet container element\n */\n initSnippet: function (snippet) {\n snippet.dataset.initialized = 'true';\n snippet._codeSnippetCleanup = [];\n\n // Handle collapsible toggle\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle && content) {\n this.initCollapsible(snippet, toggle, content);\n }\n\n // Handle tabs\n const tabs = snippet.querySelectorAll('.vd-code-snippet-tab');\n const panes = snippet.querySelectorAll('.vd-code-snippet-pane');\n\n if (tabs.length > 0) {\n this.initTabs(snippet, tabs, panes);\n }\n\n // Handle copy button\n const copyBtn = snippet.querySelector('.vd-code-snippet-copy');\n if (copyBtn) {\n this.initCopyButton(snippet, copyBtn);\n }\n\n // Handle HTML extraction\n const extractPanes = snippet.querySelectorAll('[data-extract]');\n extractPanes.forEach(pane => {\n this.extractHtml(pane);\n });\n\n const panesToHighlight = snippet.querySelectorAll('.vd-code-snippet-pane:not([data-extract])');\n panesToHighlight.forEach(pane => {\n this.applyPaneHighlighting(pane);\n });\n\n // Handle line numbers\n const lineNumberPanes = snippet.querySelectorAll('.has-line-numbers');\n lineNumberPanes.forEach(pane => {\n this.addLineNumbers(pane);\n });\n },\n\n /**\n * Initialize collapsible functionality\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} content - Collapsible content\n */\n initCollapsible: function (snippet, toggle, content) {\n // Set initial state\n const isExpanded = snippet.dataset.expanded === 'true';\n toggle.setAttribute('aria-expanded', isExpanded);\n content.dataset.visible = isExpanded;\n\n this.addListener(snippet, toggle, 'click', () => {\n const expanded = snippet.dataset.expanded === 'true';\n snippet.dataset.expanded = !expanded;\n toggle.setAttribute('aria-expanded', !expanded);\n content.dataset.visible = !expanded;\n\n // Extract HTML on first expand if needed\n if (!expanded) {\n const extractPanes = content.querySelectorAll('[data-extract]:not([data-extracted])');\n extractPanes.forEach(pane => {\n this.extractHtml(pane);\n });\n }\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:toggle', {\n bubbles: true,\n detail: { snippet, expanded: !expanded }\n });\n snippet.dispatchEvent(event);\n });\n },\n\n /**\n * Initialize tab functionality\n * @param {HTMLElement} snippet - Code snippet container\n * @param {NodeList} tabs - Tab buttons\n * @param {NodeList} panes - Code panes\n */\n initTabs: function (snippet, tabs, panes) {\n const snippetId = this.getSnippetInstanceId(snippet);\n\n // Set up ARIA attributes\n const tabList = snippet.querySelector('.vd-code-snippet-tabs');\n if (tabList) {\n tabList.setAttribute('role', 'tablist');\n }\n\n tabs.forEach((tab, index) => {\n const lang = tab.dataset.lang;\n const isActive = tab.classList.contains('is-active');\n\n // Set ARIA attributes\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', isActive);\n tab.setAttribute('tabindex', isActive ? '0' : '-1');\n tab.id = tab.id || `code-tab-${snippetId}-${lang || 'tab'}-${index}`;\n\n // Find corresponding pane\n const pane = snippet.querySelector(`.vd-code-snippet-pane[data-lang=\"${lang}\"]`);\n if (pane) {\n pane.id = pane.id || `code-pane-${snippetId}-${lang || 'pane'}-${index}`;\n pane.setAttribute('role', 'tabpanel');\n tab.setAttribute('aria-controls', pane.id);\n pane.setAttribute('aria-labelledby', tab.id);\n }\n\n // Click handler\n this.addListener(snippet, tab, 'click', () => {\n this.switchTab(snippet, tab, tabs, panes);\n });\n\n // Keyboard navigation\n this.addListener(snippet, tab, 'keydown', (e) => {\n this.handleTabKeydown(e, snippet, tabs, panes);\n });\n });\n },\n\n /**\n * Switch to a specific tab\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} activeTab - Tab to activate\n * @param {NodeList} tabs - All tab buttons\n * @param {NodeList} panes - All code panes\n */\n switchTab: function (snippet, activeTab, tabs, panes) {\n const lang = activeTab.dataset.lang;\n\n // Deactivate all tabs\n tabs.forEach(tab => {\n tab.classList.remove('is-active');\n tab.setAttribute('aria-selected', 'false');\n tab.setAttribute('tabindex', '-1');\n });\n\n // Hide all panes\n panes.forEach(pane => {\n pane.classList.remove('is-active');\n });\n\n // Activate selected tab\n activeTab.classList.add('is-active');\n activeTab.setAttribute('aria-selected', 'true');\n activeTab.setAttribute('tabindex', '0');\n\n // Show corresponding pane\n const activePane = snippet.querySelector(`.vd-code-snippet-pane[data-lang=\"${lang}\"]`);\n if (activePane) {\n activePane.classList.add('is-active');\n }\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:tabchange', {\n bubbles: true,\n detail: { snippet, tab: activeTab, lang }\n });\n snippet.dispatchEvent(event);\n },\n\n /**\n * Handle keyboard navigation for tabs\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} snippet - Code snippet container\n * @param {NodeList} tabs - All tab buttons\n * @param {NodeList} panes - All code panes\n */\n handleTabKeydown: function (e, snippet, tabs, panes) {\n const tabArray = Array.from(tabs);\n const currentIndex = tabArray.indexOf(e.target);\n let newIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabArray.length - 1;\n break;\n case 'ArrowRight':\n e.preventDefault();\n newIndex = currentIndex < tabArray.length - 1 ? currentIndex + 1 : 0;\n break;\n case 'Home':\n e.preventDefault();\n newIndex = 0;\n break;\n case 'End':\n e.preventDefault();\n newIndex = tabArray.length - 1;\n break;\n default:\n return;\n }\n\n if (newIndex !== currentIndex) {\n tabArray[newIndex].focus();\n this.switchTab(snippet, tabArray[newIndex], tabs, panes);\n }\n },\n\n /**\n * Initialize copy button\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} copyBtn - Copy button element\n */\n initCopyButton: function (snippet, copyBtn) {\n this.addListener(snippet, copyBtn, 'click', async () => {\n await this.copyCode(snippet, copyBtn);\n });\n },\n\n /**\n * Copy code to clipboard\n * @param {HTMLElement} snippet - Code snippet container\n * @param {HTMLElement} copyBtn - Copy button element\n */\n copyCode: async function (snippet, copyBtn) {\n const activePane = snippet.querySelector('.vd-code-snippet-pane.is-active') ||\n snippet.querySelector('.vd-code-snippet-pane');\n\n if (!activePane) {\n console.warn('CodeSnippet: No code pane found');\n return;\n }\n\n const codeElement = activePane.querySelector('code') || activePane;\n const code = codeElement.textContent;\n\n let copySuccess;\n try {\n await navigator.clipboard.writeText(code);\n copySuccess = true;\n } catch (_err) {\n // Fallback for older browsers\n copySuccess = this.fallbackCopy(code);\n }\n this.showCopyFeedback(copyBtn, copySuccess);\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:copy', {\n bubbles: true,\n detail: { snippet, code, success: copySuccess }\n });\n snippet.dispatchEvent(event);\n },\n\n /**\n * Fallback copy method for older browsers\n * @param {string} text - Text to copy\n * @returns {boolean} Success status\n */\n fallbackCopy: function (text) {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n let success = false;\n try {\n success = document.execCommand('copy');\n } catch (err) {\n console.warn('CodeSnippet: Fallback copy failed', err);\n }\n\n document.body.removeChild(textarea);\n return success;\n },\n\n /**\n * Show copy feedback\n * @param {HTMLElement} copyBtn - Copy button element\n * @param {boolean} success - Whether copy was successful\n */\n showCopyFeedback: function (copyBtn, success) {\n if (success) {\n copyBtn.classList.add('is-copied');\n\n // Announce to screen readers\n const announcement = document.createElement('span');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', 'polite');\n announcement.className = 'sr-only';\n announcement.textContent = 'Code copied to clipboard';\n copyBtn.appendChild(announcement);\n\n setTimeout(() => {\n copyBtn.classList.remove('is-copied');\n if (announcement.parentNode) {\n announcement.parentNode.removeChild(announcement);\n }\n }, 2000);\n }\n },\n\n /**\n * Extract HTML from a demo element\n * @param {HTMLElement} pane - Code pane with data-extract attribute\n */\n extractHtml: function (pane) {\n const selector = pane.dataset.extract;\n if (!selector) return;\n\n const source = document.querySelector(selector);\n if (!source) {\n console.warn(`CodeSnippet: Source element not found: ${selector}`);\n return;\n }\n\n // Get inner HTML\n let html = source.innerHTML;\n\n // Format the HTML\n html = this.formatHtml(html);\n\n // Escape for display\n html = this.escapeHtml(html);\n\n // Apply syntax highlighting\n html = this.highlightHtml(html);\n\n // Set content via DOM API to avoid string-based HTML insertion\n const codeEl = document.createElement('code');\n codeEl.innerHTML = html;\n pane.replaceChildren(codeEl);\n pane.dataset.extracted = 'true';\n pane.dataset.highlighted = 'true';\n },\n\n /**\n * Format HTML with proper indentation\n * @param {string} html - Raw HTML string\n * @returns {string} Formatted HTML\n */\n formatHtml: function (html) {\n // Remove leading/trailing whitespace\n html = html.trim();\n\n // Simple formatting: normalize whitespace\n // Split by tags, then rejoin with proper indentation\n const lines = html.split('\\n');\n let indent = 0;\n const indentSize = 2;\n const formattedLines = [];\n\n lines.forEach(line => {\n line = line.trim();\n if (!line) return;\n\n // Check for closing tags at start\n if (line.match(/^<\\/\\w/)) {\n indent = Math.max(0, indent - indentSize);\n }\n\n formattedLines.push(' '.repeat(indent) + line);\n\n // Check for opening tags (not self-closing)\n // Use short fixed-length regex + indexOf to prevent ReDoS\n const hasOpenTag = /<[a-zA-Z]/.test(line);\n const isSelfClosing = line.includes('/>');\n if (hasOpenTag && !isSelfClosing) {\n // Don't indent for void elements\n if (!line.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)) {\n // Only indent if not also closing on same line\n if (!line.match(/<\\/\\w+>$/)) {\n indent += indentSize;\n }\n }\n }\n });\n\n return formattedLines.join('\\n');\n },\n\n /**\n * Escape HTML entities for display\n * @param {string} html - HTML string\n * @returns {string} Escaped HTML\n */\n escapeHtml: function (html) {\n const div = document.createElement('div');\n div.textContent = html;\n return div.innerHTML;\n },\n\n needsHighlighting: function (pane, codeEl) {\n if (!codeEl) return false;\n if (pane.dataset.highlighted === 'true') return false;\n if (codeEl.querySelector('[class^=\"code-\"], [class*=\" code-\"]')) return false;\n return true;\n },\n\n getHighlightMode: function (lang) {\n const normalized = String(lang || '').trim().toLowerCase();\n\n if ([\n 'html',\n 'xml',\n 'svg',\n 'vue',\n 'svelte',\n 'astro'\n ].includes(normalized)) {\n return 'html';\n }\n\n if ([\n 'css',\n 'scss',\n 'sass',\n 'less'\n ].includes(normalized)) {\n return 'css';\n }\n\n if ([\n 'js',\n 'mjs',\n 'cjs',\n 'ts',\n 'jsx',\n 'tsx',\n 'json',\n 'bash',\n 'sh'\n ].includes(normalized)) {\n return 'js';\n }\n\n return 'plain';\n },\n\n highlightCodeByLang: function (rawCode, lang) {\n const escaped = this.escapeHtml(rawCode);\n const mode = this.getHighlightMode(lang);\n\n if (mode === 'html') {\n return this.highlightHtml(escaped);\n }\n\n if (mode === 'css') {\n return this.highlightCss(escaped);\n }\n\n if (mode === 'js') {\n return this.highlightJs(escaped);\n }\n\n return escaped;\n },\n\n applyPaneHighlighting: function (pane) {\n if (!pane) return;\n\n const codeEl = pane.querySelector('code') || pane;\n if (!this.needsHighlighting(pane, codeEl)) {\n pane.dataset.highlighted = 'true';\n return;\n }\n\n const rawCode = codeEl.textContent || '';\n const highlighted = this.highlightCodeByLang(rawCode, pane.dataset.lang);\n const nextCodeEl = codeEl.tagName === 'CODE' ? codeEl : document.createElement('code');\n\n nextCodeEl.innerHTML = highlighted;\n\n if (nextCodeEl !== codeEl) {\n pane.replaceChildren(nextCodeEl);\n }\n\n pane.dataset.highlighted = 'true';\n },\n\n /**\n * Apply syntax highlighting to HTML\n * @param {string} html - Escaped HTML string\n * @returns {string} HTML with syntax highlighting spans\n */\n highlightHtml: function (html) {\n // Highlight HTML tags\n html = html.replace(/(&lt;\\/?)([\\w-]+)/g, '$1<span class=\"code-tag\">$2</span>');\n\n // Highlight attributes\n html = html.replace(/([\\w-]+)(=)([\"'])/g, '<span class=\"code-attr\">$1</span>$2$3');\n html = html.replace(/([\\w-]+)(=)(&quot;|&#39;)/g, '<span class=\"code-attr\">$1</span>$2$3');\n\n // Highlight attribute values (strings)\n html = html.replace(/([\"'])([^\"']*)([\"'])/g, '$1<span class=\"code-string\">$2</span>$3');\n html = html.replace(/(&quot;|&#39;)([^&]*)(&quot;|&#39;)/g, '$1<span class=\"code-string\">$2</span>$3');\n\n // Highlight comments\n html = html.replace(/(&lt;!--)(.*?)(--&gt;)/g, '<span class=\"code-comment\">$1$2$3</span>');\n\n return html;\n },\n\n /**\n * Apply syntax highlighting to CSS\n * @param {string} css - CSS string\n * @returns {string} CSS with syntax highlighting spans\n */\n highlightCss: function (css) {\n // Highlight selectors \u2014 use non-backtracking bounded pattern\n css = css.replace(/([.#]?[a-zA-Z][a-zA-Z0-9_-]{0,200})(\\s*\\{)/g, '<span class=\"code-selector\">$1</span>$2');\n\n // Highlight properties \u2014 use non-backtracking bounded pattern\n css = css.replace(/([a-zA-Z][a-zA-Z0-9_-]{0,200})(\\s*:)/g, '<span class=\"code-property\">$1</span>$2');\n\n // Highlight values\n css = css.replace(/:\\s*([^;{}]+)(;)/g, ': <span class=\"code-value\">$1</span>$2');\n\n // Highlight units\n css = css.replace(/(\\d+)(px|rem|em|%|vh|vw|deg|s|ms)/g, '<span class=\"code-number\">$1</span><span class=\"code-unit\">$2</span>');\n\n // Highlight comments\n css = css.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"code-comment\">$1</span>');\n\n return css;\n },\n\n /**\n * Apply syntax highlighting to JavaScript\n * @param {string} js - JavaScript string\n * @returns {string} JS with syntax highlighting spans\n */\n highlightJs: function (js) {\n // Highlight keywords\n const keywords = ['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'];\n keywords.forEach(kw => {\n const regex = new RegExp(`\\\\b(${kw})\\\\b`, 'g');\n js = js.replace(regex, '<span class=\"code-keyword\">$1</span>');\n });\n\n // Highlight strings (limit to 10 000 chars to prevent polynomial backtracking)\n js = js.replace(/('(?:[^'\\\\]|\\\\.){0,10000}'|\"(?:[^\"\\\\]|\\\\.){0,10000}\"|`(?:[^`\\\\]|\\\\.){0,10000}`)/g, '<span class=\"code-string\">$1</span>');\n\n // Highlight numbers\n js = js.replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"code-number\">$1</span>');\n\n // Highlight function calls\n js = js.replace(/\\b([\\w]+)(\\s*\\()/g, '<span class=\"code-function\">$1</span>$2');\n\n // Highlight comments\n js = js.replace(/(\\/\\/.*$)/gm, '<span class=\"code-comment\">$1</span>');\n js = js.replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"code-comment\">$1</span>');\n\n return js;\n },\n\n /**\n * Add line numbers to a code pane\n * @param {HTMLElement} pane - Code pane element\n */\n addLineNumbers: function (pane) {\n const code = pane.querySelector('code');\n if (!code) return;\n\n const lines = code.innerHTML.split('\\n');\n const lineCount = lines.length;\n\n // Create line numbers container\n const lineNumbers = document.createElement('div');\n lineNumbers.className = 'vd-code-snippet-line-numbers';\n lineNumbers.setAttribute('aria-hidden', 'true');\n\n for (let i = 1; i <= lineCount; i++) {\n const lineNum = document.createElement('span');\n lineNum.textContent = i;\n lineNumbers.appendChild(lineNum);\n }\n\n // Wrap code content\n const codeWrapper = document.createElement('div');\n codeWrapper.className = 'vd-code-snippet-code';\n codeWrapper.appendChild(code.cloneNode(true));\n\n // Replace code with new structure\n code.parentNode.removeChild(code);\n pane.appendChild(lineNumbers);\n pane.appendChild(codeWrapper);\n },\n\n /**\n * Programmatically expand a code snippet\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n expand: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n snippet.dataset.expanded = 'true';\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle) toggle.setAttribute('aria-expanded', 'true');\n if (content) content.dataset.visible = 'true';\n },\n\n /**\n * Programmatically collapse a code snippet\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n collapse: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n snippet.dataset.expanded = 'false';\n const toggle = snippet.querySelector('.vd-code-snippet-toggle');\n const content = snippet.querySelector('.vd-code-snippet-content');\n\n if (toggle) toggle.setAttribute('aria-expanded', 'false');\n if (content) content.dataset.visible = 'false';\n },\n\n /**\n * Programmatically switch to a specific language tab\n * @param {string|HTMLElement} snippet - Snippet selector or element\n * @param {string} lang - Language to switch to (html, css, js)\n */\n showLang: function (snippet, lang) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n const tab = snippet.querySelector(`.vd-code-snippet-tab[data-lang=\"${lang}\"]`);\n const tabs = snippet.querySelectorAll('.vd-code-snippet-tab');\n const panes = snippet.querySelectorAll('.vd-code-snippet-pane');\n\n if (tab) {\n this.switchTab(snippet, tab, tabs, panes);\n }\n },\n\n /**\n * Destroy a code snippet instance and clean up listeners\n * @param {string|HTMLElement} snippet - Snippet selector or element\n */\n destroy: function (snippet) {\n if (typeof snippet === 'string') {\n snippet = document.querySelector(snippet);\n }\n if (!snippet) return;\n\n if (snippet._codeSnippetCleanup) {\n snippet._codeSnippetCleanup.forEach(fn => fn());\n delete snippet._codeSnippetCleanup;\n }\n\n delete snippet.dataset.initialized;\n },\n\n /**\n * Destroy all code snippet instances\n */\n destroyAll: function (root) {\n const scope = this.resolveRoot(root);\n const snippets = this.queryWithin(scope, '.vd-code-snippet[data-initialized=\"true\"]');\n snippets.forEach(snippet => {\n this.destroy(snippet);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('codeSnippet', CodeSnippet);\n }\n\n // Also expose globally for convenience\n window.CodeSnippet = CodeSnippet;\n\n})();\n", "/**\n * Vanduo Framework - Collapsible Component\n * JavaScript functionality for collapsible/accordion components\n */\n\n(function() {\n 'use strict';\n\n /**\n * Collapsible Component\n */\n const Collapsible = {\n // Store initialized containers and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize collapsible components\n */\n init: function(root) {\n const collapsibles = window.Vanduo.queryAll(root, '.vd-collapsible, .accordion');\n\n collapsibles.forEach(container => {\n if (this.instances.has(container)) {\n return;\n }\n this.initCollapsible(container);\n });\n },\n\n /**\n * Initialize a collapsible container\n * @param {HTMLElement} container - Collapsible container\n */\n initCollapsible: function(container) {\n const isAccordion = container.classList.contains('accordion');\n const items = container.querySelectorAll('.vd-collapsible-item, .accordion-item');\n const cleanupFunctions = [];\n\n items.forEach(item => {\n const header = item.querySelector('.vd-collapsible-header, .accordion-header');\n const body = item.querySelector('.vd-collapsible-body, .accordion-body');\n const trigger = item.querySelector('.vd-collapsible-trigger, .accordion-trigger') || header;\n\n if (!header || !body) {\n return;\n }\n\n // Set initial state\n if (item.classList.contains('is-open')) {\n this.openItem(item, body, false);\n } else {\n this.closeItem(item, body, false);\n }\n\n // Add click handler\n const clickHandler = (e) => {\n e.preventDefault();\n this.toggleItem(item, body, container, isAccordion);\n };\n trigger.addEventListener('click', clickHandler);\n cleanupFunctions.push(() => trigger.removeEventListener('click', clickHandler));\n });\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n \n /**\n * Toggle collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {HTMLElement} container - Collapsible container\n * @param {boolean} isAccordion - Whether in accordion mode\n */\n toggleItem: function(item, body, container, isAccordion) {\n const isOpen = item.classList.contains('is-open');\n \n if (isOpen) {\n this.closeItem(item, body);\n } else {\n // If accordion mode, close other open items\n if (isAccordion) {\n const otherOpenItems = container.querySelectorAll('.vd-collapsible-item.is-open, .accordion-item.is-open');\n otherOpenItems.forEach(otherItem => {\n if (otherItem !== item) {\n const otherBody = otherItem.querySelector('.vd-collapsible-body, .accordion-body');\n this.closeItem(otherItem, otherBody);\n }\n });\n }\n \n this.openItem(item, body);\n }\n },\n \n /**\n * Open collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {boolean} animate - Whether to animate\n */\n openItem: function(item, body, animate = true) {\n if (!animate) {\n body.style.transition = 'none';\n }\n \n item.classList.add('is-open');\n item.setAttribute('aria-expanded', 'true');\n \n // Set max-height to actual height\n const height = body.scrollHeight;\n body.style.maxHeight = `${height}px`;\n \n // Reset transition after a brief delay\n if (!animate) {\n setTimeout(() => {\n body.style.transition = '';\n }, 0);\n }\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('collapsible:open', { bubbles: true }));\n },\n \n /**\n * Close collapsible item\n * @param {HTMLElement} item - Collapsible item\n * @param {HTMLElement} body - Collapsible body\n * @param {boolean} animate - Whether to animate\n */\n closeItem: function(item, body, animate = true) {\n if (!animate) {\n body.style.transition = 'none';\n }\n \n item.classList.remove('is-open');\n item.setAttribute('aria-expanded', 'false');\n body.style.maxHeight = '0';\n \n // Reset transition after a brief delay\n if (!animate) {\n setTimeout(() => {\n body.style.transition = '';\n }, 0);\n }\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('collapsible:close', { bubbles: true }));\n },\n \n /**\n * Open item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n open: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n if (body) {\n this.openItem(el, body);\n }\n }\n },\n \n /**\n * Close item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n close: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n if (body) {\n this.closeItem(el, body);\n }\n }\n },\n \n /**\n * Toggle item programmatically\n * @param {HTMLElement|string} item - Collapsible item or selector\n */\n toggle: function(item) {\n const el = typeof item === 'string' ? document.querySelector(item) : item;\n if (el) {\n const body = el.querySelector('.vd-collapsible-body, .accordion-body');\n const container = el.closest('.vd-collapsible, .accordion');\n const isAccordion = container && container.classList.contains('accordion');\n\n if (body) {\n this.toggleItem(el, body, container, isAccordion);\n }\n }\n },\n\n /**\n * Destroy a collapsible instance and clean up event listeners\n * @param {HTMLElement} container - Collapsible container\n */\n destroy: function(container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(container);\n },\n\n /**\n * Destroy all collapsible instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, container) => {\n this.destroy(container);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('collapsible', Collapsible);\n }\n \n // Expose globally\n window.VanduoCollapsible = Collapsible;\n \n})();\n", "/**\n * Vanduo Framework - Dropdown Component\n * JavaScript functionality for dropdown menus\n */\n\n(function() {\n 'use strict';\n\n /**\n * Dropdown Component\n */\n const Dropdown = {\n // Store initialized dropdowns and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize dropdown components\n */\n init: function(root) {\n const dropdowns = window.Vanduo.queryAll(root, '.vd-dropdown');\n\n dropdowns.forEach(dropdown => {\n if (this.instances.has(dropdown)) {\n return;\n }\n this.initDropdown(dropdown);\n });\n },\n\n /**\n * Initialize a single dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n */\n initDropdown: function(dropdown) {\n const toggle = dropdown.querySelector('.vd-dropdown-toggle');\n const menu = dropdown.querySelector('.vd-dropdown-menu');\n\n if (!toggle || !menu) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n toggle.setAttribute('aria-haspopup', 'true');\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('role', 'menu');\n menu.setAttribute('aria-hidden', 'true');\n\n // Toggle on click\n const toggleClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleDropdown(dropdown, toggle, menu);\n };\n toggle.addEventListener('click', toggleClickHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('click', toggleClickHandler));\n\n // Close on outside click\n const documentClickHandler = (e) => {\n if (!dropdown.contains(e.target) && menu.classList.contains('is-open')) {\n this.closeDropdown(dropdown, toggle, menu);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, dropdown, toggle, menu);\n };\n toggle.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('keydown', keydownHandler));\n\n // Handle item clicks\n const items = menu.querySelectorAll('.vd-dropdown-item:not(.disabled):not(.is-disabled)');\n items.forEach(item => {\n const itemClickHandler = (e) => {\n e.preventDefault();\n this.selectItem(item, dropdown, toggle, menu);\n };\n item.addEventListener('click', itemClickHandler);\n cleanupFunctions.push(() => item.removeEventListener('click', itemClickHandler));\n\n const itemKeydownHandler = (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.selectItem(item, dropdown, toggle, menu);\n }\n };\n item.addEventListener('keydown', itemKeydownHandler);\n cleanupFunctions.push(() => item.removeEventListener('keydown', itemKeydownHandler));\n });\n\n this.instances.set(dropdown, { toggle, menu, cleanup: cleanupFunctions, typeaheadBuffer: '', typeaheadTimer: null });\n },\n \n /**\n * Toggle dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n toggleDropdown: function(dropdown, toggle, menu) {\n const isOpen = menu.classList.contains('is-open');\n \n if (isOpen) {\n this.closeDropdown(dropdown, toggle, menu);\n } else {\n this.openDropdown(dropdown, toggle, menu);\n }\n },\n \n /**\n * Open dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n openDropdown: function(dropdown, toggle, menu) {\n // Close other open dropdowns\n const otherOpen = document.querySelectorAll('.vd-dropdown-menu.is-open');\n otherOpen.forEach(otherMenu => {\n if (otherMenu !== menu) {\n const otherDropdown = otherMenu.closest('.vd-dropdown');\n const otherToggle = otherDropdown.querySelector('.vd-dropdown-toggle');\n this.closeDropdown(otherDropdown, otherToggle, otherMenu);\n }\n });\n \n dropdown.classList.add('is-open');\n menu.classList.add('is-open');\n toggle.setAttribute('aria-expanded', 'true');\n menu.setAttribute('aria-hidden', 'false');\n \n // Position menu\n this.positionMenu(dropdown, menu);\n \n // Focus first item\n const firstItem = menu.querySelector('.vd-dropdown-item:not(.disabled):not(.is-disabled)');\n if (firstItem) {\n setTimeout(() => firstItem.focus(), 0);\n }\n },\n \n /**\n * Close dropdown\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n closeDropdown: function(dropdown, toggle, menu) {\n dropdown.classList.remove('is-open');\n menu.classList.remove('is-open');\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('aria-hidden', 'true');\n \n // Return focus to toggle\n toggle.focus();\n },\n \n /**\n * Position dropdown menu\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} menu - Dropdown menu\n */\n positionMenu: function(dropdown, menu) {\n const rect = dropdown.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n // Reset auto-position classes before computing a new state.\n menu.classList.remove('vd-dropdown-menu-end', 'vd-dropdown-menu-start', 'vd-dropdown-menu-top');\n\n // Directional wrappers explicitly control placement in CSS.\n if (dropdown.classList.contains('vd-dropdown-dropup')) {\n menu.classList.add('vd-dropdown-menu-top');\n return;\n }\n\n if (dropdown.classList.contains('vd-dropdown-dropright') || dropdown.classList.contains('vd-dropdown-dropleft')) {\n return;\n }\n\n // Check if menu overflows right.\n if (rect.left + menuRect.width > viewportWidth - padding) {\n menu.classList.add('vd-dropdown-menu-end');\n } else {\n menu.classList.add('vd-dropdown-menu-start');\n }\n\n // Flip above trigger when there is not enough room below.\n if (rect.bottom + menuRect.height > viewportHeight - padding && rect.top - menuRect.height > padding) {\n menu.classList.add('vd-dropdown-menu-top');\n }\n },\n \n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n handleKeydown: function(e, dropdown, toggle, menu) {\n const isOpen = menu.classList.contains('is-open');\n const items = Array.from(menu.querySelectorAll('.vd-dropdown-item:not(.disabled):not(.is-disabled)'));\n const currentIndex = items.findIndex(item => item === document.activeElement);\n \n switch (e.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n this.openDropdown(dropdown, toggle, menu);\n } else if (e.key === 'ArrowDown') {\n const nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n items[nextIndex].focus();\n }\n break;\n \n case 'ArrowUp':\n if (isOpen) {\n e.preventDefault();\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n items[prevIndex].focus();\n }\n break;\n \n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n this.closeDropdown(dropdown, toggle, menu);\n }\n break;\n \n case 'Home':\n if (isOpen) {\n e.preventDefault();\n items[0].focus();\n }\n break;\n \n case 'End':\n if (isOpen) {\n e.preventDefault();\n items[items.length - 1].focus();\n }\n break;\n\n default:\n // Typeahead: jump to matching item when typing printable characters\n if (isOpen && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n // Per-instance typeahead state to avoid cross-instance corruption\n const instance = this.instances.get(dropdown);\n if (!instance) break;\n clearTimeout(instance.typeaheadTimer);\n instance.typeaheadBuffer += e.key.toLowerCase();\n\n const match = items.find(item =>\n item.textContent.trim().toLowerCase().startsWith(instance.typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n instance.typeaheadTimer = setTimeout(() => {\n instance.typeaheadBuffer = '';\n }, 500);\n }\n break;\n }\n },\n \n /**\n * Select dropdown item\n * @param {HTMLElement} item - Dropdown item\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Dropdown menu\n */\n selectItem: function(item, dropdown, toggle, menu) {\n // Remove active from all items\n menu.querySelectorAll('.vd-dropdown-item').forEach(i => {\n i.classList.remove('active', 'is-active');\n });\n \n // Add active to selected item\n item.classList.add('active', 'is-active');\n \n // Update toggle text if it's a button\n if (toggle.tagName === 'BUTTON' || toggle.classList.contains('btn')) {\n toggle.textContent = item.textContent.trim();\n }\n \n // Close dropdown\n this.closeDropdown(dropdown, toggle, menu);\n \n // Dispatch event\n item.dispatchEvent(new CustomEvent('dropdown:select', { \n bubbles: true,\n detail: { item, value: item.dataset.value || item.textContent }\n }));\n },\n \n /**\n * Open dropdown programmatically\n * @param {HTMLElement|string} dropdown - Dropdown container or selector\n */\n open: function(dropdown) {\n const el = typeof dropdown === 'string' ? document.querySelector(dropdown) : dropdown;\n if (el) {\n const toggle = el.querySelector('.vd-dropdown-toggle');\n const menu = el.querySelector('.vd-dropdown-menu');\n if (toggle && menu) {\n this.openDropdown(el, toggle, menu);\n }\n }\n },\n \n /**\n * Close dropdown programmatically\n * @param {HTMLElement|string} dropdown - Dropdown container or selector\n */\n close: function(dropdown) {\n const el = typeof dropdown === 'string' ? document.querySelector(dropdown) : dropdown;\n if (el) {\n const toggle = el.querySelector('.vd-dropdown-toggle');\n const menu = el.querySelector('.vd-dropdown-menu');\n if (toggle && menu) {\n this.closeDropdown(el, toggle, menu);\n }\n }\n },\n\n /**\n * Destroy a dropdown instance and clean up event listeners\n * @param {HTMLElement} dropdown - Dropdown element\n */\n destroy: function(dropdown) {\n const instance = this.instances.get(dropdown);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(dropdown);\n },\n\n /**\n * Destroy all dropdown instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, dropdown) => {\n this.destroy(dropdown);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('dropdown', Dropdown);\n }\n \n // Expose globally\n window.VanduoDropdown = Dropdown;\n \n})();\n", "/**\n * Vanduo Framework - Font Switcher\n * Handles font selection and persistence for previewing different typefaces\n */\n\n(function() {\n 'use strict';\n\n const FontSwitcher = {\n STORAGE_KEY: 'vanduo-font-preference',\n isInitialized: false,\n\n // Available fonts configuration\n fonts: {\n 'system': {\n name: 'System Default',\n family: null // Uses CSS default\n },\n 'jetbrains-mono': {\n name: 'JetBrains Mono',\n family: \"'JetBrains Mono', monospace\"\n },\n 'ubuntu': {\n name: 'Ubuntu',\n family: \"'Ubuntu', sans-serif\",\n category: 'sans-serif',\n description: 'Friendly, humanist sans-serif'\n },\n 'open-sans': {\n name: 'Open Sans',\n family: \"'Open Sans', sans-serif\",\n category: 'sans-serif',\n description: 'Neutral, highly readable'\n },\n 'lato': {\n name: 'Lato',\n family: \"'Lato', sans-serif\",\n category: 'sans-serif',\n description: 'Friendly, rounded sans-serif'\n }\n },\n\n getToggles: function(root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-toggle=\"font\"]');\n }\n\n return Array.from(document.querySelectorAll('[data-toggle=\"font\"]'));\n },\n\n init: function(root) {\n this.state = {\n preference: this.getPreference()\n };\n if (!this.fonts[this.state.preference]) {\n this.state.preference = 'ubuntu';\n this.setStorageValue(this.STORAGE_KEY, this.state.preference);\n }\n\n if (this.isInitialized) {\n this.applyFont();\n this.renderUI(root);\n this.updateUI(root);\n return;\n }\n\n this.isInitialized = true;\n\n this.applyFont();\n this.renderUI(root);\n },\n\n /**\n * Get saved font preference from localStorage\n * @returns {string} Font key or 'ubuntu' (default)\n */\n getPreference: function() {\n return this.getStorageValue(this.STORAGE_KEY, 'ubuntu');\n },\n\n /**\n * Set font preference and apply it\n * @param {string} fontKey - The font key to apply\n */\n setPreference: function(fontKey) {\n if (!this.fonts[fontKey]) {\n console.warn('Unknown font:', fontKey);\n return;\n }\n\n this.state.preference = fontKey;\n this.setStorageValue(this.STORAGE_KEY, fontKey);\n this.applyFont();\n this.updateUI();\n\n // Dispatch custom event for other components to listen to\n const event = new CustomEvent('font:change', {\n bubbles: true,\n detail: { font: fontKey, fontData: this.fonts[fontKey] }\n });\n document.dispatchEvent(event);\n },\n\n /**\n * Apply the current font preference to the document\n */\n applyFont: function() {\n const fontKey = this.state.preference;\n\n if (fontKey === 'system') {\n // Remove data-font attribute to use system default\n document.documentElement.removeAttribute('data-font');\n } else {\n // Set data-font attribute which triggers CSS variable override\n document.documentElement.setAttribute('data-font', fontKey);\n }\n },\n\n /**\n * Initialize UI elements with data-toggle=\"font\"\n */\n renderUI: function(root) {\n const toggles = this.getToggles(root);\n\n toggles.forEach(toggle => {\n if (toggle.getAttribute('data-font-initialized') === 'true') {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n }\n return;\n }\n\n if (toggle.tagName === 'SELECT') {\n // Set initial value\n toggle.value = this.state.preference;\n\n // Listen for changes\n const onChange = (e) => {\n this.setPreference(e.target.value);\n };\n toggle.addEventListener('change', onChange);\n toggle._fontToggleHandler = onChange;\n } else {\n // Button implementation - cycle through fonts\n const onClick = () => {\n const fontKeys = Object.keys(this.fonts);\n const currentIndex = fontKeys.indexOf(this.state.preference);\n const nextIndex = (currentIndex + 1) % fontKeys.length;\n this.setPreference(fontKeys[nextIndex]);\n };\n toggle.addEventListener('click', onClick);\n toggle._fontToggleHandler = onClick;\n }\n\n toggle.setAttribute('data-font-initialized', 'true');\n });\n },\n\n /**\n * Update all UI elements to reflect current state\n */\n updateUI: function(root) {\n const toggles = this.getToggles(root);\n\n toggles.forEach(toggle => {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n } else {\n // Update button text if it has a label span\n const label = toggle.querySelector('.font-current-label');\n if (label) {\n label.textContent = this.fonts[this.state.preference].name;\n }\n }\n });\n },\n\n /**\n * Get the current font preference\n * @returns {string} Current font key\n */\n getCurrentFont: function() {\n return this.state.preference;\n },\n\n /**\n * Get font data for a given key\n * @param {string} fontKey - The font key\n * @returns {Object|null} Font data or null\n */\n getFontData: function(fontKey) {\n return this.fonts[fontKey] || null;\n },\n\n destroyAll: function(root) {\n const toggles = this.getToggles(root || document).filter(function(toggle) {\n return toggle.getAttribute('data-font-initialized') === 'true';\n });\n toggles.forEach(toggle => {\n if (toggle._fontToggleHandler) {\n const eventName = toggle.tagName === 'SELECT' ? 'change' : 'click';\n toggle.removeEventListener(eventName, toggle._fontToggleHandler);\n delete toggle._fontToggleHandler;\n }\n toggle.removeAttribute('data-font-initialized');\n });\n\n if (!root || root === document) {\n this.isInitialized = false;\n }\n },\n\n getStorageValue: function(key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function(key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('fontSwitcher', FontSwitcher);\n }\n\n // Expose globally for convenience\n window.FontSwitcher = FontSwitcher;\n})();\n", "/**\n * Vanduo Framework - Grid Layout Component\n * Toggle between standard 12-column and Fibonacci grid modes\n * via data-layout-mode attribute and toggle buttons\n */\n\n(function () {\n 'use strict';\n\n const supportsHas = (function () {\n try {\n return CSS.supports('selector(:has(*))');\n } catch (_e) {\n return false;\n }\n })();\n\n /**\n * Grid Layout Component\n */\n const GridLayout = {\n instances: new Map(),\n __vanduoScopedDestroyAll: true,\n\n /**\n * Initialize all grid layout containers\n */\n init: function (root) {\n const containers = window.Vanduo.queryAll(root, '[data-layout-mode]');\n\n containers.forEach(function (container) {\n if (this.instances.has(container)) {\n return;\n }\n this.initContainer(container);\n }.bind(this));\n\n this.initToggleButtons(root);\n },\n\n /**\n * Initialize a single grid container\n * @param {HTMLElement} container - Element with data-layout-mode\n */\n initContainer: function (container) {\n const mode = container.getAttribute('data-layout-mode') || 'standard';\n const cleanupFunctions = [];\n\n this.applyMode(container, mode);\n\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Grid layout: ' + mode + ' mode');\n\n this.instances.set(container, {\n cleanup: cleanupFunctions,\n mode: mode\n });\n },\n\n /**\n * Initialize toggle buttons that target grid containers\n */\n initToggleButtons: function (root) {\n const toggleButtons = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-grid-toggle]')\n : document.querySelectorAll('[data-grid-toggle]');\n\n toggleButtons.forEach(function (button) {\n if (button.getAttribute('data-grid-initialized') === 'true') {\n return;\n }\n\n const clickHandler = function (e) {\n e.preventDefault();\n const targetSelector = button.getAttribute('data-grid-toggle');\n let target;\n\n if (targetSelector) {\n target = document.querySelector(targetSelector);\n } else {\n target = button.closest('[data-layout-mode]');\n }\n\n if (target) {\n this.toggle(target);\n }\n }.bind(this);\n\n button.addEventListener('click', clickHandler);\n button.setAttribute('data-grid-initialized', 'true');\n button.setAttribute('aria-pressed', 'false');\n\n button._gridCleanup = function () {\n button.removeEventListener('click', clickHandler);\n button.removeAttribute('data-grid-initialized');\n button.removeAttribute('aria-pressed');\n };\n }.bind(this));\n },\n\n /**\n * Apply Fibonacci grid-template-columns inline for browsers without :has()\n * @param {HTMLElement} container - Grid container\n */\n applyFibFallback: function (container) {\n if (supportsHas) return;\n\n const rows = container.querySelectorAll('.vd-row, .row');\n rows.forEach(function (row) {\n const cols = row.querySelectorAll(':scope > [class*=\"vd-col-\"], :scope > [class*=\"col-\"]');\n const count = cols.length;\n\n if (count === 1) {\n row.style.gridTemplateColumns = '1fr';\n } else if (count === 2) {\n row.style.gridTemplateColumns = '1fr 1.618fr';\n } else if (count === 3) {\n row.style.gridTemplateColumns = '2fr 3fr 5fr';\n } else if (count === 4) {\n row.style.gridTemplateColumns = '1fr 2fr 3fr 5fr';\n } else {\n row.style.gridTemplateColumns = 'repeat(' + count + ', 1fr)';\n }\n });\n },\n\n /**\n * Remove inline grid-template-columns fallback\n * @param {HTMLElement} container - Grid container\n */\n removeFibFallback: function (container) {\n const rows = container.querySelectorAll('.vd-row, .row');\n rows.forEach(function (row) {\n row.style.gridTemplateColumns = '';\n });\n },\n\n /**\n * Apply a layout mode to a container\n * @param {HTMLElement} container - Target container\n * @param {string} mode - 'fibonacci' or 'standard'\n */\n applyMode: function (container, mode) {\n container.classList.remove('vd-grid-standard', 'vd-grid-fibonacci');\n\n if (mode === 'fibonacci') {\n container.classList.add('vd-grid-fibonacci');\n this.applyFibFallback(container);\n } else {\n container.classList.add('vd-grid-standard');\n this.removeFibFallback(container);\n }\n\n container.setAttribute('data-layout-mode', mode);\n container.setAttribute('aria-label', 'Grid layout: ' + mode + ' mode');\n\n // Update associated toggle button states\n const toggleButtons = document.querySelectorAll('[data-grid-toggle]');\n toggleButtons.forEach(function (btn) {\n const targetSelector = btn.getAttribute('data-grid-toggle');\n if (targetSelector && container.matches(targetSelector)) {\n const isActive = (mode === 'fibonacci');\n if (isActive) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n btn.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n }\n });\n\n // Store mode in instance\n const instance = this.instances.get(container);\n if (instance) {\n instance.mode = mode;\n }\n\n // Dispatch custom event\n let event;\n try {\n event = new CustomEvent('grid:modechange', {\n bubbles: true,\n detail: {\n container: container,\n mode: mode\n }\n });\n } catch (_e) {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('grid:modechange', true, true, {\n container: container,\n mode: mode\n });\n }\n container.dispatchEvent(event);\n },\n\n /**\n * Toggle between standard and fibonacci modes\n * @param {HTMLElement|string} container - Container element or selector\n */\n toggle: function (container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return;\n\n const currentMode = container.getAttribute('data-layout-mode') || 'standard';\n const newMode = (currentMode === 'fibonacci') ? 'standard' : 'fibonacci';\n this.applyMode(container, newMode);\n },\n\n /**\n * Set a specific mode\n * @param {HTMLElement|string} container - Container element or selector\n * @param {string} mode - 'fibonacci' or 'standard'\n */\n setMode: function (container, mode) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return;\n if (mode !== 'fibonacci' && mode !== 'standard') return;\n\n this.applyMode(container, mode);\n },\n\n /**\n * Get the current mode of a container\n * @param {HTMLElement|string} container - Container element or selector\n * @returns {string|null} Current mode or null\n */\n getMode: function (container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n if (!container) return null;\n return container.getAttribute('data-layout-mode') || 'standard';\n },\n\n /**\n * Destroy a single grid layout instance\n * @param {HTMLElement} container - Grid container\n */\n destroy: function (container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(function (fn) { fn(); });\n container.classList.remove('vd-grid-standard', 'vd-grid-fibonacci');\n container.removeAttribute('aria-label');\n this.removeFibFallback(container);\n this.instances.delete(container);\n },\n\n /**\n * Destroy all grid layout instances and clean up toggle buttons\n */\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.instances.forEach(function (instance, container) {\n if (scope === document || scope === container || (typeof scope.contains === 'function' && scope.contains(container))) {\n this.destroy(container);\n }\n }.bind(this));\n\n const toggleButtons = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-grid-toggle][data-grid-initialized=\"true\"]')\n : document.querySelectorAll('[data-grid-initialized=\"true\"]');\n toggleButtons.forEach(function (button) {\n if (button._gridCleanup) {\n button._gridCleanup();\n delete button._gridCleanup;\n }\n });\n }\n };\n\n // Register with Vanduo framework\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('gridLayout', GridLayout);\n }\n\n // Expose globally\n window.VanduoGridLayout = GridLayout;\n\n})();\n", "/**\n * Vanduo Framework - Image Box Component\n * Lightbox-style image enlargement with smooth transitions\n * \n * Features:\n * - Click to enlarge images with data-image-box attribute\n * - Smooth scale and opacity transitions\n * - Dismiss via click, ESC key, or scroll\n * - Magnifying glass cursor on hover\n * - Accessible with ARIA attributes\n * - Reduced motion support\n */\n\n(function () {\n 'use strict';\n\n /**\n * Image Box Component\n */\n const ImageBox = {\n backdrop: null,\n container: null,\n img: null,\n closeBtn: null,\n caption: null,\n currentTrigger: null,\n scrollThreshold: 50,\n initialScrollY: 0,\n isOpen: false,\n\n // Store cleanup functions for event listeners\n _cleanupFunctions: [],\n\n getTriggers: function (root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-image-box]');\n }\n\n return Array.from(document.querySelectorAll('[data-image-box]'));\n },\n\n /**\n * Initialize Image Box component\n */\n init: function (root) {\n this.createBackdrop();\n this.bindTriggers(root);\n },\n\n /**\n * Create backdrop elements\n */\n createBackdrop: function () {\n // Prevent duplicate backdrop creation\n if (this.backdrop || document.querySelector('.vd-image-box-backdrop')) {\n // If backdrop already exists in DOM, reuse it\n if (!this.backdrop) {\n this.backdrop = document.querySelector('.vd-image-box-backdrop');\n this.container = this.backdrop.querySelector('.vd-image-box-container');\n this.img = this.backdrop.querySelector('.vd-image-box-img');\n this.closeBtn = this.backdrop.querySelector('.vd-image-box-close');\n this.caption = this.backdrop.querySelector('.vd-image-box-caption');\n this.bindBackdropEvents();\n }\n return;\n }\n\n // Create backdrop\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'vd-image-box-backdrop';\n this.backdrop.setAttribute('role', 'dialog');\n this.backdrop.setAttribute('aria-modal', 'true');\n this.backdrop.setAttribute('aria-label', 'Image viewer');\n this.backdrop.setAttribute('tabindex', '-1');\n\n // Create container\n this.container = document.createElement('div');\n this.container.className = 'vd-image-box-container';\n\n // Create image\n this.img = document.createElement('img');\n this.img.className = 'vd-image-box-img';\n this.img.alt = '';\n\n // Create close button\n this.closeBtn = document.createElement('button');\n this.closeBtn.className = 'vd-image-box-close';\n this.closeBtn.setAttribute('aria-label', 'Close image viewer');\n this.closeBtn.innerHTML = '&times;';\n\n // Create caption element\n this.caption = document.createElement('div');\n this.caption.className = 'vd-image-box-caption';\n\n // Assemble\n this.container.appendChild(this.img);\n this.backdrop.appendChild(this.closeBtn);\n this.backdrop.appendChild(this.container);\n this.backdrop.appendChild(this.caption);\n document.body.appendChild(this.backdrop);\n\n // Bind backdrop events\n this.bindBackdropEvents();\n },\n\n /**\n * Bind events to backdrop elements\n */\n bindBackdropEvents: function () {\n const self = this;\n\n // Close on backdrop click (but not when clicking the image)\n const backdropClickHandler = function (e) {\n if (e.target === self.backdrop || e.target === self.container) {\n self.close();\n }\n };\n this.backdrop.addEventListener('click', backdropClickHandler);\n this._cleanupFunctions.push(() => this.backdrop.removeEventListener('click', backdropClickHandler));\n\n // Close on image click\n const imgClickHandler = function () {\n self.close();\n };\n this.img.addEventListener('click', imgClickHandler);\n this._cleanupFunctions.push(() => this.img.removeEventListener('click', imgClickHandler));\n\n // Close on close button click\n const closeBtnHandler = function () {\n self.close();\n };\n this.closeBtn.addEventListener('click', closeBtnHandler);\n this._cleanupFunctions.push(() => this.closeBtn.removeEventListener('click', closeBtnHandler));\n\n // ESC key handler\n const escHandler = function (e) {\n if (e.key === 'Escape' && self.isOpen) {\n self.close();\n }\n };\n document.addEventListener('keydown', escHandler);\n this._cleanupFunctions.push(() => document.removeEventListener('keydown', escHandler));\n\n // Scroll handler for dismissal\n const scrollHandler = function () {\n if (!self.isOpen) return;\n\n const currentScrollY = window.scrollY;\n const scrollDelta = Math.abs(currentScrollY - self.initialScrollY);\n\n if (scrollDelta > self.scrollThreshold) {\n self.close();\n }\n };\n window.addEventListener('scroll', scrollHandler, { passive: true });\n this._cleanupFunctions.push(() => window.removeEventListener('scroll', scrollHandler));\n },\n\n /**\n * Bind triggers to all images with data-image-box attribute\n */\n bindTriggers: function (root) {\n const self = this;\n const triggers = this.getTriggers(root);\n\n triggers.forEach(function (trigger) {\n // Skip if already initialized\n if (trigger.dataset.imageBoxInitialized) return;\n trigger.dataset.imageBoxInitialized = 'true';\n\n // Add trigger class\n trigger.classList.add('vd-image-box-trigger');\n\n // Handle broken images\n if (trigger.tagName === 'IMG') {\n // Check if already in error state\n if (trigger.complete && trigger.naturalWidth === 0) {\n trigger.classList.add('is-broken');\n }\n\n // Listen for error events\n const errorHandler = function () {\n trigger.classList.add('is-broken');\n };\n trigger.addEventListener('error', errorHandler);\n\n // Listen for successful load\n const loadHandler = function () {\n trigger.classList.remove('is-broken');\n };\n trigger.addEventListener('load', loadHandler);\n\n trigger._imageBoxErrorHandler = errorHandler;\n trigger._imageBoxLoadHandler = loadHandler;\n }\n\n // Bind click event\n const clickHandler = function (e) {\n e.preventDefault();\n self.open(trigger);\n };\n trigger.addEventListener('click', clickHandler);\n\n // Store cleanup\n trigger._imageBoxCleanup = () => trigger.removeEventListener('click', clickHandler);\n\n // Keyboard accessibility for non-button triggers\n if (trigger.tagName !== 'BUTTON' && trigger.tagName !== 'A') {\n trigger.setAttribute('role', 'button');\n trigger.setAttribute('tabindex', '0');\n trigger.setAttribute('aria-label', 'View enlarged image');\n\n const keyHandler = function (e) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n self.open(trigger);\n }\n };\n trigger.addEventListener('keydown', keyHandler);\n\n const originalCleanup = trigger._imageBoxCleanup;\n trigger._imageBoxCleanup = () => {\n originalCleanup();\n trigger.removeEventListener('keydown', keyHandler);\n };\n }\n\n const originalCleanup = trigger._imageBoxCleanup;\n trigger._imageBoxCleanup = () => {\n originalCleanup();\n if (trigger._imageBoxErrorHandler) {\n trigger.removeEventListener('error', trigger._imageBoxErrorHandler);\n delete trigger._imageBoxErrorHandler;\n }\n if (trigger._imageBoxLoadHandler) {\n trigger.removeEventListener('load', trigger._imageBoxLoadHandler);\n delete trigger._imageBoxLoadHandler;\n }\n };\n });\n },\n\n /**\n * Open image box\n * @param {HTMLElement} trigger - The trigger element\n */\n open: function (trigger) {\n if (this.isOpen) return;\n\n this.currentTrigger = trigger;\n this.isOpen = true;\n this.initialScrollY = window.scrollY;\n\n // Get image source - support dual images (thumbnail + full-size)\n // data-image-box-full-src takes precedence for the lightbox\n const imgSrc = trigger.dataset.imageBoxFullSrc ||\n trigger.dataset.imageBoxSrc ||\n trigger.src ||\n trigger.href;\n\n if (!imgSrc) {\n console.warn('[Vanduo ImageBox] No image source found for trigger:', trigger);\n return;\n }\n\n // Get caption\n const captionText = trigger.dataset.imageBoxCaption || trigger.alt || '';\n\n // Set image source\n this.img.src = imgSrc;\n this.img.alt = trigger.alt || '';\n\n // Set caption\n if (captionText) {\n this.caption.textContent = captionText;\n this.caption.style.display = 'block';\n } else {\n this.caption.style.display = 'none';\n }\n\n // Calculate scrollbar width and lock body scroll\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.setProperty('--vd-scrollbar-width', `${scrollbarWidth}px`);\n document.body.classList.add('body-image-box-open');\n\n // Show backdrop\n this.backdrop.classList.add('is-visible');\n\n // Focus management\n this.backdrop.focus();\n\n // Dispatch event\n trigger.dispatchEvent(new CustomEvent('imageBox:open', {\n bubbles: true,\n detail: { src: imgSrc }\n }));\n\n // Handle image load\n if (!this.img.complete) {\n this.img.style.opacity = '0';\n this._imgLoadHandler = () => {\n this.img.style.opacity = '';\n };\n this.img.addEventListener('load', this._imgLoadHandler, { once: true });\n }\n },\n\n /**\n * Close image box\n */\n close: function () {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n\n // Hide backdrop\n this.backdrop.classList.remove('is-visible');\n\n // Unlock body scroll\n document.body.classList.remove('body-image-box-open');\n document.body.style.removeProperty('--vd-scrollbar-width');\n\n // Return focus to trigger\n if (this.currentTrigger) {\n this.currentTrigger.focus();\n this.currentTrigger.dispatchEvent(new CustomEvent('imageBox:close', { bubbles: true }));\n this.currentTrigger = null;\n }\n\n // Clear image after transition\n setTimeout(() => {\n if (!this.isOpen) {\n // Clean up load handler if still pending\n if (this._imgLoadHandler) {\n this.img.removeEventListener('load', this._imgLoadHandler);\n this._imgLoadHandler = null;\n }\n this.img.src = '';\n this.img.alt = '';\n }\n }, 300);\n },\n\n /**\n * Reinitialize - useful after dynamic DOM changes\n */\n reinit: function (root) {\n this.bindTriggers(root);\n },\n\n /**\n * Destroy component and clean up\n */\n destroy: function (root) {\n if (root && root !== document) {\n const triggersInRoot = this.getTriggers(root);\n triggersInRoot.forEach(trigger => {\n trigger.classList.remove('vd-image-box-trigger');\n if (trigger._imageBoxCleanup) {\n trigger._imageBoxCleanup();\n delete trigger._imageBoxCleanup;\n }\n delete trigger.dataset.imageBoxInitialized;\n });\n return;\n }\n\n // Close if open\n if (this.isOpen) {\n this.close();\n }\n\n // Remove backdrop\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n\n // Run cleanup functions\n this._cleanupFunctions.forEach(fn => fn());\n this._cleanupFunctions = [];\n\n // Remove trigger bindings\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-image-box-initialized]')\n : document.querySelectorAll('[data-image-box-initialized]');\n triggers.forEach(trigger => {\n trigger.classList.remove('vd-image-box-trigger');\n if (trigger._imageBoxCleanup) {\n trigger._imageBoxCleanup();\n delete trigger._imageBoxCleanup;\n }\n delete trigger.dataset.imageBoxInitialized;\n });\n\n this.backdrop = null;\n this.container = null;\n this.img = null;\n this.closeBtn = null;\n this.caption = null;\n this.currentTrigger = null;\n this.isOpen = false;\n },\n\n destroyAll: function (root) {\n this.destroy(root);\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('imageBox', ImageBox);\n }\n\n // Expose globally\n window.VanduoImageBox = ImageBox;\n\n})();\n", "/**\n * Vanduo Framework - Modals Component\n * JavaScript functionality for modal dialogs\n */\n\n(function () {\n 'use strict';\n\n /**\n * Modals Component\n */\n const Modals = {\n modals: new Map(),\n openModals: [],\n zIndexCounter: 1050,\n __vanduoScopedDestroyAll: true,\n\n // Store trigger cleanup functions\n _triggerCleanups: [],\n // Shared ESC key handler (installed once)\n _sharedEscHandler: null,\n\n getPortalState: function (modal) {\n if (!modal._vdPortalState) {\n modal._vdPortalState = {\n originalParent: null,\n originalNextSibling: null,\n placeholder: null\n };\n }\n return modal._vdPortalState;\n },\n\n portalToBody: function (modal) {\n if (!modal || modal.parentNode === document.body) {\n return;\n }\n\n const state = this.getPortalState(modal);\n state.originalParent = modal.parentNode;\n state.originalNextSibling = modal.nextSibling;\n\n if (!state.placeholder) {\n state.placeholder = document.createComment('vd-modal-placeholder');\n }\n\n state.originalParent.insertBefore(state.placeholder, modal);\n document.body.appendChild(modal);\n modal.dataset.vdPortaled = 'true';\n },\n\n restoreFromPortal: function (modal) {\n if (!modal) {\n return;\n }\n\n const state = this.getPortalState(modal);\n if (!state.placeholder) {\n delete modal.dataset.vdPortaled;\n return;\n }\n\n if (state.placeholder.parentNode) {\n state.placeholder.parentNode.insertBefore(modal, state.placeholder);\n state.placeholder.parentNode.removeChild(state.placeholder);\n } else if (state.originalParent && state.originalParent.isConnected) {\n if (state.originalNextSibling && state.originalNextSibling.parentNode === state.originalParent) {\n state.originalParent.insertBefore(modal, state.originalNextSibling);\n } else {\n state.originalParent.appendChild(modal);\n }\n }\n\n state.originalParent = null;\n state.originalNextSibling = null;\n state.placeholder = null;\n delete modal.dataset.vdPortaled;\n },\n\n /**\n * Initialize modals\n */\n init: function (root) {\n const modals = window.Vanduo.queryAll(root, '.vd-modal');\n\n modals.forEach(modal => {\n if (this.modals.has(modal)) {\n return;\n }\n this.initModal(modal);\n });\n\n // Handle data-modal triggers\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-modal]')\n : document.querySelectorAll('[data-modal]');\n triggers.forEach(trigger => {\n if (trigger.dataset.modalTriggerInitialized) return;\n trigger.dataset.modalTriggerInitialized = 'true';\n\n const triggerClickHandler = (e) => {\n e.preventDefault();\n const modalId = trigger.dataset.modal;\n const modal = document.querySelector(modalId);\n if (modal) {\n this.open(modal);\n }\n };\n trigger.addEventListener('click', triggerClickHandler);\n trigger._modalTriggerCleanup = () => trigger.removeEventListener('click', triggerClickHandler);\n });\n },\n\n /**\n * Initialize a single modal\n * @param {HTMLElement} modal - Modal element\n */\n initModal: function (modal) {\n const backdrop = this.createBackdrop(modal);\n const closeButtons = modal.querySelectorAll('.vd-modal-close, [data-dismiss=\"modal\"]');\n const dialog = modal.querySelector('.vd-modal-dialog');\n\n if (!dialog) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n modal.setAttribute('aria-hidden', 'true');\n\n // Generate ID if not exists\n if (!modal.id) {\n modal.id = 'modal-' + Math.random().toString(36).substr(2, 9);\n }\n\n // Set aria-labelledby\n const title = modal.querySelector('.vd-modal-title');\n if (title && !title.id) {\n title.id = modal.id + '-title';\n modal.setAttribute('aria-labelledby', title.id);\n }\n\n // Close button handlers\n closeButtons.forEach(button => {\n const closeHandler = () => {\n this.close(modal);\n };\n button.addEventListener('click', closeHandler);\n cleanupFunctions.push(() => button.removeEventListener('click', closeHandler));\n });\n\n // Backdrop click handler\n const backdropClickHandler = (e) => {\n if (e.target === backdrop && modal.dataset.backdrop !== 'static') {\n this.close(modal);\n }\n };\n backdrop.addEventListener('click', backdropClickHandler);\n cleanupFunctions.push(() => backdrop.removeEventListener('click', backdropClickHandler));\n\n // ESC key handler \u2014 use a single shared handler instead of one-per-modal\n if (!this._sharedEscHandler) {\n this._sharedEscHandler = (e) => {\n if (e.key === 'Escape' && this.openModals.length > 0) {\n const topModal = this.openModals[this.openModals.length - 1];\n if (topModal.dataset.keyboard !== 'false') {\n this.close(topModal);\n }\n }\n };\n document.addEventListener('keydown', this._sharedEscHandler);\n }\n\n this.modals.set(modal, { backdrop, dialog, trapHandler: null, cleanup: cleanupFunctions });\n },\n\n /**\n * Create backdrop element\n * @param {HTMLElement} modal - Modal element\n * @returns {HTMLElement} Backdrop element\n */\n createBackdrop: function (modal) {\n let backdrop = modal.querySelector('.vd-modal-backdrop');\n\n if (!backdrop) {\n backdrop = document.createElement('div');\n backdrop.className = 'vd-modal-backdrop';\n document.body.appendChild(backdrop);\n }\n\n return backdrop;\n },\n\n /**\n * Open modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n open: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n\n if (!el) {\n console.warn('[Vanduo Modals] Modal element not found:', modal);\n return;\n }\n\n if (!this.modals.has(el)) {\n console.warn('[Vanduo Modals] Modal not initialized:', el);\n return;\n }\n\n const modalData = this.modals.get(el);\n const { backdrop, dialog: _dialog } = modalData;\n\n this.portalToBody(el);\n\n // Increment z-index for stacking\n this.zIndexCounter += 10;\n el.style.zIndex = this.zIndexCounter;\n backdrop.style.zIndex = this.zIndexCounter - 1;\n\n // Add to open modals stack\n this.openModals.push(el);\n\n // Show backdrop\n backdrop.classList.add('is-visible');\n\n // Show modal\n el.classList.add('is-open');\n el.setAttribute('aria-hidden', 'false');\n\n // Lock body scroll\n if (this.openModals.length === 1) {\n document.body.classList.add('body-modal-open');\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n }\n\n // Focus trap (store handler for cleanup)\n const trapHandler = this.trapFocus(el);\n modalData.trapHandler = trapHandler;\n\n // Auto-focus first focusable element\n setTimeout(() => {\n const firstFocusable = this.getFocusableElements(el)[0];\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }, 100);\n\n // Dispatch event\n el.dispatchEvent(new CustomEvent('modal:open', { bubbles: true }));\n },\n\n /**\n * Close modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n close: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n\n if (!el) {\n console.warn('[Vanduo Modals] Modal element not found:', modal);\n return;\n }\n\n if (!this.modals.has(el)) {\n console.warn('[Vanduo Modals] Modal not initialized:', el);\n return;\n }\n\n const modalData = this.modals.get(el);\n const { backdrop, trapHandler } = modalData;\n\n // Remove focus trap event listener to prevent memory leak\n if (trapHandler) {\n el.removeEventListener('keydown', trapHandler);\n modalData.trapHandler = null;\n }\n\n // Remove from open modals stack\n const index = this.openModals.indexOf(el);\n if (index > -1) {\n this.openModals.splice(index, 1);\n }\n\n // Hide modal\n el.classList.remove('is-open');\n el.setAttribute('aria-hidden', 'true');\n\n // Hide backdrop if no other modals open\n if (this.openModals.length === 0) {\n backdrop.classList.remove('is-visible');\n document.body.classList.remove('body-modal-open');\n document.body.style.paddingRight = '';\n // Reset z-index counter to prevent indefinite growth\n this.zIndexCounter = 1050;\n } else {\n // Show backdrop for top modal\n const topModal = this.openModals[this.openModals.length - 1];\n const topBackdrop = this.modals.get(topModal).backdrop;\n topBackdrop.classList.add('is-visible');\n }\n\n // Return focus to trigger\n const trigger = document.querySelector(`[data-modal=\"#${el.id}\"]`);\n if (trigger) {\n trigger.focus();\n }\n\n // Dispatch event\n el.dispatchEvent(new CustomEvent('modal:close', { bubbles: true }));\n\n this.restoreFromPortal(el);\n },\n\n /**\n * Trap focus within modal\n * @param {HTMLElement} modal - Modal element\n * @returns {Function} The trap handler function for cleanup\n */\n trapFocus: function (modal) {\n const self = this;\n\n const trapHandler = function (e) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusableElements = self.getFocusableElements(modal);\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n e.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n modal.addEventListener('keydown', trapHandler);\n return trapHandler;\n },\n\n /**\n * Get focusable elements within modal\n * @param {HTMLElement} modal - Modal element\n * @returns {Array<HTMLElement>} Focusable elements\n */\n getFocusableElements: function (modal) {\n const selector = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(modal.querySelectorAll(selector)).filter(el => {\n return !el.hasAttribute('disabled') &&\n el.offsetWidth > 0 &&\n el.offsetHeight > 0;\n });\n },\n\n /**\n * Toggle modal\n * @param {HTMLElement|string} modal - Modal element or selector\n */\n toggle: function (modal) {\n const el = typeof modal === 'string' ? document.querySelector(modal) : modal;\n if (el) {\n if (el.classList.contains('is-open')) {\n this.close(el);\n } else {\n this.open(el);\n }\n }\n },\n\n /**\n * Destroy a modal instance and clean up event listeners\n * @param {HTMLElement} modal - Modal element\n */\n destroy: function (modal) {\n const modalData = this.modals.get(modal);\n if (!modalData) return;\n\n if (modal.classList.contains('is-open')) {\n const index = this.openModals.indexOf(modal);\n if (index > -1) {\n this.openModals.splice(index, 1);\n }\n modalData.backdrop.classList.remove('is-visible');\n modal.classList.remove('is-open');\n modal.setAttribute('aria-hidden', 'true');\n if (this.openModals.length === 0) {\n document.body.classList.remove('body-modal-open');\n document.body.style.paddingRight = '';\n this.zIndexCounter = 1050;\n }\n }\n\n this.restoreFromPortal(modal);\n\n // Run all cleanup functions\n if (modalData.cleanup) {\n modalData.cleanup.forEach(fn => fn());\n }\n\n // Remove created backdrop\n if (modalData.backdrop && modalData.backdrop.parentNode) {\n modalData.backdrop.parentNode.removeChild(modalData.backdrop);\n }\n\n this.modals.delete(modal);\n },\n\n /**\n * Destroy all modal instances\n */\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.modals.forEach((data, modal) => {\n if (scope === document || scope === modal || (typeof scope.contains === 'function' && scope.contains(modal))) {\n this.destroy(modal);\n }\n });\n\n const triggers = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-modal][data-modal-trigger-initialized]')\n : document.querySelectorAll('[data-modal][data-modal-trigger-initialized]');\n triggers.forEach(trigger => {\n if (trigger._modalTriggerCleanup) {\n trigger._modalTriggerCleanup();\n delete trigger._modalTriggerCleanup;\n }\n delete trigger.dataset.modalTriggerInitialized;\n });\n\n if (scope === document && this._sharedEscHandler) {\n document.removeEventListener('keydown', this._sharedEscHandler);\n this._sharedEscHandler = null;\n }\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('modals', Modals);\n }\n\n // Expose globally\n window.VanduoModals = Modals;\n\n})();\n", "/**\n * Vanduo Framework - Navbar Component\n * JavaScript functionality for navbar mobile menu\n */\n\n(function () {\n 'use strict';\n\n /**\n * Navbar Component\n */\n const Navbar = {\n // Store initialized navbars and their cleanup functions\n instances: new Map(),\n\n /**\n * Get the breakpoint value from CSS variable or use fallback\n * @returns {number} Breakpoint in pixels\n */\n getBreakpoint: function () {\n const root = getComputedStyle(document.documentElement);\n const breakpointValue = root.getPropertyValue('--vd-breakpoint-lg').trim();\n\n // Parse the value (could be \"992px\" or just \"992\")\n const parsed = parseInt(breakpointValue, 10);\n return isNaN(parsed) ? 992 : parsed;\n },\n\n /**\n * Initialize navbar component\n */\n init: function (root) {\n const navbars = window.Vanduo.queryAll(root, '.vd-navbar');\n\n navbars.forEach(navbar => {\n // Skip if already initialized\n if (this.instances.has(navbar)) {\n return;\n }\n this.initNavbar(navbar);\n });\n },\n\n /**\n * Initialize scroll-aware glass/transparent behaviour for a navbar.\n * Adds/removes `.vd-navbar-scrolled` when the page scrolls past a threshold.\n * Threshold: `data-scroll-threshold` attribute (px) or the navbar's own height.\n * @param {HTMLElement} navbar - Navbar element\n * @returns {Function|null} Cleanup function, or null if not applicable\n */\n initScrollWatcher: function (navbar) {\n const isGlass = navbar.classList.contains('vd-navbar-glass');\n const isTransparent = navbar.classList.contains('vd-navbar-transparent');\n\n if (!isGlass && !isTransparent) {\n return null;\n }\n\n const getThreshold = () => {\n const attr = parseInt(navbar.dataset.scrollThreshold, 10);\n return isNaN(attr) ? (navbar.offsetHeight || 60) : attr;\n };\n\n const onScroll = () => {\n const scrolled = window.scrollY > getThreshold();\n navbar.classList.toggle('vd-navbar-scrolled', scrolled);\n };\n\n onScroll(); // set initial state without waiting for first scroll\n window.addEventListener('scroll', onScroll, { passive: true });\n\n return () => window.removeEventListener('scroll', onScroll);\n },\n\n /**\n * Initialize a single navbar\n * @param {HTMLElement} navbar - Navbar element\n */\n initNavbar: function (navbar) {\n const toggle = navbar.querySelector('.vd-navbar-toggle, .vd-navbar-burger');\n const menu = navbar.querySelector('.vd-navbar-menu');\n const overlay = navbar.querySelector('.vd-navbar-overlay') || this.createOverlay(navbar);\n\n // Store cleanup functions for this navbar instance\n const cleanupFunctions = [];\n\n // Wire up scroll-aware glass/transparent behaviour regardless of mobile menu\n const scrollWatcherCleanup = this.initScrollWatcher(navbar);\n if (scrollWatcherCleanup) {\n cleanupFunctions.push(scrollWatcherCleanup);\n }\n\n if (!toggle || !menu) {\n // Still store the instance so scroll-watcher cleanup is tracked\n if (cleanupFunctions.length) {\n this.instances.set(navbar, { toggle: null, menu: null, overlay: null, cleanup: cleanupFunctions });\n }\n return;\n }\n\n // Toggle menu on button click\n const toggleClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleMenu(navbar, toggle, menu, overlay);\n };\n toggle.addEventListener('click', toggleClickHandler);\n cleanupFunctions.push(() => toggle.removeEventListener('click', toggleClickHandler));\n\n // Close menu on overlay click\n if (overlay) {\n const overlayClickHandler = () => {\n this.closeMenu(navbar, toggle, menu, overlay);\n };\n overlay.addEventListener('click', overlayClickHandler);\n cleanupFunctions.push(() => overlay.removeEventListener('click', overlayClickHandler));\n }\n\n // Close menu on escape key\n const keydownHandler = (e) => {\n if (e.key === 'Escape' && menu.classList.contains('is-open')) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n };\n document.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => document.removeEventListener('keydown', keydownHandler));\n\n // Close menu on window resize (if resizing to desktop)\n let resizeTimer;\n const resizeHandler = () => {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n const breakpoint = this.getBreakpoint();\n if (window.innerWidth >= breakpoint && menu.classList.contains('is-open')) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n }, 250);\n };\n window.addEventListener('resize', resizeHandler);\n cleanupFunctions.push(() => {\n clearTimeout(resizeTimer);\n window.removeEventListener('resize', resizeHandler);\n });\n\n // Close menu when clicking outside\n const documentClickHandler = (e) => {\n if (menu.classList.contains('is-open') &&\n !navbar.contains(e.target) &&\n !menu.contains(e.target)) {\n this.closeMenu(navbar, toggle, menu, overlay);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Handle dropdown toggles in mobile menu\n const dropdownToggles = menu.querySelectorAll('.vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link');\n dropdownToggles.forEach(dropdownToggle => {\n const dropdownClickHandler = (e) => {\n const breakpoint = this.getBreakpoint();\n if (window.innerWidth < breakpoint) {\n e.preventDefault();\n const dropdown = dropdownToggle.parentElement;\n const dropdownMenu = dropdown.querySelector('.vd-navbar-dropdown-menu');\n\n if (dropdownMenu) {\n dropdownMenu.classList.toggle('is-open');\n }\n }\n };\n dropdownToggle.addEventListener('click', dropdownClickHandler);\n cleanupFunctions.push(() => dropdownToggle.removeEventListener('click', dropdownClickHandler));\n });\n\n // Store instance with cleanup functions\n this.instances.set(navbar, {\n toggle,\n menu,\n overlay,\n cleanup: cleanupFunctions\n });\n },\n\n /**\n * Destroy a navbar instance and clean up event listeners\n * @param {HTMLElement} navbar - Navbar element\n */\n destroy: function (navbar) {\n const instance = this.instances.get(navbar);\n if (!instance) {\n return;\n }\n\n // Run all cleanup functions\n instance.cleanup.forEach(fn => fn());\n\n // Remove created overlay if it exists\n if (instance.overlay && instance.overlay.parentNode) {\n instance.overlay.parentNode.removeChild(instance.overlay);\n }\n\n // Remove from instances map\n this.instances.delete(navbar);\n },\n\n /**\n * Destroy all navbar instances\n */\n destroyAll: function () {\n this.instances.forEach((instance, navbar) => {\n this.destroy(navbar);\n });\n },\n\n /**\n * Toggle mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n toggleMenu: function (navbar, toggle, menu, overlay) {\n const isOpen = menu.classList.contains('is-open');\n\n if (isOpen) {\n this.closeMenu(navbar, toggle, menu, overlay);\n } else {\n this.openMenu(navbar, toggle, menu, overlay);\n }\n },\n\n /**\n * Open mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n openMenu: function (navbar, toggle, menu, overlay) {\n menu.classList.add('is-open');\n toggle.classList.add('is-active');\n\n if (overlay) {\n overlay.classList.add('is-active');\n }\n\n // Prevent body scroll when menu is open (use class to avoid conflicts with modals)\n document.body.classList.add('body-navbar-open');\n\n // Set ARIA attributes\n toggle.setAttribute('aria-expanded', 'true');\n menu.setAttribute('aria-hidden', 'false');\n },\n\n /**\n * Close mobile menu\n * @param {HTMLElement} navbar - Navbar element\n * @param {HTMLElement} toggle - Toggle button\n * @param {HTMLElement} menu - Menu element\n * @param {HTMLElement} overlay - Overlay element\n */\n closeMenu: function (navbar, toggle, menu, overlay) {\n menu.classList.remove('is-open');\n toggle.classList.remove('is-active');\n\n if (overlay) {\n overlay.classList.remove('is-active');\n }\n\n // Restore body scroll\n document.body.classList.remove('body-navbar-open');\n\n // Close all dropdown menus\n const dropdownMenus = menu.querySelectorAll('.vd-navbar-dropdown-menu.is-open');\n dropdownMenus.forEach(dropdownMenu => {\n dropdownMenu.classList.remove('is-open');\n });\n\n // Set ARIA attributes\n toggle.setAttribute('aria-expanded', 'false');\n menu.setAttribute('aria-hidden', 'true');\n },\n\n /**\n * Create overlay element if it doesn't exist\n * @param {HTMLElement} navbar - Navbar element\n * @returns {HTMLElement} Overlay element\n */\n createOverlay: function (_navbar) {\n const overlay = document.createElement('div');\n overlay.className = 'vd-navbar-overlay';\n document.body.appendChild(overlay);\n return overlay;\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('navbar', Navbar);\n }\n\n // Expose globally\n window.VanduoNavbar = Navbar;\n\n})();\n", "/**\n * Vanduo Framework - Pagination Component\n * JavaScript functionality for dynamic pagination\n */\n\n(function() {\n 'use strict';\n\n /**\n * Pagination Component\n */\n const Pagination = {\n // Store initialized paginations and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize pagination components\n */\n init: function(root) {\n const paginations = window.Vanduo.queryAll(root, '.vd-pagination[data-pagination]');\n\n paginations.forEach(pagination => {\n if (this.instances.has(pagination)) {\n return;\n }\n this.initPagination(pagination);\n });\n },\n\n /**\n * Initialize a pagination\n * @param {HTMLElement} pagination - Pagination container\n */\n initPagination: function(pagination) {\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n const maxVisible = parseInt(pagination.dataset.maxVisible) || 7;\n\n this.render(pagination, {\n totalPages: totalPages,\n currentPage: currentPage,\n maxVisible: maxVisible\n });\n\n // Handle clicks (event delegation)\n const clickHandler = (e) => {\n const link = e.target.closest('.vd-pagination-link');\n if (!link || link.closest('.vd-pagination-item.disabled') || link.closest('.vd-pagination-item.active')) {\n return;\n }\n\n e.preventDefault();\n\n const item = link.closest('.vd-pagination-item');\n const page = item.dataset.page;\n\n if (page) {\n this.goToPage(pagination, parseInt(page));\n } else if (item.classList.contains('pagination-prev')) {\n this.prevPage(pagination);\n } else if (item.classList.contains('pagination-next')) {\n this.nextPage(pagination);\n }\n };\n pagination.addEventListener('click', clickHandler);\n\n this.instances.set(pagination, {\n cleanup: [() => pagination.removeEventListener('click', clickHandler)]\n });\n },\n \n /**\n * Render pagination\n * @param {HTMLElement} pagination - Pagination container\n * @param {Object} options - Pagination options\n */\n render: function(pagination, options) {\n const { totalPages, currentPage, maxVisible } = options;\n \n if (totalPages <= 1) {\n pagination.innerHTML = '';\n return;\n }\n \n let html = '';\n \n // Previous button\n html += `<li class=\"vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${currentPage === 1 ? 'disabled' : ''}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Previous\">Previous</a>`;\n html += `</li>`;\n \n // Calculate page range\n const pages = this.calculatePages(currentPage, totalPages, maxVisible);\n \n // Page numbers\n let lastPage = 0;\n pages.forEach(page => {\n if (page === 'ellipsis') {\n html += `<li class=\"vd-pagination-item pagination-item\"><span class=\"vd-pagination-ellipsis pagination-ellipsis\">\u2026</span></li>`;\n } else {\n if (page !== lastPage + 1 && lastPage > 0) {\n html += `<li class=\"vd-pagination-item pagination-item\"><span class=\"vd-pagination-ellipsis pagination-ellipsis\">\u2026</span></li>`;\n }\n const safePage = Number(page);\n html += `<li class=\"vd-pagination-item pagination-item ${safePage === currentPage ? 'active' : ''}\" data-page=\"${safePage}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Page ${safePage}\">${safePage}</a>`;\n html += `</li>`;\n lastPage = page;\n }\n });\n \n // Next button\n html += `<li class=\"vd-pagination-item vd-pagination-next pagination-item pagination-next ${currentPage === totalPages ? 'disabled' : ''}\">`;\n html += `<a class=\"vd-pagination-link pagination-link\" href=\"#\" aria-label=\"Next\">Next</a>`;\n html += `</li>`;\n \n pagination.innerHTML = html;\n \n // Update data attributes\n pagination.dataset.currentPage = currentPage;\n },\n \n /**\n * Calculate which pages to show\n * @param {number} currentPage - Current page\n * @param {number} totalPages - Total pages\n * @param {number} maxVisible - Maximum visible pages\n * @returns {Array} Array of page numbers or 'ellipsis'\n */\n calculatePages: function(currentPage, totalPages, maxVisible) {\n const pages = [];\n const half = Math.floor(maxVisible / 2);\n \n if (totalPages <= maxVisible) {\n // Show all pages\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n \n let start = Math.max(2, currentPage - half);\n let end = Math.min(totalPages - 1, currentPage + half);\n \n // Adjust if we're near the start\n if (currentPage <= half + 1) {\n end = Math.min(totalPages - 1, maxVisible - 1);\n }\n \n // Adjust if we're near the end\n if (currentPage >= totalPages - half) {\n start = Math.max(2, totalPages - maxVisible + 2);\n }\n \n // Add ellipsis before if needed\n if (start > 2) {\n pages.push('ellipsis');\n }\n \n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n \n // Add ellipsis after if needed\n if (end < totalPages - 1) {\n pages.push('ellipsis');\n }\n \n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n \n return pages;\n },\n \n /**\n * Go to specific page\n * @param {HTMLElement} pagination - Pagination container\n * @param {number} page - Page number\n */\n goToPage: function(pagination, page) {\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n const maxVisible = parseInt(pagination.dataset.maxVisible) || 7;\n \n if (page < 1 || page > totalPages) {\n return;\n }\n \n this.render(pagination, {\n totalPages: totalPages,\n currentPage: page,\n maxVisible: maxVisible\n });\n \n // Dispatch event\n pagination.dispatchEvent(new CustomEvent('pagination:change', {\n bubbles: true,\n detail: { page, totalPages }\n }));\n },\n \n /**\n * Go to previous page\n * @param {HTMLElement} pagination - Pagination container\n */\n prevPage: function(pagination) {\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n if (currentPage > 1) {\n this.goToPage(pagination, currentPage - 1);\n }\n },\n \n /**\n * Go to next page\n * @param {HTMLElement} pagination - Pagination container\n */\n nextPage: function(pagination) {\n const currentPage = parseInt(pagination.dataset.currentPage) || 1;\n const totalPages = parseInt(pagination.dataset.totalPages) || 1;\n if (currentPage < totalPages) {\n this.goToPage(pagination, currentPage + 1);\n }\n },\n \n /**\n * Update pagination\n * @param {HTMLElement|string} pagination - Pagination container or selector\n * @param {Object} options - Pagination options\n */\n update: function(pagination, options) {\n const el = typeof pagination === 'string' ? document.querySelector(pagination) : pagination;\n if (el) {\n if (options.totalPages !== undefined) {\n el.dataset.totalPages = options.totalPages;\n }\n if (options.currentPage !== undefined) {\n el.dataset.currentPage = options.currentPage;\n }\n if (options.maxVisible !== undefined) {\n el.dataset.maxVisible = options.maxVisible;\n }\n \n this.render(el, {\n totalPages: parseInt(el.dataset.totalPages) || 1,\n currentPage: parseInt(el.dataset.currentPage) || 1,\n maxVisible: parseInt(el.dataset.maxVisible) || 7\n });\n }\n },\n\n /**\n * Destroy a pagination instance and clean up event listeners\n * @param {HTMLElement} pagination - Pagination container\n */\n destroy: function(pagination) {\n const instance = this.instances.get(pagination);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(pagination);\n },\n\n /**\n * Destroy all pagination instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, pagination) => {\n this.destroy(pagination);\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('pagination', Pagination);\n }\n \n // Expose globally\n window.VanduoPagination = Pagination;\n \n})();\n", "/**\n * Vanduo Framework - Parallax Component\n * JavaScript functionality for parallax scroll effects\n */\n\n(function () {\n 'use strict';\n\n /**\n * Parallax Component\n */\n const Parallax = {\n parallaxElements: new Map(),\n ticking: false,\n isMobile: window.innerWidth < 768,\n reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n isInitialized: false,\n _onScroll: null,\n _onResize: null,\n\n /**\n * Initialize parallax components\n */\n init: function (root) {\n // Check for reduced motion preference\n if (this.reducedMotion) {\n return; // Don't initialize if user prefers reduced motion\n }\n\n const parallaxElements = window.Vanduo.queryAll(root, '.vd-parallax');\n\n parallaxElements.forEach(element => {\n if (!element.dataset.parallaxInitialized) {\n this.initParallax(element);\n }\n });\n\n if (this.isInitialized) {\n this.refresh();\n return;\n }\n\n this.isInitialized = true;\n\n // Handle scroll\n this.handleScroll();\n this._onScroll = () => {\n this.handleScroll();\n };\n window.addEventListener('scroll', this._onScroll, { passive: true });\n\n // Handle resize\n this._onResize = () => {\n this.isMobile = window.innerWidth < 768;\n this.updateAll();\n };\n window.addEventListener('resize', this._onResize);\n },\n\n /**\n * Initialize a parallax element\n * @param {HTMLElement} element - Parallax container\n */\n initParallax: function (element) {\n element.dataset.parallaxInitialized = 'true';\n\n // Check if disabled on mobile\n const disableMobile = element.classList.contains('parallax-disable-mobile');\n if (disableMobile && this.isMobile) {\n return;\n }\n\n const layers = element.querySelectorAll('.vd-parallax-layer, .vd-parallax-bg');\n const speed = this.getSpeed(element);\n const direction = element.classList.contains('parallax-horizontal') ? 'horizontal' : 'vertical';\n\n this.parallaxElements.set(element, {\n layers: Array.from(layers),\n speed: speed,\n direction: direction,\n disableMobile: disableMobile\n });\n\n // Initial update\n this.updateParallax(element);\n },\n\n /**\n * Get parallax speed from element\n * @param {HTMLElement} element - Parallax element\n * @returns {number} Speed multiplier\n */\n getSpeed: function (element) {\n if (element.classList.contains('parallax-slow')) {\n return 0.5;\n } else if (element.classList.contains('parallax-fast')) {\n return 1.5;\n }\n return 1; // Default medium speed\n },\n\n /**\n * Handle scroll event\n */\n handleScroll: function () {\n if (!this.ticking) {\n window.requestAnimationFrame(() => {\n this.updateAll();\n this.ticking = false;\n });\n this.ticking = true;\n }\n },\n\n /**\n * Update all parallax elements\n */\n updateAll: function () {\n this.parallaxElements.forEach((config, element) => {\n // Skip if disabled on mobile\n if (config.disableMobile && this.isMobile) {\n return;\n }\n\n this.updateParallax(element);\n });\n },\n\n /**\n * Update parallax for a single element\n * @param {HTMLElement} element - Parallax element\n */\n updateParallax: function (element) {\n const config = this.parallaxElements.get(element);\n if (!config) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const elementTop = rect.top;\n const elementHeight = rect.height;\n\n // Calculate scroll progress (0 to 1)\n const scrollProgress = Math.max(0, Math.min(1,\n (windowHeight - elementTop) / (windowHeight + elementHeight)\n ));\n\n // Calculate offset based on speed and direction\n const offset = (scrollProgress - 0.5) * config.speed * 100;\n\n config.layers.forEach((layer, _index) => {\n // Different layers can have different speeds\n const layerSpeed = layer.dataset.parallaxSpeed ? parseFloat(layer.dataset.parallaxSpeed) : 1;\n const layerOffset = offset * layerSpeed;\n\n if (config.direction === 'horizontal') {\n layer.style.transform = `translateX(${layerOffset}px)`;\n } else {\n layer.style.transform = `translateY(${layerOffset}px)`;\n }\n });\n },\n\n /**\n * Destroy parallax element\n * @param {HTMLElement|string} element - Parallax element or selector\n */\n destroy: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.parallaxElements.has(el)) {\n const config = this.parallaxElements.get(el);\n config.layers.forEach(layer => {\n layer.style.transform = '';\n });\n this.parallaxElements.delete(el);\n }\n },\n\n /**\n * Refresh parallax (recalculate positions)\n */\n refresh: function () {\n this.updateAll();\n },\n\n destroyAll: function () {\n this.parallaxElements.forEach((_config, element) => {\n this.destroy(element);\n });\n this.parallaxElements.clear();\n\n if (this._onScroll) {\n window.removeEventListener('scroll', this._onScroll);\n this._onScroll = null;\n }\n\n if (this._onResize) {\n window.removeEventListener('resize', this._onResize);\n this._onResize = null;\n }\n\n this.isInitialized = false;\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('parallax', Parallax);\n }\n\n // Expose globally\n window.VanduoParallax = Parallax;\n\n})();\n", "/**\n * Vanduo Framework - Preloader Component\n * JavaScript functionality for progress bars and loaders\n */\n\n(function() {\n 'use strict';\n\n /**\n * Preloader Component\n */\n const Preloader = {\n getProgressBars: function(root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '.vd-progress-bar[data-progress], .progress-bar[data-progress]');\n }\n\n return Array.from(document.querySelectorAll('.vd-progress-bar[data-progress], .progress-bar[data-progress]'));\n },\n\n /**\n * Initialize preloader components\n */\n init: function(root) {\n const progressBars = this.getProgressBars(root);\n \n progressBars.forEach(bar => {\n if (!bar.dataset.progressInitialized) {\n this.initProgressBar(bar);\n }\n });\n },\n \n /**\n * Initialize a progress bar\n * @param {HTMLElement} bar - Progress bar element\n */\n initProgressBar: function(bar) {\n bar.dataset.progressInitialized = 'true';\n \n const initialValue = parseInt(bar.dataset.progress) || 0;\n this.setProgress(bar, initialValue, false);\n },\n \n /**\n * Set progress value\n * @param {HTMLElement|string} bar - Progress bar element or selector\n * @param {number} value - Progress value (0-100)\n * @param {boolean} animate - Whether to animate\n */\n setProgress: function(bar, value, animate = true) {\n const el = typeof bar === 'string' ? document.querySelector(bar) : bar;\n \n if (!el) {\n return;\n }\n \n // Clamp value between 0 and 100\n value = Math.max(0, Math.min(100, value));\n \n // Update width\n if (animate) {\n el.style.transition = 'width var(--vd-transition-duration-slow) var(--vd-transition-ease)';\n } else {\n el.style.transition = 'none';\n setTimeout(() => {\n el.style.transition = '';\n }, 0);\n }\n \n el.style.width = value + '%';\n el.setAttribute('aria-valuenow', value);\n el.setAttribute('aria-valuemin', 0);\n el.setAttribute('aria-valuemax', 100);\n \n // Update text if exists\n const text = el.querySelector('.vd-progress-text, .progress-text');\n if (text) {\n text.textContent = value + '%';\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('progress:update', {\n bubbles: true,\n detail: { value, max: 100 }\n }));\n \n // Complete event\n if (value >= 100) {\n el.dispatchEvent(new CustomEvent('progress:complete', {\n bubbles: true,\n detail: { value, max: 100 }\n }));\n }\n },\n \n /**\n * Animate progress from current to target\n * @param {HTMLElement|string} bar - Progress bar element or selector\n * @param {number} targetValue - Target progress value (0-100)\n * @param {number} duration - Animation duration in ms\n */\n animateProgress: function(bar, targetValue, duration = 1000) {\n const el = typeof bar === 'string' ? document.querySelector(bar) : bar;\n \n if (!el) {\n return;\n }\n \n const startValue = parseInt(el.style.width) || 0;\n const difference = targetValue - startValue;\n const startTime = performance.now();\n \n const animate = (currentTime) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n \n // Easing function (ease-out)\n const easeOut = 1 - Math.pow(1 - progress, 3);\n const currentValue = startValue + (difference * easeOut);\n \n this.setProgress(el, currentValue, false);\n \n if (progress < 1) {\n requestAnimationFrame(animate);\n }\n };\n \n requestAnimationFrame(animate);\n },\n \n /**\n * Show preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n show: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n el.style.display = 'inline-block';\n el.setAttribute('aria-hidden', 'false');\n }\n },\n \n /**\n * Hide preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n hide: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n },\n \n /**\n * Toggle preloader\n * @param {HTMLElement|string} preloader - Preloader element or selector\n */\n toggle: function(preloader) {\n const el = typeof preloader === 'string' ? document.querySelector(preloader) : preloader;\n if (el) {\n if (el.style.display === 'none' || el.getAttribute('aria-hidden') === 'true') {\n this.show(el);\n } else {\n this.hide(el);\n }\n }\n },\n\n /**\n * Destroy all progress bar instances\n */\n destroyAll: function(root) {\n const progressBars = this.getProgressBars(root || document).filter(function(bar) {\n return bar.dataset.progressInitialized === 'true';\n });\n progressBars.forEach(bar => {\n delete bar.dataset.progressInitialized;\n });\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('preloader', Preloader);\n }\n \n // Expose globally\n window.VanduoPreloader = Preloader;\n \n})();\n", "/**\n * Vanduo Framework - Select Component\n * Custom select dropdown with enhanced functionality\n */\n\n(function () {\n 'use strict';\n\n /**\n * Select Component\n */\n const Select = {\n // Store initialized selects and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize select components\n */\n init: function (root) {\n const selects = window.Vanduo.queryAll(root, 'select.vd-custom-select-input, select[data-custom-select]');\n\n selects.forEach(select => {\n if (this.instances.has(select)) {\n return;\n }\n this.initSelect(select);\n });\n },\n\n /**\n * Initialize a single select\n * @param {HTMLSelectElement} select - Select element\n */\n initSelect: function (select) {\n // Skip if already has custom wrapper\n if (select.closest('.vd-custom-select-wrapper')) {\n return;\n }\n\n const cleanupFunctions = [];\n\n // Create wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'custom-select-wrapper';\n select.parentNode.insertBefore(wrapper, select);\n wrapper.appendChild(select);\n\n // Create custom button\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'custom-select-button';\n button.setAttribute('aria-haspopup', 'listbox');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-labelledby', select.id || this.generateId(select));\n\n // Create dropdown\n const dropdown = document.createElement('div');\n dropdown.className = 'custom-select-dropdown';\n dropdown.setAttribute('role', 'listbox');\n\n // Create search input if searchable\n if (select.dataset.searchable === 'true') {\n const searchWrapper = document.createElement('div');\n searchWrapper.className = 'custom-select-search';\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.className = 'input input-sm';\n searchInput.placeholder = 'Search...';\n searchInput.setAttribute('aria-label', 'Search options');\n searchWrapper.appendChild(searchInput);\n dropdown.appendChild(searchWrapper);\n\n const filterFn = (e) => {\n this.filterOptions(dropdown, e.target.value);\n };\n const searchHandler = typeof debounce === 'function' ? debounce(filterFn, 150) : filterFn;\n searchInput.addEventListener('input', searchHandler);\n cleanupFunctions.push(() => searchInput.removeEventListener('input', searchHandler));\n }\n\n // Build options\n this.buildOptions(select, dropdown, button);\n\n wrapper.appendChild(button);\n wrapper.appendChild(dropdown);\n\n // Update button text\n this.updateButtonText(select, button);\n\n // Event listeners\n const buttonClickHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggleDropdown(button, dropdown);\n };\n button.addEventListener('click', buttonClickHandler);\n cleanupFunctions.push(() => button.removeEventListener('click', buttonClickHandler));\n\n // Close on outside click\n const documentClickHandler = (e) => {\n if (!wrapper.contains(e.target) && dropdown.classList.contains('is-open')) {\n this.closeDropdown(button, dropdown);\n }\n };\n document.addEventListener('click', documentClickHandler);\n cleanupFunctions.push(() => document.removeEventListener('click', documentClickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, select, button, dropdown);\n };\n button.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => button.removeEventListener('keydown', keydownHandler));\n\n // Update on select change\n const changeHandler = () => {\n this.updateButtonText(select, button);\n this.updateSelectedOptions(select, dropdown);\n };\n select.addEventListener('change', changeHandler);\n cleanupFunctions.push(() => select.removeEventListener('change', changeHandler));\n\n this.instances.set(select, { wrapper, button, dropdown, cleanup: cleanupFunctions, typeaheadBuffer: '', typeaheadTimer: null });\n },\n\n /**\n * Build options in dropdown\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {HTMLElement} button - Button element\n */\n buildOptions: function (select, dropdown, button) {\n const options = select.querySelectorAll('option');\n const fragment = document.createDocumentFragment();\n\n options.forEach((option, index) => {\n if (option.parentElement.tagName === 'OPTGROUP') {\n // Handle option groups\n const group = option.parentElement;\n if (!dropdown.querySelector(`[data-group=\"${group.label}\"]`)) {\n const groupElement = document.createElement('div');\n groupElement.className = 'custom-select-option-group';\n groupElement.textContent = group.label;\n groupElement.dataset.group = group.label;\n fragment.appendChild(groupElement);\n }\n }\n\n if (option.value === '' && !option.textContent.trim()) {\n return; // Skip empty options\n }\n\n const optionElement = document.createElement('div');\n optionElement.className = 'custom-select-option';\n optionElement.textContent = option.textContent;\n optionElement.setAttribute('role', 'option');\n optionElement.setAttribute('data-value', option.value);\n optionElement.setAttribute('data-index', index);\n\n if (option.selected) {\n optionElement.classList.add('is-selected');\n optionElement.setAttribute('aria-selected', 'true');\n }\n\n if (option.disabled) {\n optionElement.classList.add('is-disabled');\n optionElement.setAttribute('aria-disabled', 'true');\n }\n\n optionElement.addEventListener('click', (_e) => {\n if (!option.disabled) {\n this.selectOption(select, option, optionElement, button, dropdown);\n }\n });\n\n fragment.appendChild(optionElement);\n });\n\n dropdown.appendChild(fragment);\n },\n\n /**\n * Select an option\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLOptionElement} option - Option element\n * @param {HTMLElement} optionElement - Custom option element\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n selectOption: function (select, option, optionElement, button, dropdown) {\n if (select.multiple) {\n // Multi-select\n option.selected = !option.selected;\n optionElement.classList.toggle('is-selected');\n optionElement.setAttribute('aria-selected', option.selected);\n } else {\n // Single select\n select.value = option.value;\n select.dispatchEvent(new Event('change', { bubbles: true }));\n this.closeDropdown(button, dropdown);\n }\n\n this.updateButtonText(select, button);\n },\n\n /**\n * Update button text\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} button - Button element\n */\n updateButtonText: function (select, button) {\n if (select.multiple) {\n const selected = Array.from(select.selectedOptions);\n if (selected.length === 0) {\n button.textContent = select.dataset.placeholder || 'Select options...';\n } else if (selected.length === 1) {\n button.textContent = selected[0].textContent;\n } else {\n button.textContent = `${selected.length} selected`;\n }\n } else {\n const selectedOption = select.options[select.selectedIndex];\n button.textContent = selectedOption ? selectedOption.textContent : (select.dataset.placeholder || 'Select...');\n }\n },\n\n /**\n * Update selected options in dropdown\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n updateSelectedOptions: function (select, dropdown) {\n const options = dropdown.querySelectorAll('.custom-select-option');\n const selectedValues = Array.from(select.selectedOptions).map(opt => opt.value);\n\n options.forEach(optionEl => {\n const value = optionEl.dataset.value;\n if (selectedValues.includes(value)) {\n optionEl.classList.add('is-selected');\n optionEl.setAttribute('aria-selected', 'true');\n } else {\n optionEl.classList.remove('is-selected');\n optionEl.setAttribute('aria-selected', 'false');\n }\n });\n },\n\n /**\n * Toggle dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n toggleDropdown: function (button, dropdown) {\n const isOpen = dropdown.classList.contains('is-open');\n\n if (isOpen) {\n this.closeDropdown(button, dropdown);\n } else {\n this.openDropdown(button, dropdown);\n }\n },\n\n /**\n * Open dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n openDropdown: function (button, dropdown) {\n dropdown.classList.add('is-open');\n button.setAttribute('aria-expanded', 'true');\n\n // Focus first option\n const firstOption = dropdown.querySelector('.custom-select-option:not(.is-disabled)');\n if (firstOption) {\n firstOption.focus();\n }\n },\n\n /**\n * Close dropdown\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n closeDropdown: function (button, dropdown) {\n dropdown.classList.remove('is-open');\n button.setAttribute('aria-expanded', 'false');\n },\n\n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLSelectElement} select - Select element\n * @param {HTMLElement} button - Button element\n * @param {HTMLElement} dropdown - Dropdown container\n */\n handleKeydown: function (e, select, button, dropdown) {\n const isOpen = dropdown.classList.contains('is-open');\n const options = Array.from(dropdown.querySelectorAll('.custom-select-option:not(.is-disabled)'));\n const currentIndex = options.findIndex(opt => opt === document.activeElement);\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && currentIndex >= 0) {\n const optionEl = options[currentIndex];\n const option = select.options[parseInt(optionEl.dataset.index)];\n this.selectOption(select, option, optionEl, button, dropdown);\n } else {\n this.openDropdown(button, dropdown);\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n this.closeDropdown(button, dropdown);\n button.focus();\n }\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n this.openDropdown(button, dropdown);\n } else {\n const nextIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n options[nextIndex].focus();\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen) {\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n options[prevIndex].focus();\n }\n break;\n\n case 'Home':\n if (isOpen) {\n e.preventDefault();\n options[0].focus();\n }\n break;\n\n case 'End':\n if (isOpen) {\n e.preventDefault();\n options[options.length - 1].focus();\n }\n break;\n\n default:\n // Typeahead: jump to matching option when typing printable characters\n if (isOpen && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n // Per-instance typeahead state to avoid cross-instance corruption\n const instance = this.instances.get(select);\n if (!instance) break;\n clearTimeout(instance.typeaheadTimer);\n instance.typeaheadBuffer += e.key.toLowerCase();\n\n const match = options.find(opt =>\n opt.textContent.trim().toLowerCase().startsWith(instance.typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n instance.typeaheadTimer = setTimeout(() => {\n instance.typeaheadBuffer = '';\n }, 500);\n }\n break;\n }\n },\n\n /**\n * Filter options by search term\n * @param {HTMLElement} dropdown - Dropdown container\n * @param {string} searchTerm - Search term\n */\n filterOptions: function (dropdown, searchTerm) {\n const options = dropdown.querySelectorAll('.vd-custom-select-option');\n const term = searchTerm.toLowerCase();\n\n options.forEach(option => {\n const text = option.textContent.toLowerCase();\n if (text.includes(term)) {\n option.style.display = 'block';\n } else {\n option.style.display = 'none';\n }\n });\n },\n\n /**\n * Generate unique ID\n * @param {HTMLElement} element - Element\n * @returns {string} Generated ID\n */\n generateId: function (element) {\n if (element.id) {\n return element.id;\n }\n const id = 'select-' + Math.random().toString(36).substr(2, 9);\n element.id = id;\n return id;\n },\n\n /**\n * Destroy a select instance and clean up event listeners\n * @param {HTMLSelectElement} select - Select element\n */\n destroy: function (select) {\n const instance = this.instances.get(select);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n\n // Unwrap the select element back to its original parent\n if (instance.wrapper && instance.wrapper.parentNode) {\n instance.wrapper.parentNode.insertBefore(select, instance.wrapper);\n instance.wrapper.parentNode.removeChild(instance.wrapper);\n }\n\n this.instances.delete(select);\n },\n\n /**\n * Destroy all select instances\n */\n destroyAll: function () {\n this.instances.forEach((instance, select) => {\n this.destroy(select);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('select', Select);\n }\n\n})();\n", "/**\n * Vanduo Framework - Sidenav Component\n * JavaScript functionality for side navigation drawer\n */\n\n(function() {\n 'use strict';\n\n /**\n * Sidenav Component\n */\n const Sidenav = {\n sidenavs: new Map(),\n breakpoint: 992, // Desktop breakpoint\n restoreDelayMs: 450,\n __vanduoScopedDestroyAll: true,\n \n // Global cleanup functions (toggles, resize)\n _globalCleanups: [],\n _resizeCleanup: null,\n\n isFixedVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-fixed') || sidenav.classList.contains('sidenav-fixed');\n },\n\n isPushVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-push') || sidenav.classList.contains('sidenav-push');\n },\n\n isRightVariant: function(sidenav) {\n return sidenav.classList.contains('vd-sidenav-right') || sidenav.classList.contains('sidenav-right');\n },\n\n getPortalState: function(sidenav) {\n if (!sidenav._vdPortalState) {\n sidenav._vdPortalState = {\n originalParent: null,\n originalNextSibling: null,\n placeholder: null,\n restoreTimer: null,\n restoreHandler: null\n };\n }\n return sidenav._vdPortalState;\n },\n\n cancelScheduledRestore: function(sidenav) {\n const state = this.getPortalState(sidenav);\n\n if (state.restoreHandler) {\n sidenav.removeEventListener('transitionend', state.restoreHandler);\n state.restoreHandler = null;\n }\n\n if (state.restoreTimer) {\n window.clearTimeout(state.restoreTimer);\n state.restoreTimer = null;\n }\n },\n\n portalToBody: function(sidenav) {\n if (!sidenav) {\n return;\n }\n\n if (sidenav.parentNode === document.body) {\n this.cancelScheduledRestore(sidenav);\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n state.originalParent = sidenav.parentNode;\n state.originalNextSibling = sidenav.nextSibling;\n\n if (!state.placeholder) {\n state.placeholder = document.createComment('vd-sidenav-placeholder');\n }\n\n state.originalParent.insertBefore(state.placeholder, sidenav);\n document.body.appendChild(sidenav);\n sidenav.dataset.vdPortaled = 'true';\n },\n\n restoreFromPortal: function(sidenav) {\n if (!sidenav) {\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n if (!state.placeholder) {\n delete sidenav.dataset.vdPortaled;\n return;\n }\n\n if (state.placeholder.parentNode) {\n state.placeholder.parentNode.insertBefore(sidenav, state.placeholder);\n state.placeholder.parentNode.removeChild(state.placeholder);\n } else if (state.originalParent && state.originalParent.isConnected) {\n if (state.originalNextSibling && state.originalNextSibling.parentNode === state.originalParent) {\n state.originalParent.insertBefore(sidenav, state.originalNextSibling);\n } else {\n state.originalParent.appendChild(sidenav);\n }\n }\n\n state.originalParent = null;\n state.originalNextSibling = null;\n state.placeholder = null;\n delete sidenav.dataset.vdPortaled;\n },\n\n scheduleRestoreFromPortal: function(sidenav) {\n if (!sidenav || sidenav.parentNode !== document.body) {\n return;\n }\n\n const state = this.getPortalState(sidenav);\n this.cancelScheduledRestore(sidenav);\n\n const finalizeRestore = () => {\n this.restoreFromPortal(sidenav);\n };\n\n const transitionEndHandler = (event) => {\n if (event.target !== sidenav || event.propertyName !== 'transform') {\n return;\n }\n finalizeRestore();\n };\n\n state.restoreHandler = transitionEndHandler;\n sidenav.addEventListener('transitionend', transitionEndHandler);\n state.restoreTimer = window.setTimeout(() => {\n finalizeRestore();\n }, this.restoreDelayMs);\n },\n\n /**\n * Initialize sidenav components\n */\n init: function(root) {\n const sidenavs = window.Vanduo.queryAll(root, '.vd-sidenav, .vd-offcanvas');\n\n sidenavs.forEach(sidenav => {\n if (this.sidenavs.has(sidenav)) {\n return;\n }\n this.initSidenav(sidenav);\n });\n\n // Handle toggle buttons\n const toggles = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(root, '[data-sidenav-toggle]')\n : document.querySelectorAll('[data-sidenav-toggle]');\n toggles.forEach(toggle => {\n if (toggle.dataset.sidenavToggleInitialized) return;\n toggle.dataset.sidenavToggleInitialized = 'true';\n\n const toggleClickHandler = (e) => {\n e.preventDefault();\n const targetId = toggle.dataset.sidenavToggle;\n const sidenav = document.querySelector(targetId);\n if (sidenav) {\n this.toggle(sidenav);\n }\n };\n toggle.addEventListener('click', toggleClickHandler);\n toggle._sidenavToggleCleanup = () => toggle.removeEventListener('click', toggleClickHandler);\n });\n\n // Handle responsive behavior\n this.handleResize();\n if (!this._resizeCleanup) {\n const resizeHandler = () => {\n this.handleResize();\n };\n window.addEventListener('resize', resizeHandler);\n this._resizeCleanup = () => window.removeEventListener('resize', resizeHandler);\n }\n },\n\n /**\n * Initialize a single sidenav\n * @param {HTMLElement} sidenav - Sidenav element\n */\n initSidenav: function(sidenav) {\n // Apply data-vd-position direction class if specified\n const position = sidenav.getAttribute('data-vd-position');\n if (position) {\n const prefix = sidenav.classList.contains('vd-offcanvas') ? 'vd-offcanvas' : 'vd-sidenav';\n sidenav.classList.add(prefix + '-' + position);\n }\n\n const overlay = this.createOverlay(sidenav);\n const closeButton = sidenav.querySelector('.vd-sidenav-close, .vd-offcanvas-close');\n const cleanupFunctions = [];\n\n // Set ARIA attributes\n sidenav.setAttribute('role', 'navigation');\n sidenav.setAttribute('aria-hidden', 'true');\n\n // Close button handler\n if (closeButton) {\n const closeHandler = () => {\n this.close(sidenav);\n };\n closeButton.addEventListener('click', closeHandler);\n cleanupFunctions.push(() => closeButton.removeEventListener('click', closeHandler));\n }\n\n // Overlay click handler\n const overlayClickHandler = () => {\n if (sidenav.dataset.backdrop !== 'static') {\n this.close(sidenav);\n }\n };\n overlay.addEventListener('click', overlayClickHandler);\n cleanupFunctions.push(() => overlay.removeEventListener('click', overlayClickHandler));\n\n // ESC key handler\n const escKeyHandler = (e) => {\n if (e.key === 'Escape' && sidenav.classList.contains('is-open')) {\n if (sidenav.dataset.keyboard !== 'false') {\n this.close(sidenav);\n }\n }\n };\n document.addEventListener('keydown', escKeyHandler);\n cleanupFunctions.push(() => document.removeEventListener('keydown', escKeyHandler));\n\n this.sidenavs.set(sidenav, { overlay, cleanup: cleanupFunctions });\n },\n \n /**\n * Create overlay element\n * @param {HTMLElement} sidenav - Sidenav element\n * @returns {HTMLElement} Overlay element\n */\n createOverlay: function(sidenav) {\n let overlay = sidenav.querySelector('.vd-sidenav-overlay');\n \n if (!overlay) {\n overlay = document.createElement('div');\n overlay.className = 'vd-sidenav-overlay';\n document.body.appendChild(overlay);\n }\n \n return overlay;\n },\n \n /**\n * Open sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n open: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n \n if (!el || !this.sidenavs.has(el)) {\n return;\n }\n \n const { overlay } = this.sidenavs.get(el);\n\n this.portalToBody(el);\n \n // Show overlay (if not fixed)\n if (!this.isFixedVariant(el)) {\n overlay.classList.add('is-visible');\n }\n \n // Open sidenav\n el.classList.add('is-open');\n el.setAttribute('aria-hidden', 'false');\n \n // Lock body scroll\n document.body.classList.add('body-sidenav-open');\n \n // Handle push variant\n if (this.isPushVariant(el)) {\n this.handlePushVariant(el, true);\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('sidenav:open', { bubbles: true }));\n },\n \n /**\n * Close sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n close: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n \n if (!el || !this.sidenavs.has(el)) {\n return;\n }\n \n const { overlay } = this.sidenavs.get(el);\n \n // Hide overlay\n overlay.classList.remove('is-visible');\n \n // Close sidenav\n el.classList.remove('is-open');\n el.setAttribute('aria-hidden', 'true');\n \n // Unlock body scroll\n document.body.classList.remove('body-sidenav-open');\n \n // Handle push variant\n if (this.isPushVariant(el)) {\n this.handlePushVariant(el, false);\n }\n \n // Dispatch event\n el.dispatchEvent(new CustomEvent('sidenav:close', { bubbles: true }));\n\n this.scheduleRestoreFromPortal(el);\n },\n \n /**\n * Toggle sidenav\n * @param {HTMLElement|string} sidenav - Sidenav element or selector\n */\n toggle: function(sidenav) {\n const el = typeof sidenav === 'string' ? document.querySelector(sidenav) : sidenav;\n if (el) {\n if (el.classList.contains('is-open')) {\n this.close(el);\n } else {\n this.open(el);\n }\n }\n },\n \n /**\n * Handle push variant\n * @param {HTMLElement} sidenav - Sidenav element\n * @param {boolean} isOpen - Whether sidenav is open\n */\n handlePushVariant: function(sidenav, isOpen) {\n // Find the main content wrapper\n const content = document.querySelector('main, .main-content, .content, [role=\"main\"]') || document.body;\n \n if (isOpen) {\n if (window.innerWidth >= this.breakpoint) {\n if (this.isRightVariant(sidenav)) {\n content.style.marginRight = sidenav.offsetWidth + 'px';\n } else {\n content.style.marginLeft = sidenav.offsetWidth + 'px';\n }\n }\n } else {\n content.style.marginLeft = '';\n content.style.marginRight = '';\n }\n },\n \n /**\n * Handle window resize\n */\n handleResize: function() {\n this.sidenavs.forEach(({ overlay }, sidenav) => {\n // Close overlay sidenavs on resize to desktop if they're open\n if (window.innerWidth >= this.breakpoint) {\n if (this.isFixedVariant(sidenav) && !sidenav.classList.contains('is-open')) {\n // Fixed sidenavs should be visible on desktop\n sidenav.classList.add('is-open');\n sidenav.setAttribute('aria-hidden', 'false');\n overlay.classList.remove('is-visible');\n }\n } else {\n // On mobile, fixed sidenavs become overlay\n if (this.isFixedVariant(sidenav) && sidenav.classList.contains('is-open')) {\n this.close(sidenav);\n }\n }\n });\n },\n\n /**\n * Destroy a sidenav instance and clean up event listeners\n * @param {HTMLElement} sidenav - Sidenav element\n */\n destroy: function(sidenav) {\n const data = this.sidenavs.get(sidenav);\n if (!data) return;\n\n if (sidenav.classList.contains('is-open')) {\n data.overlay.classList.remove('is-visible');\n sidenav.classList.remove('is-open');\n sidenav.setAttribute('aria-hidden', 'true');\n document.body.classList.remove('body-sidenav-open');\n }\n\n this.restoreFromPortal(sidenav);\n\n data.cleanup.forEach(fn => fn());\n\n // Remove created overlay\n if (data.overlay && data.overlay.parentNode) {\n data.overlay.parentNode.removeChild(data.overlay);\n }\n\n this.sidenavs.delete(sidenav);\n },\n\n /**\n * Destroy all sidenav instances\n */\n destroyAll: function(root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : (root || document);\n\n this.sidenavs.forEach((data, sidenav) => {\n if (scope === document || scope === sidenav || (typeof scope.contains === 'function' && scope.contains(sidenav))) {\n this.destroy(sidenav);\n }\n });\n\n const toggles = window.Vanduo && typeof window.Vanduo.queryAll === 'function'\n ? window.Vanduo.queryAll(scope, '[data-sidenav-toggle][data-sidenav-toggle-initialized]')\n : document.querySelectorAll('[data-sidenav-toggle][data-sidenav-toggle-initialized]');\n toggles.forEach(toggle => {\n if (toggle._sidenavToggleCleanup) {\n toggle._sidenavToggleCleanup();\n delete toggle._sidenavToggleCleanup;\n }\n delete toggle.dataset.sidenavToggleInitialized;\n });\n\n if (scope === document) {\n if (this._resizeCleanup) {\n this._resizeCleanup();\n this._resizeCleanup = null;\n }\n this._globalCleanups.forEach(fn => fn());\n this._globalCleanups = [];\n }\n }\n };\n \n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('sidenav', Sidenav);\n }\n \n // Expose globally\n window.VanduoSidenav = Sidenav;\n \n})();\n", "/**\n * Vanduo Framework - Tabs Component\n * Tabbed content navigation with keyboard support\n */\n\n(function() {\n 'use strict';\n\n /**\n * Tabs Component\n */\n const Tabs = {\n // Store initialized tab containers and their cleanup functions\n instances: new Map(),\n\n /**\n * Initialize all tab components\n */\n init: function(root) {\n const tabContainers = window.Vanduo.queryAll(root, '.vd-tabs, [data-tabs]');\n\n tabContainers.forEach(container => {\n if (this.instances.has(container)) {\n return;\n }\n this.initTabs(container);\n });\n },\n\n /**\n * Initialize a single tab container\n * @param {HTMLElement} container - Tabs container element\n */\n initTabs: function(container) {\n const tabList = container.querySelector('.vd-tab-list, [role=\"tablist\"]');\n const tabLinks = container.querySelectorAll('.vd-tab-link, [data-tab]');\n const tabPanes = container.querySelectorAll('.vd-tab-pane, [data-tab-pane]');\n\n if (!tabList || tabLinks.length === 0) return;\n\n const cleanupFunctions = [];\n\n // Set up ARIA attributes\n tabList.setAttribute('role', 'tablist');\n\n tabLinks.forEach((link, index) => {\n const tabId = this.getTabId(link, index);\n const pane = this.findPane(container, tabId, tabPanes);\n\n // Set up tab attributes\n link.setAttribute('role', 'tab');\n link.setAttribute('aria-selected', link.classList.contains('is-active') ? 'true' : 'false');\n link.setAttribute('tabindex', link.classList.contains('is-active') ? '0' : '-1');\n\n if (!link.id) {\n link.id = `tab-btn-${tabId}`;\n }\n\n // Set up pane attributes\n if (pane) {\n pane.setAttribute('role', 'tabpanel');\n pane.setAttribute('aria-labelledby', link.id);\n if (!pane.id) {\n pane.id = `tab-pane-${tabId}`;\n }\n link.setAttribute('aria-controls', pane.id);\n }\n\n // Click handler\n const clickHandler = (e) => {\n e.preventDefault();\n if (!link.classList.contains('disabled') && !link.disabled) {\n this.activateTab(container, link, tabLinks, tabPanes);\n }\n };\n link.addEventListener('click', clickHandler);\n cleanupFunctions.push(() => link.removeEventListener('click', clickHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, container, link, tabLinks, tabPanes);\n };\n link.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => link.removeEventListener('keydown', keydownHandler));\n });\n\n // Ensure one tab is active\n const activeTab = container.querySelector('.vd-tab-link.is-active, [data-tab].is-active');\n if (!activeTab && tabLinks.length > 0) {\n this.activateTab(container, tabLinks[0], tabLinks, tabPanes);\n }\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n\n /**\n * Get the pane identifier associated with a tab link.\n * @param {HTMLElement} link - Tab link element\n * @param {number} [fallbackIndex] - Optional fallback index\n * @returns {string} Tab identifier\n */\n getTabId: function(link, fallbackIndex) {\n return link.dataset.tabTarget\n || link.dataset.tab\n || link.getAttribute('href')?.replace('#', '')\n || (typeof fallbackIndex === 'number' ? `tab-${fallbackIndex}` : link.id);\n },\n\n /**\n * Find the pane associated with a tab\n * @param {HTMLElement} container - Tabs container\n * @param {string} tabId - Tab identifier\n * @param {NodeList} tabPanes - All tab panes\n * @returns {HTMLElement|null} The matching pane\n */\n findPane: function(container, tabId, tabPanes) {\n // Try data attribute first\n let pane = container.querySelector(`[data-tab-pane=\"${tabId}\"]`);\n\n // Try ID\n if (!pane) {\n pane = container.querySelector(`#${tabId}`);\n }\n\n // Try matching by index\n if (!pane) {\n const tabLinks = container.querySelectorAll('.vd-tab-link, [data-tab]');\n tabLinks.forEach((link, index) => {\n const linkTabId = this.getTabId(link, index);\n if (linkTabId === tabId && tabPanes[index]) {\n pane = tabPanes[index];\n }\n });\n }\n\n return pane;\n },\n\n /**\n * Activate a tab\n * @param {HTMLElement} container - Tabs container\n * @param {HTMLElement} tab - Tab to activate\n * @param {NodeList} allTabs - All tab links\n * @param {NodeList} allPanes - All tab panes\n */\n activateTab: function(container, tab, allTabs, allPanes) {\n const tabIndex = Array.from(allTabs).indexOf(tab);\n const tabId = this.getTabId(tab, tabIndex);\n\n // Deactivate all tabs\n allTabs.forEach(t => {\n t.classList.remove('is-active');\n t.setAttribute('aria-selected', 'false');\n t.setAttribute('tabindex', '-1');\n\n // Also handle parent li if exists\n if (t.parentElement && t.parentElement.classList.contains('tab-item')) {\n t.parentElement.classList.remove('is-active');\n }\n });\n\n // Hide all panes\n allPanes.forEach(p => {\n p.classList.remove('is-active');\n });\n\n // Activate selected tab\n tab.classList.add('is-active');\n tab.setAttribute('aria-selected', 'true');\n tab.setAttribute('tabindex', '0');\n\n // Also handle parent li if exists\n if (tab.parentElement && tab.parentElement.classList.contains('tab-item')) {\n tab.parentElement.classList.add('is-active');\n }\n\n // Show corresponding pane\n const pane = this.findPane(container, tabId, allPanes);\n if (pane) {\n pane.classList.add('is-active');\n }\n\n // Dispatch custom event\n const event = new CustomEvent('tab:change', {\n bubbles: true,\n detail: {\n tab: tab,\n pane: pane,\n tabId: tabId\n }\n });\n container.dispatchEvent(event);\n },\n\n /**\n * Handle keyboard navigation\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} container - Tabs container\n * @param {HTMLElement} currentTab - Currently focused tab\n * @param {NodeList} allTabs - All tab links\n * @param {NodeList} allPanes - All tab panes\n */\n handleKeydown: function(e, container, currentTab, allTabs, allPanes) {\n const isVertical = container.classList.contains('vd-tabs-vertical') || container.classList.contains('tabs-vertical');\n const tabs = Array.from(allTabs).filter(t => !t.classList.contains('disabled') && !t.disabled);\n const currentIndex = tabs.indexOf(currentTab);\n\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n if (!isVertical) {\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;\n }\n break;\n\n case 'ArrowRight':\n if (!isVertical) {\n e.preventDefault();\n newIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;\n }\n break;\n\n case 'ArrowUp':\n if (isVertical) {\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;\n }\n break;\n\n case 'ArrowDown':\n if (isVertical) {\n e.preventDefault();\n newIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;\n }\n break;\n\n case 'Home':\n e.preventDefault();\n newIndex = 0;\n break;\n\n case 'End':\n e.preventDefault();\n newIndex = tabs.length - 1;\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.activateTab(container, currentTab, allTabs, allPanes);\n return;\n\n default:\n return;\n }\n\n // Focus and activate new tab\n if (newIndex !== currentIndex) {\n tabs[newIndex].focus();\n this.activateTab(container, tabs[newIndex], allTabs, allPanes);\n }\n },\n\n /**\n * Programmatically show a tab\n * @param {string|HTMLElement} tab - Tab identifier or element\n */\n show: function(tab) {\n let tabElement;\n\n if (typeof tab === 'string') {\n tabElement = document.querySelector(`[data-tab-target=\"${tab}\"], [data-tab=\"${tab}\"], [href=\"#${tab}\"]`);\n } else {\n tabElement = tab;\n }\n\n if (!tabElement) return;\n\n const container = tabElement.closest('.vd-tabs, [data-tabs]');\n if (!container) return;\n\n const allTabs = container.querySelectorAll('.vd-tab-link, [data-tab]');\n const allPanes = container.querySelectorAll('.vd-tab-pane, [data-tab-pane]');\n\n this.activateTab(container, tabElement, allTabs, allPanes);\n },\n\n /**\n * Destroy a tabs instance and clean up event listeners\n * @param {HTMLElement} container - Tabs container\n */\n destroy: function(container) {\n const instance = this.instances.get(container);\n if (!instance) return;\n\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(container);\n },\n\n /**\n * Destroy all tabs instances\n */\n destroyAll: function() {\n this.instances.forEach((instance, container) => {\n this.destroy(container);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tabs', Tabs);\n }\n\n})();\n", "/**\n * Vanduo Framework - Theme Customizer\n * A comprehensive theme customization component for the navbar\n * Handles primary color, neutral color, radius, font, and color mode\n */\n\n(function () {\n 'use strict';\n\n const ThemeCustomizer = {\n // Storage keys\n STORAGE_KEYS: {\n PRIMARY: 'vanduo-primary-color',\n NEUTRAL: 'vanduo-neutral-color',\n RADIUS: 'vanduo-radius',\n FONT: 'vanduo-font-preference',\n THEME: 'vanduo-theme-preference'\n },\n\n // Default values\n DEFAULTS: {\n PRIMARY_LIGHT: 'black',\n PRIMARY_DARK: 'amber',\n NEUTRAL: 'charcoal',\n RADIUS: '0.5',\n FONT: 'ubuntu',\n THEME: 'system'\n },\n\n // Primary color definitions (Open Color based)\n PRIMARY_COLORS: {\n 'black': { name: 'Black', color: '#000000' },\n 'red': { name: 'Red', color: '#fa5252' },\n 'orange': { name: 'Orange', color: '#fd7e14' },\n 'amber': { name: 'Amber', color: '#f59f00' },\n 'yellow': { name: 'Yellow', color: '#fcc419' },\n 'lime': { name: 'Lime', color: '#82c91e' },\n 'green': { name: 'Green', color: '#40c057' },\n 'emerald': { name: 'Emerald', color: '#20c997' },\n 'teal': { name: 'Teal', color: '#12b886' },\n 'cyan': { name: 'Cyan', color: '#22b8cf' },\n 'sky': { name: 'Sky', color: '#3bc9db' },\n 'blue': { name: 'Blue', color: '#228be6' },\n 'indigo': { name: 'Indigo', color: '#4c6ef5' },\n 'violet': { name: 'Violet', color: '#7950f2' },\n 'purple': { name: 'Purple', color: '#be4bdb' },\n 'fuchsia': { name: 'Fuchsia', color: '#f06595' },\n 'pink': { name: 'Pink', color: '#e64980' },\n 'rose': { name: 'Rose', color: '#ff8787' }\n },\n\n // Neutral color definitions\n NEUTRAL_COLORS: {\n 'charcoal': { name: 'Charcoal', color: '#0d1117' },\n 'slate': { name: 'Slate', color: '#64748b' },\n 'gray': { name: 'Gray', color: '#6b7280' },\n 'zinc': { name: 'Zinc', color: '#71717a' },\n 'neutral': { name: 'Neutral', color: '#737373' },\n 'stone': { name: 'Stone', color: '#78716c' }\n },\n\n // Radius options\n RADIUS_OPTIONS: ['0', '0.125', '0.25', '0.375', '0.5'],\n\n // Font options\n FONT_OPTIONS: {\n 'jetbrains-mono': { name: 'JetBrains Mono', family: \"'JetBrains Mono', monospace\" },\n 'system': { name: 'System Default', family: null },\n 'ubuntu': { name: 'Ubuntu', family: \"'Ubuntu', sans-serif\" },\n 'lato': { name: 'Lato', family: \"'Lato', sans-serif\" },\n 'open-sans': { name: 'Open Sans', family: \"'Open Sans', sans-serif\" }\n },\n\n // Theme mode options\n THEME_MODES: ['system', 'dark', 'light'],\n\n // State\n state: {\n primary: null,\n neutral: null,\n radius: null,\n font: null,\n theme: null,\n isOpen: false\n },\n\n isInitialized: false,\n _cleanup: [],\n _ownsDynamicPanel: false,\n\n // DOM references\n elements: {\n customizer: null,\n trigger: null,\n activeTrigger: null,\n triggers: [],\n panel: null,\n overlay: null\n },\n\n isRoot: function (root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n },\n\n normalizeRoot: function (root) {\n return this.isRoot(root) ? root : document;\n },\n\n queryAll: function (root, selector) {\n const scope = this.normalizeRoot(root);\n if (typeof window.VanduoLifecycle !== 'undefined' && typeof window.VanduoLifecycle.queryAll === 'function') {\n return window.VanduoLifecycle.queryAll(scope, selector);\n }\n\n const matches = [];\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n return matches;\n },\n\n queryOne: function (root, selector) {\n const matches = this.queryAll(root, selector);\n return matches.length ? matches[0] : null;\n },\n\n getTriggers: function (root) {\n return this.queryAll(root, '[data-theme-customizer-trigger]');\n },\n\n pruneTriggers: function () {\n this.elements.triggers = this.elements.triggers.filter(function (trigger) {\n return trigger && trigger.isConnected;\n });\n\n if (this.elements.trigger && !this.elements.trigger.isConnected) {\n this.elements.trigger = null;\n }\n\n if (this.elements.activeTrigger && !this.elements.activeTrigger.isConnected) {\n this.elements.activeTrigger = null;\n }\n },\n\n /**\n * Initialize the Theme Customizer\n */\n init: function (root) {\n const scope = this.normalizeRoot(root);\n\n if (this.isInitialized) {\n this.bindExistingElements(scope);\n this.bindTriggerEvents(scope);\n this.bindPanelEvents();\n this.updateUI();\n return;\n }\n\n this.isInitialized = true;\n this._cleanup = [];\n\n this.loadPreferences();\n this.applyAllPreferences();\n this.bindExistingElements(scope);\n this.bindEvents(scope);\n },\n\n addListener: function (target, event, handler, options) {\n if (!target) return;\n target.addEventListener(event, handler, options);\n this._cleanup.push(() => target.removeEventListener(event, handler, options));\n },\n\n /**\n * Get default primary color based on theme\n */\n getDefaultPrimary: function (theme) {\n if (theme === 'system') {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return this.DEFAULTS.PRIMARY_DARK;\n }\n return this.DEFAULTS.PRIMARY_LIGHT;\n }\n return theme === 'dark' ? this.DEFAULTS.PRIMARY_DARK : this.DEFAULTS.PRIMARY_LIGHT;\n },\n\n /**\n * Load preferences from localStorage\n */\n loadPreferences: function () {\n this.state.theme = this.getStorageValue(this.STORAGE_KEYS.THEME, this.DEFAULTS.THEME);\n this.state.primary = this.getStorageValue(this.STORAGE_KEYS.PRIMARY, this.getDefaultPrimary(this.state.theme));\n this._normalizeDefaultPrimaryIfStaleWithStoredTheme();\n this.state.neutral = this.getStorageValue(this.STORAGE_KEYS.NEUTRAL, this.DEFAULTS.NEUTRAL);\n this.state.radius = this.getStorageValue(this.STORAGE_KEYS.RADIUS, this.DEFAULTS.RADIUS);\n this.state.font = this.getStorageValue(this.STORAGE_KEYS.FONT, this.DEFAULTS.FONT);\n },\n\n /**\n * Save a preference to localStorage\n */\n savePreference: function (key, value) {\n this.setStorageValue(key, value);\n },\n\n /**\n * Apply all preferences\n */\n applyAllPreferences: function () {\n this.applyPrimary(this.state.primary);\n this.applyNeutral(this.state.neutral);\n this.applyRadius(this.state.radius);\n this.applyFont(this.state.font);\n this.applyTheme(this.state.theme);\n },\n\n /**\n * Apply primary color\n */\n applyPrimary: function (colorKey) {\n if (!this.PRIMARY_COLORS[colorKey]) {\n colorKey = this.getDefaultPrimary(this.state.theme);\n }\n\n this.state.primary = colorKey;\n document.documentElement.setAttribute('data-primary', colorKey);\n this.savePreference(this.STORAGE_KEYS.PRIMARY, colorKey);\n\n this.dispatchEvent('primary-change', { color: colorKey });\n },\n\n /**\n * Apply neutral color\n */\n applyNeutral: function (neutralKey) {\n if (!this.NEUTRAL_COLORS[neutralKey]) {\n neutralKey = this.DEFAULTS.NEUTRAL;\n }\n\n this.state.neutral = neutralKey;\n document.documentElement.setAttribute('data-neutral', neutralKey);\n this.savePreference(this.STORAGE_KEYS.NEUTRAL, neutralKey);\n\n this.dispatchEvent('neutral-change', { neutral: neutralKey });\n },\n\n /**\n * Apply border radius\n */\n applyRadius: function (radius) {\n if (!this.RADIUS_OPTIONS.includes(radius)) {\n radius = this.DEFAULTS.RADIUS;\n }\n\n this.state.radius = radius;\n document.documentElement.setAttribute('data-radius', radius);\n document.documentElement.style.setProperty('--vd-radius-scale', radius);\n this.savePreference(this.STORAGE_KEYS.RADIUS, radius);\n\n this.dispatchEvent('radius-change', { radius: radius });\n },\n\n /**\n * Apply font family\n */\n applyFont: function (fontKey) {\n if (!this.FONT_OPTIONS[fontKey]) {\n fontKey = this.DEFAULTS.FONT;\n }\n\n this.state.font = fontKey;\n\n if (fontKey === 'system') {\n document.documentElement.removeAttribute('data-font');\n } else {\n document.documentElement.setAttribute('data-font', fontKey);\n }\n\n this.savePreference(this.STORAGE_KEYS.FONT, fontKey);\n\n // Also update the existing FontSwitcher if available\n if (window.FontSwitcher && window.FontSwitcher.setPreference) {\n window.FontSwitcher.state.preference = fontKey;\n window.FontSwitcher.applyFont();\n }\n\n this.dispatchEvent('font-change', { font: fontKey });\n },\n\n /**\n * Apply theme mode\n */\n applyTheme: function (mode) {\n if (!this.THEME_MODES.includes(mode)) {\n mode = this.DEFAULTS.THEME;\n }\n\n // Prevent circular updates\n this._isApplying = true;\n\n // Re-align black/amber when they don't match the effective primary for the target mode.\n // Covers theme toggles and stale localStorage (e.g. amber saved while theme is light).\n if (this.isUsingDefaultPrimary()) {\n const expected = this.getDefaultPrimary(mode);\n if (this.state.primary !== expected) {\n this.applyPrimary(expected);\n }\n }\n\n this.state.theme = mode;\n\n if (mode === 'system') {\n document.documentElement.removeAttribute('data-theme');\n } else {\n document.documentElement.setAttribute('data-theme', mode);\n }\n\n this.savePreference(this.STORAGE_KEYS.THEME, mode);\n\n // Also update the existing ThemeSwitcher if available\n // Only update state, don't call setPreference to avoid circular calls\n if (window.Vanduo && window.Vanduo.components.themeSwitcher) {\n const themeSwitcher = window.Vanduo.components.themeSwitcher;\n if (themeSwitcher.state && themeSwitcher.state.preference !== mode) {\n themeSwitcher.state.preference = mode;\n if (typeof themeSwitcher.setStorageValue === 'function') {\n themeSwitcher.setStorageValue(themeSwitcher.STORAGE_KEY, mode);\n }\n if (typeof themeSwitcher.updateUI === 'function') {\n themeSwitcher.updateUI();\n }\n }\n }\n\n this._isApplying = false;\n this.dispatchEvent('mode-change', { mode: mode });\n },\n\n /**\n * Dispatch custom event\n */\n dispatchEvent: function (type, detail) {\n const event = new CustomEvent('theme:' + type, {\n bubbles: true,\n detail: detail\n });\n document.dispatchEvent(event);\n\n // Also dispatch a general change event\n const changeEvent = new CustomEvent('theme:change', {\n bubbles: true,\n detail: {\n type: type,\n value: detail[Object.keys(detail)[0]],\n state: { ...this.state }\n }\n });\n document.dispatchEvent(changeEvent);\n },\n\n /**\n * Bind to existing DOM elements or create them dynamically\n */\n bindExistingElements: function (root) {\n const scope = this.normalizeRoot(root);\n this.pruneTriggers();\n\n const scopedTriggers = this.getTriggers(scope);\n scopedTriggers.forEach((trigger) => {\n if (!this.elements.triggers.includes(trigger)) {\n this.elements.triggers.push(trigger);\n }\n });\n\n if (!this.elements.trigger && this.elements.triggers.length) {\n this.elements.trigger = this.elements.triggers[0];\n }\n\n const existingCustomizer = this.queryOne(scope, '.vd-theme-customizer')\n || (this.elements.customizer && typeof this.elements.customizer.contains === 'function' ? this.elements.customizer : null)\n || document.querySelector('.vd-theme-customizer');\n\n if (existingCustomizer instanceof Element) {\n this.elements.customizer = existingCustomizer;\n this.elements.trigger = this.elements.customizer.querySelector('.vd-theme-customizer-trigger') || this.elements.trigger;\n this.elements.panel = this.elements.customizer.querySelector('.vd-theme-customizer-panel');\n this.elements.overlay = this.elements.customizer.querySelector('.vd-theme-customizer-overlay');\n } else {\n // Look for standalone trigger buttons with data attribute\n if (scopedTriggers.length && !this.elements.panel) {\n this.createDynamicPanel();\n }\n }\n\n // Update UI to reflect current state\n this.updateUI();\n },\n\n /**\n * Create the panel dynamically when only a trigger button exists\n */\n createDynamicPanel: function () {\n if (!this.elements.triggers.length || (this.elements.panel && this.elements.panel.isConnected)) {\n return;\n }\n this.elements.trigger = this.elements.triggers[0];\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.className = 'vd-theme-customizer-overlay';\n\n // Create panel\n const panel = document.createElement('div');\n panel.className = 'vd-theme-customizer-panel';\n panel.innerHTML = this.getPanelHTML();\n\n // Append to body\n document.body.appendChild(overlay);\n document.body.appendChild(panel);\n\n // Store references\n this.elements.panel = panel;\n this.elements.overlay = overlay;\n this._ownsDynamicPanel = true;\n this.elements.customizer = {\n contains: (el) => panel.contains(el) || this.elements.triggers.some((trigger) => trigger.contains(el))\n };\n\n // Position panel below trigger on desktop\n this.positionPanel();\n\n // Bind panel events after creation\n this.bindPanelEvents();\n\n // Reposition on resize\n this.addListener(window, 'resize', () => this.positionPanel());\n },\n\n /**\n * Position the panel below the trigger button on desktop\n */\n positionPanel: function () {\n if (!this.elements.panel || !this.elements.trigger) return;\n const anchorTrigger = this.elements.activeTrigger || this.elements.trigger;\n\n const isMobile = window.innerWidth < 768;\n\n if (isMobile) {\n // Mobile: full height slide-in from right - let CSS handle it\n this.elements.panel.style.top = '';\n this.elements.panel.style.right = '';\n this.elements.panel.style.left = '';\n this.elements.panel.style.height = '';\n this.elements.panel.style.maxHeight = '';\n } else {\n // Desktop: position directly below the trigger button, aligned to its right edge\n const triggerRect = anchorTrigger.getBoundingClientRect();\n const panelWidth = 320; // --vd-customizer-width\n const panelTop = triggerRect.bottom + 8;\n\n // Calculate right position: align panel's right edge with trigger's right edge\n // But ensure it doesn't overflow the viewport\n const viewportWidth = window.innerWidth;\n let panelRight = viewportWidth - triggerRect.right;\n\n // Ensure panel doesn't overflow left side of viewport\n const panelLeft = viewportWidth - panelRight - panelWidth;\n if (panelLeft < 8) {\n panelRight = viewportWidth - panelWidth - 8;\n }\n\n this.elements.panel.style.top = panelTop + 'px';\n this.elements.panel.style.right = panelRight + 'px';\n this.elements.panel.style.left = '';\n this.elements.panel.style.height = 'auto';\n this.elements.panel.style.maxHeight = 'calc(100vh - ' + panelTop + 'px)';\n }\n },\n\n /**\n * Bind events specifically for the panel (called after dynamic creation)\n */\n bindPanelEvents: function () {\n if (!this.elements.panel) return;\n if (this.elements.panel.getAttribute('data-customizer-initialized') === 'true') return;\n\n this.elements.panel.setAttribute('data-customizer-initialized', 'true');\n\n // Primary color swatches\n this.elements.panel.querySelectorAll('[data-color]').forEach(swatch => {\n this.addListener(swatch, 'click', () => {\n this.applyPrimary(swatch.dataset.color);\n this.updateUI();\n });\n });\n\n // Neutral color swatches\n this.elements.panel.querySelectorAll('[data-neutral]').forEach(swatch => {\n this.addListener(swatch, 'click', () => {\n this.applyNeutral(swatch.dataset.neutral);\n this.updateUI();\n });\n });\n\n // Radius buttons\n this.elements.panel.querySelectorAll('[data-radius]').forEach(btn => {\n this.addListener(btn, 'click', () => {\n this.applyRadius(btn.dataset.radius);\n this.updateUI();\n });\n });\n\n // Font selector\n const fontSelect = this.elements.panel.querySelector('[data-customizer-font]');\n if (fontSelect) {\n this.addListener(fontSelect, 'change', (e) => {\n this.applyFont(e.target.value);\n this.updateUI();\n });\n }\n\n // Reset button\n const resetBtn = this.elements.panel.querySelector('.customizer-reset');\n if (resetBtn) {\n this.addListener(resetBtn, 'click', () => {\n this.reset();\n });\n }\n\n // Mobile close button\n const closeBtn = this.elements.panel.querySelector('.customizer-mobile-close');\n if (closeBtn) {\n this.addListener(closeBtn, 'click', () => {\n this.close();\n });\n }\n\n // Overlay click\n if (this.elements.overlay) {\n this.addListener(this.elements.overlay, 'click', () => {\n this.close();\n });\n }\n },\n\n /**\n * Generate panel HTML\n */\n getPanelHTML: function () {\n const esc = typeof escapeHtml === 'function'\n ? escapeHtml\n : function (text) {\n const div = document.createElement('div');\n div.textContent = String(text ?? '');\n return div.innerHTML;\n };\n const safeColor = function (value) {\n const normalized = String(value ?? '').trim();\n // Allow common color formats used by palette values.\n if (/^(#[0-9a-fA-F]{3,8}|rgb[a]?\\([^)]{1,60}\\)|hsl[a]?\\([^)]{1,60}\\)|var\\(--[a-zA-Z0-9_-]{1,40}\\))$/.test(normalized)) {\n return normalized;\n }\n return '#000000';\n };\n\n // Generate primary color swatches\n let primarySwatches = '';\n for (const [key, value] of Object.entries(this.PRIMARY_COLORS)) {\n primarySwatches += `<button class=\"tc-color-swatch${key === this.state.primary ? ' is-active' : ''}\" data-color=\"${esc(key)}\" style=\"--vd-swatch-color: ${safeColor(value.color)}\" title=\"${esc(value.name)}\"></button>`;\n }\n\n // Generate neutral color swatches\n let neutralSwatches = '';\n for (const [key, value] of Object.entries(this.NEUTRAL_COLORS)) {\n neutralSwatches += `<button class=\"tc-neutral-swatch${key === this.state.neutral ? ' is-active' : ''}\" data-neutral=\"${esc(key)}\" style=\"--vd-swatch-color: ${safeColor(value.color)}\" title=\"${esc(value.name)}\"><span>${esc(value.name)}</span></button>`;\n }\n\n // Generate radius buttons\n let radiusButtons = '';\n this.RADIUS_OPTIONS.forEach(r => {\n radiusButtons += `<button class=\"tc-radius-btn${r === this.state.radius ? ' is-active' : ''}\" data-radius=\"${esc(r)}\">${esc(r)}</button>`;\n });\n\n // Generate font options\n let fontOptions = '';\n for (const [key, value] of Object.entries(this.FONT_OPTIONS)) {\n fontOptions += `<option value=\"${esc(key)}\"${key === this.state.font ? ' selected' : ''}>${esc(value.name)}</option>`;\n }\n\n return `\n <div class=\"tc-header\">\n <h3 class=\"tc-title\">Customize Theme</h3>\n <button class=\"customizer-mobile-close\" aria-label=\"Close\">\n <i class=\"ph ph-x\"></i>\n </button>\n </div>\n <div class=\"tc-body\">\n\n <div class=\"tc-section\">\n <label class=\"tc-label\">Primary Color</label>\n <div class=\"tc-color-grid\">\n ${primarySwatches}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Neutral Color</label>\n <div class=\"tc-neutral-grid\">\n ${neutralSwatches}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Border Radius</label>\n <div class=\"tc-radius-group\">\n ${radiusButtons}\n </div>\n </div>\n <div class=\"tc-section\">\n <label class=\"tc-label\">Font Family</label>\n <select class=\"tc-font-select\" data-customizer-font>\n ${fontOptions}\n </select>\n </div>\n </div>\n <div class=\"tc-footer\">\n <button class=\"customizer-reset btn btn-sm btn-outline\">Reset to Defaults</button>\n </div>\n `;\n },\n\n /**\n * Bind event listeners\n */\n /**\n * Check whether the current primary color is one of the auto-defaults\n * (i.e. the user hasn't explicitly picked a non-default color).\n */\n isUsingDefaultPrimary: function () {\n return this.state.primary === this.DEFAULTS.PRIMARY_LIGHT ||\n this.state.primary === this.DEFAULTS.PRIMARY_DARK;\n },\n\n /**\n * When primary is still one of the auto-default palette keys (black/amber) but\n * localStorage was written under a different theme (or OS changed in system mode),\n * align in-memory state before applyAllPreferences runs \u2014 avoids amber+light / black+dark drift.\n */\n _normalizeDefaultPrimaryIfStaleWithStoredTheme: function () {\n if (!this.isUsingDefaultPrimary()) {\n return;\n }\n const expected = this.getDefaultPrimary(this.state.theme);\n if (this.state.primary !== expected) {\n this.state.primary = expected;\n }\n },\n\n bindEvents: function (root) {\n this.bindTriggerEvents(root);\n\n this.bindPanelEvents();\n\n // Listen for OS dark/light changes so we can swap the default primary\n if (window.matchMedia) {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => {\n if (this.state.theme === 'system' && this.isUsingDefaultPrimary()) {\n const newDefault = this.getDefaultPrimary('system');\n if (newDefault !== this.state.primary) {\n this.applyPrimary(newDefault);\n this.updateUI();\n }\n }\n };\n mq.addEventListener('change', handler);\n this._cleanup.push(() => mq.removeEventListener('change', handler));\n }\n\n // Close on outside click\n this.addListener(document, 'click', (e) => {\n if (this.state.isOpen && this.elements.customizer && !this.elements.customizer.contains(e.target)) {\n this.close();\n }\n });\n\n // Close on Escape key\n this.addListener(document, 'keydown', (e) => {\n if (e.key === 'Escape' && this.state.isOpen) {\n this.close();\n }\n });\n },\n\n bindTriggerEvents: function (root) {\n const triggers = root ? this.getTriggers(root) : this.elements.triggers;\n triggers.forEach((trigger) => {\n if (trigger.getAttribute('data-customizer-trigger-initialized') === 'true') {\n return;\n }\n\n const onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.elements.activeTrigger = trigger;\n this.elements.trigger = trigger;\n this.toggle();\n };\n\n trigger.addEventListener('click', onClick);\n trigger._themeCustomizerTriggerHandler = onClick;\n trigger.setAttribute('data-customizer-trigger-initialized', 'true');\n });\n },\n\n cleanupTrigger: function (trigger) {\n if (!trigger || trigger.getAttribute('data-customizer-trigger-initialized') !== 'true') {\n return;\n }\n\n if (trigger._themeCustomizerTriggerHandler) {\n trigger.removeEventListener('click', trigger._themeCustomizerTriggerHandler);\n delete trigger._themeCustomizerTriggerHandler;\n }\n\n trigger.setAttribute('aria-expanded', 'false');\n trigger.removeAttribute('data-customizer-trigger-initialized');\n\n if (this.elements.activeTrigger === trigger) {\n this.elements.activeTrigger = null;\n }\n\n this.elements.triggers = this.elements.triggers.filter(function (candidate) {\n return candidate !== trigger;\n });\n\n if (this.elements.trigger === trigger) {\n this.elements.trigger = this.elements.triggers[0] || null;\n }\n },\n\n /**\n * Toggle panel open/close\n */\n toggle: function () {\n if (this.state.isOpen) {\n this.close();\n } else {\n this.open();\n }\n },\n\n /**\n * Open the panel\n */\n open: function () {\n this.state.isOpen = true;\n\n // Ensure panel is positioned correctly before opening\n this.positionPanel();\n\n if (this.elements.panel) {\n this.elements.panel.classList.add('is-open');\n }\n this.elements.triggers.forEach((trigger) => trigger.setAttribute('aria-expanded', 'false'));\n if (this.elements.trigger) this.elements.trigger.setAttribute('aria-expanded', 'true');\n if (this.elements.overlay) {\n this.elements.overlay.classList.add('is-active');\n }\n\n this.dispatchEvent('panel-open', { isOpen: true });\n },\n\n /**\n * Close the panel\n */\n close: function () {\n this.state.isOpen = false;\n\n if (this.elements.panel) {\n this.elements.panel.classList.remove('is-open');\n }\n this.elements.triggers.forEach((trigger) => trigger.setAttribute('aria-expanded', 'false'));\n if (this.elements.overlay) {\n this.elements.overlay.classList.remove('is-active');\n }\n\n this.dispatchEvent('panel-close', { isOpen: false });\n },\n\n /**\n * Update UI to reflect current state\n */\n updateUI: function () {\n if (!this.elements.panel) return;\n\n // Update primary color swatches\n this.elements.panel.querySelectorAll('[data-color]').forEach(swatch => {\n swatch.classList.toggle('is-active', swatch.dataset.color === this.state.primary);\n });\n\n // Update neutral color swatches\n this.elements.panel.querySelectorAll('[data-neutral]').forEach(swatch => {\n swatch.classList.toggle('is-active', swatch.dataset.neutral === this.state.neutral);\n });\n\n // Update radius buttons\n this.elements.panel.querySelectorAll('[data-radius]').forEach(btn => {\n btn.classList.toggle('is-active', btn.dataset.radius === this.state.radius);\n });\n\n // Update font selector\n const fontSelect = this.elements.panel.querySelector('[data-customizer-font]');\n if (fontSelect) {\n fontSelect.value = this.state.font;\n }\n\n },\n\n /**\n * Reset all preferences to defaults\n */\n reset: function () {\n this.applyTheme(this.DEFAULTS.THEME);\n this.applyPrimary(this.getDefaultPrimary(this.DEFAULTS.THEME));\n this.applyNeutral(this.DEFAULTS.NEUTRAL);\n this.applyRadius(this.DEFAULTS.RADIUS);\n this.applyFont(this.DEFAULTS.FONT);\n this.updateUI();\n\n this.dispatchEvent('reset', { state: { ...this.state } });\n },\n\n /**\n * Get current state\n */\n getState: function () {\n return { ...this.state };\n },\n\n /**\n * Programmatically set preferences\n */\n setPreferences: function (prefs) {\n if (prefs.primary) this.applyPrimary(prefs.primary);\n if (prefs.neutral) this.applyNeutral(prefs.neutral);\n if (prefs.radius) this.applyRadius(prefs.radius);\n if (prefs.font) this.applyFont(prefs.font);\n if (prefs.theme) this.applyTheme(prefs.theme);\n this.updateUI();\n },\n\n getStorageValue: function (key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function (key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n },\n\n destroyAll: function (root) {\n const scope = this.normalizeRoot(root);\n\n if (scope !== document) {\n this.getTriggers(scope).forEach((trigger) => {\n this.cleanupTrigger(trigger);\n });\n this.pruneTriggers();\n\n if (!this.elements.triggers.length) {\n this.destroyAll(document);\n }\n return;\n }\n\n this._cleanup.forEach(fn => fn());\n this._cleanup = [];\n\n if (this.elements.panel) {\n this.elements.panel.removeAttribute('data-customizer-initialized');\n }\n\n this.elements.triggers.slice().forEach((trigger) => {\n this.cleanupTrigger(trigger);\n });\n\n if (this._ownsDynamicPanel) {\n if (this.elements.panel && this.elements.panel.parentNode) {\n this.elements.panel.parentNode.removeChild(this.elements.panel);\n }\n if (this.elements.overlay && this.elements.overlay.parentNode) {\n this.elements.overlay.parentNode.removeChild(this.elements.overlay);\n }\n this._ownsDynamicPanel = false;\n }\n\n this.close();\n this.elements.customizer = null;\n this.elements.trigger = null;\n this.elements.activeTrigger = null;\n this.elements.triggers = [];\n this.elements.panel = null;\n this.elements.overlay = null;\n this.isInitialized = false;\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('themeCustomizer', ThemeCustomizer);\n }\n\n // Expose globally for convenience\n window.ThemeCustomizer = ThemeCustomizer;\n})();\n", "/**\n * Vanduo Framework - Theme Switcher\n * Handles light/dark/system theme toggling and persistence\n */\n\n(function () {\n 'use strict';\n\n const ThemeSwitcher = {\n isInitialized: false,\n _mediaQuery: null,\n _onMediaChange: null,\n\n getToggles: function (root) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(root, '[data-toggle=\"theme\"]');\n }\n\n return Array.from(document.querySelectorAll('[data-toggle=\"theme\"]'));\n },\n\n init: function (root) {\n this.STORAGE_KEY = 'vanduo-theme-preference';\n this.state = {\n preference: this.getPreference() // 'light', 'dark', or 'system'\n };\n\n if (this.isInitialized) {\n this.applyTheme();\n this.renderUI(root);\n this.updateUI(root);\n return;\n }\n\n this.isInitialized = true;\n\n this.applyTheme();\n this.listenForSystemChanges();\n this.renderUI(root);\n },\n\n getPreference: function () {\n return this.getStorageValue(this.STORAGE_KEY, 'system');\n },\n\n setPreference: function (pref) {\n this.state.preference = pref;\n this.setStorageValue(this.STORAGE_KEY, pref);\n this.applyTheme();\n \n // Coordinate with ThemeCustomizer for primary color swap if available\n // Check _isApplying flag to prevent circular updates\n if (window.ThemeCustomizer && window.ThemeCustomizer.applyTheme && !window.ThemeCustomizer._isApplying) {\n window.ThemeCustomizer.applyTheme(pref);\n }\n \n this.updateUI();\n },\n\n getStorageValue: function (key, fallback) {\n if (typeof window.safeStorageGet === 'function') {\n return window.safeStorageGet(key, fallback);\n }\n try {\n const value = localStorage.getItem(key);\n return value !== null ? value : fallback;\n } catch (_e) {\n return fallback;\n }\n },\n\n setStorageValue: function (key, value) {\n if (typeof window.safeStorageSet === 'function') {\n return window.safeStorageSet(key, value);\n }\n try {\n localStorage.setItem(key, value);\n return true;\n } catch (_e) {\n return false;\n }\n },\n\n applyTheme: function () {\n const pref = this.state.preference;\n\n if (pref === 'system') {\n // When in system mode, we remove the data attribute to let the media query take over\n // or we can explicitly set it. Explicitly setting it ensures consistency if we rely on [data-theme]\n // But if we rely on @media in CSS, we might want to remove attributes.\n // However, our CSS strategy uses :root:not([data-theme=\"light\"]) inside media query for system dark fallback\n // which is a bit complex.\n\n // Simpler approach: \n // If preference is system, REMOVE data-theme attribute. Let CSS media queries handle it.\n document.documentElement.removeAttribute('data-theme');\n } else {\n document.documentElement.setAttribute('data-theme', pref);\n }\n },\n\n listenForSystemChanges: function () {\n if (this._mediaQuery && this._onMediaChange) {\n return;\n }\n\n this._mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n this._onMediaChange = _e => {\n if (this.state.preference === 'system') {\n // Re-apply (effectively just to ensure consistency, though removing attribute usually suffices)\n this.applyTheme();\n // Keep default primary (black/amber) aligned when OS scheme changes while in system mode\n if (window.ThemeCustomizer && typeof window.ThemeCustomizer.applyTheme === 'function' && !window.ThemeCustomizer._isApplying) {\n window.ThemeCustomizer.applyTheme('system');\n }\n }\n };\n this._mediaQuery.addEventListener('change', this._onMediaChange);\n },\n\n // Helper to facilitate UI creation if needed, though often UI is in HTML\n renderUI: function (root) {\n // Look for any uninitialized theme toggles\n const toggles = this.getToggles(root);\n toggles.forEach(toggle => {\n if (toggle.getAttribute('data-theme-initialized') === 'true') {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n }\n return;\n }\n\n // Simplified UI Binding - assumes a select or a button cycle\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n const onChange = (e) => {\n this.setPreference(e.target.value);\n };\n toggle.addEventListener('change', onChange);\n toggle._themeToggleHandler = onChange;\n } else {\n // Button implementation (cycle)\n const onClick = () => {\n const modes = ['system', 'light', 'dark'];\n const nextIndex = (modes.indexOf(this.state.preference) + 1) % modes.length;\n this.setPreference(modes[nextIndex]);\n };\n toggle.addEventListener('click', onClick);\n toggle._themeToggleHandler = onClick;\n }\n // Mark as initialized\n toggle.setAttribute('data-theme-initialized', 'true');\n });\n },\n\n updateUI: function (root) {\n const toggles = this.getToggles(root);\n toggles.forEach(toggle => {\n if (toggle.tagName === 'SELECT') {\n toggle.value = this.state.preference;\n } else {\n // Update button text/icon if needed\n // e.g. toggle.textContent = this.state.preference;\n // For now, assume the user handles visual state or generic text\n\n // If there is an icon or text span inside, update it\n const span = toggle.querySelector('.theme-current-label');\n if (span) {\n span.textContent = this.state.preference.charAt(0).toUpperCase() + this.state.preference.slice(1);\n }\n }\n });\n },\n\n destroyAll: function (root) {\n const scope = root || document;\n const toggles = this.getToggles(scope).filter(function (toggle) {\n return toggle.getAttribute('data-theme-initialized') === 'true';\n });\n toggles.forEach(toggle => {\n if (toggle._themeToggleHandler) {\n const eventName = toggle.tagName === 'SELECT' ? 'change' : 'click';\n toggle.removeEventListener(eventName, toggle._themeToggleHandler);\n delete toggle._themeToggleHandler;\n }\n toggle.removeAttribute('data-theme-initialized');\n });\n\n if (scope === document && this._mediaQuery && this._onMediaChange) {\n this._mediaQuery.removeEventListener('change', this._onMediaChange);\n }\n\n if (scope === document) {\n this._mediaQuery = null;\n this._onMediaChange = null;\n this.isInitialized = false;\n }\n }\n };\n\n // Register component\n if (window.Vanduo) {\n window.Vanduo.register('themeSwitcher', ThemeSwitcher);\n }\n})();\n", "/**\n * Vanduo Framework - Toast Component\n * Popup notifications for user feedback\n */\n\n(function() {\n 'use strict';\n\n /**\n * Toast Component\n */\n const Toast = {\n // Default options\n defaults: {\n position: 'top-right',\n duration: 5000,\n dismissible: true,\n showProgress: true,\n pauseOnHover: true\n },\n\n // Container cache\n containers: {},\n\n /**\n * Get or create a toast container for a position\n * @param {string} position - Container position\n * @returns {HTMLElement} Toast container element\n */\n getContainer: function(position) {\n if (this.containers[position]) {\n return this.containers[position];\n }\n\n const container = document.createElement('div');\n container.className = `vd-toast-container vd-toast-container-${position}`;\n container.setAttribute('role', 'status');\n container.setAttribute('aria-live', 'polite');\n container.setAttribute('aria-atomic', 'false');\n document.body.appendChild(container);\n this.containers[position] = container;\n\n return container;\n },\n\n /**\n * Show a toast notification\n * @param {Object|string} options - Toast options or message string\n * @param {string} [type] - Toast type (success, error, warning, info)\n * @param {number} [duration] - Auto-dismiss duration in ms\n * @returns {HTMLElement} Toast element\n */\n show: function(options, type, duration) {\n // Support simple API:\n // - Toast.show('Message', 'success', 3000)\n // - Toast.show('Message', { type: 'success', duration: 3000 })\n if (typeof options === 'string') {\n if (type && typeof type === 'object') {\n options = Object.assign({}, type, {\n message: options\n });\n } else {\n options = {\n message: options,\n type: type,\n duration: duration\n };\n }\n }\n\n const config = Object.assign({}, this.defaults, options);\n const container = this.getContainer(config.position);\n\n // Create toast element\n const toast = document.createElement('div');\n toast.className = 'vd-toast';\n\n if (config.type) {\n toast.classList.add(`vd-toast-${config.type}`);\n }\n\n if (config.solid) {\n toast.classList.add('vd-toast-solid');\n }\n\n if (config.showProgress && config.duration > 0) {\n toast.classList.add('vd-toast-with-progress');\n }\n\n // Build toast content\n let html = '';\n\n // Icon (sanitize custom icons, default icons are trusted SVG)\n if (config.icon) {\n const allowSvg = config.iconAllowSvg === true;\n const safeIcon = typeof sanitizeHtml === 'function'\n ? sanitizeHtml(config.icon, { allowSvg, allowStyle: false })\n : escapeHtml(config.icon);\n html += `<span class=\"vd-toast-icon\">${safeIcon}</span>`;\n } else if (config.type) {\n html += `<span class=\"vd-toast-icon\">${this.getDefaultIcon(config.type)}</span>`;\n }\n\n // Local escape helper \u2014 guarantees HTML-safe output even if the\n // global escapeHtml utility is not loaded in the current bundle.\n const _esc = typeof escapeHtml === 'function'\n ? escapeHtml\n : function (s) {\n const d = document.createElement('div');\n d.appendChild(document.createTextNode(s));\n return d.innerHTML;\n };\n\n // Content (escape text to prevent injection)\n html += '<div class=\"vd-toast-content\">';\n if (config.title) {\n html += `<div class=\"vd-toast-title\">${_esc(String(config.title))}</div>`;\n }\n if (config.message) {\n html += `<div class=\"vd-toast-message\">${_esc(String(config.message))}</div>`;\n }\n html += '</div>';\n\n // Close button\n if (config.dismissible) {\n html += '<button type=\"button\" class=\"vd-toast-close\" aria-label=\"Close\"></button>';\n }\n\n // Progress bar\n if (config.showProgress && config.duration > 0) {\n const safeDuration = parseInt(config.duration, 10) || 0;\n html += `<div class=\"vd-toast-progress\" style=\"animation-duration: ${safeDuration}ms\"></div>`;\n }\n\n toast.innerHTML = html;\n\n // Add to container\n container.appendChild(toast);\n\n toast._toastCleanup = [];\n\n // Set up close button handler\n if (config.dismissible) {\n const closeBtn = toast.querySelector('.vd-toast-close');\n const onClose = () => {\n this.dismiss(toast);\n };\n closeBtn.addEventListener('click', onClose);\n toast._toastCleanup.push(() => closeBtn.removeEventListener('click', onClose));\n }\n\n // Pause on hover\n let timeoutId = null;\n let remainingTime = config.duration;\n let startTime = null;\n\n const startTimer = () => {\n if (config.duration > 0) {\n startTime = Date.now();\n timeoutId = setTimeout(() => {\n this.dismiss(toast);\n }, remainingTime);\n toast._toastTimeoutId = timeoutId;\n\n // Resume progress animation\n const progress = toast.querySelector('.vd-toast-progress');\n if (progress) {\n progress.style.animationPlayState = 'running';\n }\n }\n };\n\n const pauseTimer = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n toast._toastTimeoutId = null;\n remainingTime -= Date.now() - startTime;\n\n // Pause progress animation\n const progress = toast.querySelector('.vd-toast-progress');\n if (progress) {\n progress.style.animationPlayState = 'paused';\n }\n }\n };\n\n if (config.pauseOnHover) {\n toast.addEventListener('mouseenter', pauseTimer);\n toast.addEventListener('mouseleave', startTimer);\n toast._toastCleanup.push(\n () => toast.removeEventListener('mouseenter', pauseTimer),\n () => toast.removeEventListener('mouseleave', startTimer)\n );\n }\n\n // Trigger enter animation\n requestAnimationFrame(() => {\n toast.classList.add('is-visible');\n startTimer();\n });\n\n // Store config on element for later access\n toast._toastConfig = config;\n\n // Dispatch show event\n const showEvent = new CustomEvent('toast:show', {\n bubbles: true,\n detail: { toast, config }\n });\n toast.dispatchEvent(showEvent);\n\n return toast;\n },\n\n /**\n * Dismiss a toast\n * @param {HTMLElement} toast - Toast element to dismiss\n */\n dismiss: function(toast) {\n if (!toast || toast.classList.contains('is-exiting')) return;\n\n if (toast._toastTimeoutId) {\n clearTimeout(toast._toastTimeoutId);\n toast._toastTimeoutId = null;\n }\n\n toast.classList.remove('is-visible');\n toast.classList.add('is-exiting');\n\n // Dispatch dismiss event\n const dismissEvent = new CustomEvent('toast:dismiss', {\n bubbles: true,\n detail: { toast }\n });\n toast.dispatchEvent(dismissEvent);\n\n // Remove after animation\n const handleTransitionEnd = () => {\n toast.removeEventListener('transitionend', handleTransitionEnd);\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n };\n\n toast.addEventListener('transitionend', handleTransitionEnd);\n\n // Fallback removal if transition doesn't fire\n setTimeout(() => {\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n }, 400);\n },\n\n /**\n * Destroy all toasts and containers\n */\n destroyAll: function() {\n Object.keys(this.containers).forEach(position => {\n const container = this.containers[position];\n if (!container) return;\n\n const toasts = container.querySelectorAll('.vd-toast');\n toasts.forEach(toast => {\n if (toast._toastTimeoutId) {\n clearTimeout(toast._toastTimeoutId);\n }\n if (toast._toastCleanup) {\n toast._toastCleanup.forEach(fn => fn());\n delete toast._toastCleanup;\n }\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n });\n\n if (container.parentElement) {\n container.parentElement.removeChild(container);\n }\n });\n\n this.containers = {};\n },\n\n /**\n * Dismiss all toasts\n * @param {string} [position] - Optional position to clear (clears all if not specified)\n */\n dismissAll: function(position) {\n if (position && this.containers[position]) {\n const toasts = this.containers[position].querySelectorAll('.vd-toast');\n toasts.forEach(toast => this.dismiss(toast));\n } else {\n Object.values(this.containers).forEach(container => {\n const toasts = container.querySelectorAll('.vd-toast');\n toasts.forEach(toast => this.dismiss(toast));\n });\n }\n },\n\n /**\n * Get default icon SVG for a type\n * @param {string} type - Toast type\n * @returns {string} SVG icon markup\n */\n getDefaultIcon: function(type) {\n const icons = {\n 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>',\n 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>',\n 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>',\n 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>'\n };\n\n return icons[type] || '';\n },\n\n /**\n * Convenience methods for common toast types\n */\n success: function(message, options) {\n return this.show(Object.assign({ message, type: 'success' }, options));\n },\n\n error: function(message, options) {\n return this.show(Object.assign({ message, type: 'error' }, options));\n },\n\n warning: function(message, options) {\n return this.show(Object.assign({ message, type: 'warning' }, options));\n },\n\n info: function(message, options) {\n return this.show(Object.assign({ message, type: 'info' }, options));\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('toast', Toast);\n }\n\n // Also expose globally for convenience\n window.Toast = Toast;\n\n})();\n", "/**\n * Vanduo Framework - Tooltips Component\n * JavaScript functionality for tooltips\n */\n\n(function () {\n 'use strict';\n\n /**\n * Tooltips Component\n */\n const Tooltips = {\n tooltips: new Map(),\n delayTimers: new Map(),\n\n /**\n * Sanitize HTML \u2014 delegates to shared sanitizeHtml from helpers.js\n * @param {string} input\n * @param {{ allowSvg?: boolean }} [options]\n * @returns {string} sanitized HTML\n */\n sanitizeHtml: function (input, options) {\n if (typeof sanitizeHtml === 'function') {\n return sanitizeHtml(input, options);\n }\n // Fallback: content originates from developer-authored data attributes,\n // so returning it as-is is no worse than any other inline HTML.\n return input || '';\n },\n\n /**\n * Initialize tooltips\n */\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '[data-tooltip], [data-tooltip-html]');\n\n elements.forEach(element => {\n if (this.tooltips.has(element)) {\n return;\n }\n this.initTooltip(element);\n });\n },\n\n /**\n * Initialize a single tooltip\n * @param {HTMLElement} element - Element with tooltip\n */\n initTooltip: function (element) {\n const tooltip = this.createTooltip(element);\n const cleanupFunctions = [];\n\n // Show on hover/focus\n const enterHandler = () => { this.showTooltip(element, tooltip); };\n const leaveHandler = () => { this.hideTooltip(element, tooltip); };\n const focusHandler = () => { this.showTooltip(element, tooltip); };\n const blurHandler = () => { this.hideTooltip(element, tooltip); };\n\n element.addEventListener('mouseenter', enterHandler);\n element.addEventListener('mouseleave', leaveHandler);\n element.addEventListener('focus', focusHandler);\n element.addEventListener('blur', blurHandler);\n\n cleanupFunctions.push(\n () => element.removeEventListener('mouseenter', enterHandler),\n () => element.removeEventListener('mouseleave', leaveHandler),\n () => element.removeEventListener('focus', focusHandler),\n () => element.removeEventListener('blur', blurHandler)\n );\n\n this.tooltips.set(element, { tooltip, cleanup: cleanupFunctions });\n },\n\n /**\n * Create tooltip element\n * @param {HTMLElement} element - Target element\n * @returns {HTMLElement} Tooltip element\n */\n createTooltip: function (element) {\n const tooltip = document.createElement('div');\n tooltip.className = 'vd-tooltip';\n tooltip.setAttribute('role', 'tooltip');\n tooltip.setAttribute('aria-hidden', 'true');\n\n // Generate unique ID and link via aria-describedby\n const tooltipId = 'tooltip-' + Math.random().toString(36).substr(2, 9);\n tooltip.id = tooltipId;\n element.setAttribute('aria-describedby', tooltipId);\n\n // Get content\n const htmlContent = element.dataset.tooltipHtml;\n const textContent = element.dataset.tooltip;\n\n if (htmlContent) {\n const allowSvg = element.hasAttribute('data-tooltip-allow-svg');\n tooltip.innerHTML = this.sanitizeHtml(htmlContent, { allowSvg, allowStyle: false });\n tooltip.classList.add('vd-tooltip-html');\n } else if (textContent) {\n tooltip.textContent = textContent;\n }\n\n // Get placement\n const placement = element.dataset.tooltipPlacement || element.dataset.placement || 'top';\n tooltip.setAttribute('data-placement', placement);\n tooltip.classList.add(`vd-tooltip-${placement}`);\n\n // Get variant\n if (element.dataset.tooltipVariant) {\n tooltip.classList.add(`vd-tooltip-${element.dataset.tooltipVariant}`);\n }\n\n // Get size\n if (element.dataset.tooltipSize) {\n tooltip.classList.add(`vd-tooltip-${element.dataset.tooltipSize}`);\n }\n\n // Get delay\n const delay = parseInt(element.dataset.tooltipDelay) || 0;\n tooltip.dataset.delay = delay;\n\n document.body.appendChild(tooltip);\n\n return tooltip;\n },\n\n /**\n * Show tooltip\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n showTooltip: function (element, tooltip) {\n const delay = parseInt(tooltip.dataset.delay) || 0;\n\n if (delay > 0) {\n const timer = setTimeout(() => {\n this.positionTooltip(element, tooltip);\n tooltip.classList.add('is-visible');\n tooltip.setAttribute('aria-hidden', 'false');\n }, delay);\n this.delayTimers.set(element, timer);\n } else {\n this.positionTooltip(element, tooltip);\n tooltip.classList.add('is-visible');\n tooltip.setAttribute('aria-hidden', 'false');\n }\n },\n\n /**\n * Hide tooltip\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n hideTooltip: function (element, tooltip) {\n // Clear delay timer if exists\n const timer = this.delayTimers.get(element);\n if (timer) {\n clearTimeout(timer);\n this.delayTimers.delete(element);\n }\n\n tooltip.classList.remove('is-visible');\n tooltip.setAttribute('aria-hidden', 'true');\n },\n\n /**\n * Position tooltip relative to element\n * @param {HTMLElement} element - Target element\n * @param {HTMLElement} tooltip - Tooltip element\n */\n positionTooltip: function (element, tooltip) {\n const placement = tooltip.dataset.placement || 'top';\n const rect = element.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'top':\n top = rect.top + scrollTop - tooltipRect.height - 8;\n left = rect.left + scrollLeft + (rect.width / 2) - (tooltipRect.width / 2);\n break;\n case 'bottom':\n top = rect.bottom + scrollTop + 8;\n left = rect.left + scrollLeft + (rect.width / 2) - (tooltipRect.width / 2);\n break;\n case 'left':\n top = rect.top + scrollTop + (rect.height / 2) - (tooltipRect.height / 2);\n left = rect.left + scrollLeft - tooltipRect.width - 8;\n break;\n case 'right':\n top = rect.top + scrollTop + (rect.height / 2) - (tooltipRect.height / 2);\n left = rect.right + scrollLeft + 8;\n break;\n }\n\n // Prevent overflow\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n if (left < padding) {\n left = padding;\n } else if (left + tooltipRect.width > viewportWidth - padding) {\n left = viewportWidth - tooltipRect.width - padding;\n }\n\n if (top < scrollTop + padding) {\n top = scrollTop + padding;\n } else if (top + tooltipRect.height > scrollTop + viewportHeight - padding) {\n top = scrollTop + viewportHeight - tooltipRect.height - padding;\n }\n\n // Use single style assignment with transform for better performance\n tooltip.style.cssText = `position: absolute; top: 0; left: 0; transform: translate(${left}px, ${top}px);`;\n },\n\n /**\n * Show tooltip programmatically\n * @param {HTMLElement|string} element - Target element or selector\n */\n show: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n this.showTooltip(el, tooltip);\n }\n },\n\n /**\n * Hide tooltip programmatically\n * @param {HTMLElement|string} element - Target element or selector\n */\n hide: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n this.hideTooltip(el, tooltip);\n }\n },\n\n /**\n * Update tooltip content\n * @param {HTMLElement|string} element - Target element or selector\n * @param {string} content - New content\n * @param {boolean} isHtml - Whether content is HTML\n */\n update: function (element, content, isHtml = false) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (el && this.tooltips.has(el)) {\n const { tooltip } = this.tooltips.get(el);\n if (isHtml) {\n const allowSvg = el.hasAttribute('data-tooltip-allow-svg');\n tooltip.innerHTML = this.sanitizeHtml(content, { allowSvg, allowStyle: false });\n tooltip.classList.add('vd-tooltip-html');\n } else {\n tooltip.textContent = content;\n tooltip.classList.remove('vd-tooltip-html');\n }\n }\n },\n\n /**\n * Destroy a tooltip instance and clean up\n * @param {HTMLElement} element - Element with tooltip\n */\n destroy: function (element) {\n const data = this.tooltips.get(element);\n if (!data) return;\n\n // Clear any pending timer\n const timer = this.delayTimers.get(element);\n if (timer) {\n clearTimeout(timer);\n this.delayTimers.delete(element);\n }\n\n data.cleanup.forEach(fn => fn());\n\n // Remove tooltip element from DOM\n if (data.tooltip && data.tooltip.parentNode) {\n data.tooltip.parentNode.removeChild(data.tooltip);\n }\n\n this.tooltips.delete(element);\n },\n\n /**\n * Destroy all tooltip instances\n */\n destroyAll: function () {\n this.tooltips.forEach((data, element) => {\n this.destroy(element);\n });\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tooltips', Tooltips);\n }\n\n // Expose globally\n window.VanduoTooltips = Tooltips;\n\n})();\n", "/**\n * Vanduo Framework - Search Component\n * Client-side search functionality for content pages\n * \n * @example Basic usage (initialize with defaults)\n * // HTML:\n * // <div class=\"doc-search\">\n * // <input type=\"search\" class=\"doc-search-input\" placeholder=\"Search...\">\n * // <div class=\"vd-doc-search-results\"></div>\n * // </div>\n * \n * @example Custom configuration\n * var search = Search.create({\n * containerSelector: '.my-search',\n * contentSelector: 'article[id]',\n * titleSelector: 'h2, h3',\n * maxResults: 5,\n * onSelect: function(result) {\n * console.log('Selected:', result.title);\n * }\n * });\n * \n * @example With custom data source\n * var search = Search.create({\n * containerSelector: '.my-search',\n * data: [\n * { id: 'item1', title: 'First Item', content: 'Description...', category: 'Category A' },\n * { id: 'item2', title: 'Second Item', content: 'Description...', category: 'Category B' }\n * ]\n * });\n */\n\n(function() {\n 'use strict';\n\n /**\n * Default configuration\n */\n const DEFAULTS = {\n // Behavior\n minQueryLength: 2,\n maxResults: 10,\n debounceMs: 150,\n highlightTag: 'mark',\n keyboardShortcut: true, // Enable Cmd/Ctrl+K shortcut\n \n // Selectors (for DOM-based indexing)\n containerSelector: '.vd-doc-search',\n inputSelector: '.vd-doc-search-input',\n resultsSelector: '.vd-doc-search-results',\n contentSelector: '.doc-content section[id]',\n titleSelector: '.demo-title, h2, h3',\n navSelector: '.doc-nav-link',\n sectionSelector: '.doc-nav-section',\n \n // Content extraction\n excludeFromContent: 'pre, code, script, style',\n maxContentLength: 500,\n \n // Custom data source (alternative to DOM indexing)\n data: null,\n \n // Category icons mapping\n categoryIcons: {\n 'getting-started': 'ph-rocket-launch',\n 'core': 'ph-cube',\n 'components': 'ph-puzzle-piece',\n 'interactive': 'ph-cursor-click',\n 'data-display': 'ph-table',\n 'feedback': 'ph-bell',\n 'meta': 'ph-info',\n 'default': 'ph-file-text'\n },\n \n // Callbacks\n onSelect: null, // function(result) - called when result is selected\n onSearch: null, // function(query, results) - called after search\n onOpen: null, // function() - called when results open\n onClose: null, // function() - called when results close\n \n // Text customization\n emptyTitle: 'No results found',\n emptyText: 'Try different keywords or check spelling',\n placeholder: 'Search...'\n };\n\n const ALLOWED_HIGHLIGHT_TAGS = {\n mark: true,\n span: true,\n strong: true,\n em: true\n };\n\n function isRoot(value) {\n return typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.isRoot(value);\n }\n\n function normalizeRoot(root) {\n return isRoot(root) ? root : document;\n }\n\n function normalizeHighlightTag(tagName) {\n const normalized = typeof tagName === 'string' ? tagName.toLowerCase() : 'mark';\n return ALLOWED_HIGHLIGHT_TAGS[normalized] ? normalized : 'mark';\n }\n\n /**\n * Search Component Factory\n * Creates a new search instance with the given configuration\n * \n * @param {Object} options - Configuration options\n * @returns {Object} Search instance\n */\n function createSearch(options) {\n const config = Object.assign({}, DEFAULTS, options || {});\n config.root = normalizeRoot(config.root);\n config.highlightTag = normalizeHighlightTag(config.highlightTag);\n \n // Instance state\n const state = {\n initialized: false,\n index: [],\n results: [],\n activeIndex: -1,\n isOpen: false,\n query: '',\n container: null,\n input: null,\n resultsContainer: null,\n debounceTimer: null,\n boundHandlers: {}\n };\n\n function queryAll(selector) {\n if (window.Vanduo && typeof window.Vanduo.queryAll === 'function') {\n return window.Vanduo.queryAll(config.root, selector);\n }\n\n const scope = normalizeRoot(config.root);\n if (scope === document) {\n return Array.from(document.querySelectorAll(selector));\n }\n\n const matches = [];\n if (scope instanceof Element && scope.matches(selector)) {\n matches.push(scope);\n }\n return matches.concat(Array.from(scope.querySelectorAll(selector)));\n }\n\n function queryOne(selector) {\n const matches = queryAll(selector);\n return matches.length ? matches[0] : null;\n }\n\n function safeInvokeCallback(name, fn, ...args) {\n try {\n fn(...args);\n } catch (error) {\n console.warn('[Vanduo Search] Callback error in \"' + name + '\":', error);\n }\n }\n\n function setResultsHtml(html) {\n if (!state.resultsContainer) return;\n try {\n state.resultsContainer.innerHTML = html;\n } catch (error) {\n console.warn('[Vanduo Search] Failed to render results:', error);\n }\n }\n\n /**\n * Initialize the search component\n * Idempotent \u2014 safe to call more than once on the same instance.\n * Returns the instance on success, null if required DOM elements are missing.\n */\n function init() {\n if (state.initialized) {\n return instance;\n }\n\n state.container = queryOne(config.containerSelector);\n if (!state.container) {\n state.initialized = false;\n return null;\n }\n\n state.input = state.container.querySelector(config.inputSelector);\n state.resultsContainer = state.container.querySelector(config.resultsSelector);\n\n if (!state.input || !state.resultsContainer) {\n state.initialized = false;\n return null;\n }\n\n // Set placeholder if configured\n if (config.placeholder) {\n state.input.setAttribute('placeholder', config.placeholder);\n }\n\n // Build search index\n buildIndex();\n\n // Bind events\n bindEvents();\n\n // Set up ARIA attributes\n setupAria();\n\n state.initialized = true;\n return instance;\n }\n\n /**\n * Build search index from DOM or custom data\n */\n function buildIndex() {\n state.index = [];\n \n // Use custom data if provided\n if (config.data && Array.isArray(config.data)) {\n config.data.forEach(function(item) {\n state.index.push({\n id: item.id || slugify(item.title),\n title: item.title || '',\n category: item.category || '',\n categorySlug: slugify(item.category || ''),\n content: item.content || '',\n keywords: item.keywords || extractKeywordsFromText(item.title + ' ' + item.content),\n url: item.url || '#' + (item.id || slugify(item.title)),\n icon: item.icon || ''\n });\n });\n return;\n }\n\n // Build from DOM\n const sections = queryAll(config.contentSelector);\n const categoryMap = buildCategoryMap();\n\n sections.forEach(function(section) {\n const id = section.id;\n if (!id) return;\n\n const titleEl = section.querySelector(config.titleSelector);\n const title = titleEl ? titleEl.textContent.replace(/v[\\d.]+/g, '').trim() : id;\n const category = categoryMap[id] || 'Documentation';\n const content = extractContent(section);\n const keywords = extractKeywords(section, title);\n const iconEl = titleEl ? titleEl.querySelector('i.ph') : null;\n let icon = '';\n if (iconEl && iconEl.classList) {\n for (let ci = 0; ci < iconEl.classList.length; ci++) {\n if (iconEl.classList[ci].indexOf('ph-') === 0) {\n icon = iconEl.classList[ci];\n break;\n }\n }\n }\n\n state.index.push({\n id: id,\n title: title,\n category: category,\n categorySlug: slugify(category),\n content: content,\n keywords: keywords,\n url: '#' + id,\n icon: icon\n });\n });\n }\n\n /**\n * Build a map of section IDs to their categories\n */\n function buildCategoryMap() {\n const map = {};\n let currentCategory = 'Documentation';\n const navItems = queryAll(config.navSelector + ', ' + config.sectionSelector);\n\n navItems.forEach(function(item) {\n if (item.classList.contains('doc-nav-section')) {\n currentCategory = item.textContent.trim();\n } else {\n const href = item.getAttribute('href');\n if (href && href.startsWith('#')) {\n const id = href.substring(1);\n map[id] = currentCategory;\n }\n }\n });\n\n return map;\n }\n\n /**\n * Extract searchable content from a section\n */\n function extractContent(section) {\n const clone = section.cloneNode(true);\n \n const toRemove = clone.querySelectorAll(config.excludeFromContent);\n toRemove.forEach(function(el) {\n el.remove();\n });\n\n let text = clone.textContent || '';\n text = text.replace(/\\s+/g, ' ').trim();\n \n return text.substring(0, config.maxContentLength);\n }\n\n /**\n * Extract keywords from a section\n */\n function extractKeywords(section, title) {\n const keywords = [];\n \n // Add title words\n title.toLowerCase().split(/\\s+/).forEach(function(word) {\n if (word.length > 2) {\n keywords.push(word);\n }\n });\n\n // Add class names from code examples\n const codeBlocks = section.querySelectorAll('code');\n codeBlocks.forEach(function(code) {\n const text = code.textContent || '';\n const classMatches = text.match(/\\.([\\w-]+)/g);\n if (classMatches) {\n classMatches.forEach(function(match) {\n keywords.push(match.substring(1).toLowerCase());\n });\n }\n });\n\n // Add data attributes\n const dataAttrs = section.querySelectorAll('[data-tooltip], [data-modal]');\n dataAttrs.forEach(function(el) {\n const attrs = el.getAttributeNames().filter(function(name) {\n return name.startsWith('data-');\n });\n attrs.forEach(function(attr) {\n keywords.push(attr.replace('data-', ''));\n });\n });\n\n return Array.from(new Set(keywords));\n }\n\n /**\n * Extract keywords from text string\n */\n function extractKeywordsFromText(text) {\n const words = text.toLowerCase().split(/\\s+/);\n return words.filter(function(word) {\n return word.length > 2;\n });\n }\n\n /**\n * Convert string to slug\n */\n function slugify(str) {\n return str.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n }\n\n /**\n * Bind event listeners\n */\n function bindEvents() {\n // Store bound handlers for cleanup\n state.boundHandlers.handleInput = function(e) {\n handleInput(e);\n };\n state.boundHandlers.handleFocus = function() {\n if (state.query.length >= config.minQueryLength) {\n open();\n }\n };\n state.boundHandlers.handleKeydown = function(e) {\n handleKeydown(e);\n };\n state.boundHandlers.handleOutsideClick = function(e) {\n if (!state.container.contains(e.target)) {\n close();\n }\n };\n state.boundHandlers.handleGlobalKeydown = function(e) {\n if (config.keyboardShortcut && (e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n state.input.focus();\n state.input.select();\n }\n };\n state.boundHandlers.handleResultClick = function(e) {\n const result = e.target.closest('.vd-doc-search-result');\n if (result) {\n const index = parseInt(result.dataset.index, 10);\n select(index);\n }\n };\n\n // Input events\n state.input.addEventListener('input', state.boundHandlers.handleInput);\n state.input.addEventListener('focus', state.boundHandlers.handleFocus);\n state.input.addEventListener('keydown', state.boundHandlers.handleKeydown);\n\n // Close on outside click\n document.addEventListener('click', state.boundHandlers.handleOutsideClick);\n\n // Global keyboard shortcut\n document.addEventListener('keydown', state.boundHandlers.handleGlobalKeydown);\n\n // Result click handling\n state.resultsContainer.addEventListener('click', state.boundHandlers.handleResultClick);\n }\n\n /**\n * Unbind event listeners\n */\n function unbindEvents() {\n if (state.input) {\n state.input.removeEventListener('input', state.boundHandlers.handleInput);\n state.input.removeEventListener('focus', state.boundHandlers.handleFocus);\n state.input.removeEventListener('keydown', state.boundHandlers.handleKeydown);\n }\n document.removeEventListener('click', state.boundHandlers.handleOutsideClick);\n document.removeEventListener('keydown', state.boundHandlers.handleGlobalKeydown);\n if (state.resultsContainer) {\n state.resultsContainer.removeEventListener('click', state.boundHandlers.handleResultClick);\n }\n }\n\n /**\n * Set up ARIA attributes\n */\n function setupAria() {\n const resultsId = state.resultsContainer.id || 'search-results-' + Math.random().toString(36).substr(2, 9);\n state.resultsContainer.id = resultsId;\n \n state.input.setAttribute('role', 'combobox');\n state.input.setAttribute('aria-autocomplete', 'list');\n state.input.setAttribute('aria-controls', resultsId);\n state.input.setAttribute('aria-expanded', 'false');\n \n state.resultsContainer.setAttribute('role', 'listbox');\n state.resultsContainer.setAttribute('aria-label', 'Search results');\n }\n\n /**\n * Handle input changes\n */\n function handleInput(e) {\n const query = e.target.value.trim();\n\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n }\n\n state.debounceTimer = setTimeout(function() {\n state.query = query;\n\n if (query.length < config.minQueryLength) {\n close();\n return;\n }\n\n state.results = search(query);\n state.activeIndex = -1;\n render();\n open();\n\n // Callback\n if (typeof config.onSearch === 'function') {\n safeInvokeCallback('onSearch', config.onSearch, query, state.results);\n }\n }, config.debounceMs);\n }\n\n /**\n * Handle keyboard navigation\n */\n function handleKeydown(e) {\n if (!state.isOpen) {\n if (e.key === 'ArrowDown' && state.query.length >= config.minQueryLength) {\n e.preventDefault();\n state.results = search(state.query);\n render();\n open();\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n navigate(1);\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n navigate(-1);\n break;\n\n case 'Enter':\n e.preventDefault();\n if (state.activeIndex >= 0) {\n select(state.activeIndex);\n } else if (state.results.length > 0) {\n select(0);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n close();\n break;\n\n case 'Tab':\n close();\n break;\n }\n }\n\n /**\n * Perform search\n */\n function search(query) {\n const terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n const scored = [];\n\n state.index.forEach(function(entry) {\n let score = 0;\n const titleLower = entry.title.toLowerCase();\n const categoryLower = entry.category.toLowerCase();\n const contentLower = entry.content.toLowerCase();\n\n terms.forEach(function(term) {\n // Title match - highest priority\n if (titleLower.includes(term)) {\n score += 100;\n if (titleLower === term) {\n score += 50;\n } else if (titleLower.startsWith(term)) {\n score += 25;\n }\n }\n\n // Category match\n if (categoryLower.includes(term)) {\n score += 50;\n }\n\n // Keyword match\n const keywordMatch = entry.keywords.some(function(k) {\n return k.includes(term);\n });\n if (keywordMatch) {\n score += 30;\n }\n\n // Content match\n if (contentLower.includes(term)) {\n score += 10;\n }\n });\n\n if (score > 0) {\n scored.push({\n id: entry.id,\n title: entry.title,\n category: entry.category,\n categorySlug: entry.categorySlug,\n content: entry.content,\n url: entry.url,\n icon: entry.icon,\n score: score\n });\n }\n });\n\n scored.sort(function(a, b) {\n return b.score - a.score;\n });\n\n return scored.slice(0, config.maxResults);\n }\n\n /**\n * Render search results\n */\n function render() {\n if (state.results.length === 0) {\n setResultsHtml(renderEmpty());\n return;\n }\n\n let html = '<ul class=\"vd-doc-search-results-list\" role=\"listbox\">';\n\n state.results.forEach(function(result, index) {\n const isActive = index === state.activeIndex;\n const icon = result.icon || getCategoryIcon(result.categorySlug);\n const excerpt = getExcerpt(result.content, state.query);\n\n html += '<li class=\"vd-doc-search-result' + (isActive ? ' is-active' : '') + '\"' +\n ' role=\"option\"' +\n ' id=\"vd-doc-search-result-' + index + '\"' +\n ' data-index=\"' + index + '\"' +\n ' data-category=\"' + escapeHtml(result.categorySlug) + '\"' +\n ' aria-selected=\"' + isActive + '\"' +\n '>' +\n '<div class=\"vd-doc-search-result-icon\">' +\n '<i class=\"ph ' + escapeHtml(icon) + '\"></i>' +\n '</div>' +\n '<div class=\"vd-doc-search-result-content\">' +\n '<div class=\"vd-doc-search-result-title\">' + highlight(result.title, state.query) + '</div>' +\n '<div class=\"vd-doc-search-result-category\">' + escapeHtml(result.category) + '</div>' +\n '<div class=\"vd-doc-search-result-excerpt\">' + highlight(excerpt, state.query) + '</div>' +\n '</div>' +\n '</li>';\n });\n\n html += '</ul>';\n html += renderFooter();\n\n setResultsHtml(html);\n }\n\n /**\n * Render empty state\n */\n function renderEmpty() {\n return '<div class=\"vd-doc-search-empty\">' +\n '<div class=\"vd-doc-search-empty-icon\"><i class=\"ph ph-magnifying-glass\"></i></div>' +\n '<div class=\"vd-doc-search-empty-title\">' + escapeHtml(config.emptyTitle) + '</div>' +\n '<div class=\"vd-doc-search-empty-text\">' + escapeHtml(config.emptyText) + '</div>' +\n '</div>';\n }\n\n /**\n * Render footer with keyboard hints\n */\n function renderFooter() {\n return '<div class=\"vd-doc-search-footer\">' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>\u2191</kbd><kbd>\u2193</kbd> to navigate</span>' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>\u21B5</kbd> to select</span>' +\n '<span class=\"vd-doc-search-footer-item\"><kbd>esc</kbd> to close</span>' +\n '</div>';\n }\n\n /**\n * Get icon for category\n */\n function getCategoryIcon(categorySlug) {\n return config.categoryIcons[categorySlug] || config.categoryIcons['default'] || 'ph-file-text';\n }\n\n /**\n * Get excerpt from content\n */\n function getExcerpt(content, query) {\n const terms = query.toLowerCase().split(/\\s+/);\n const contentLower = content.toLowerCase();\n const excerptLength = 100;\n\n let matchPos = -1;\n for (let i = 0; i < terms.length; i++) {\n const pos = contentLower.indexOf(terms[i]);\n if (pos !== -1 && (matchPos === -1 || pos < matchPos)) {\n matchPos = pos;\n }\n }\n\n if (matchPos === -1) {\n return content.substring(0, excerptLength) + '...';\n }\n\n const start = Math.max(0, matchPos - 30);\n const end = Math.min(content.length, matchPos + excerptLength);\n let excerpt = content.substring(start, end);\n\n if (start > 0) {\n excerpt = '...' + excerpt;\n }\n if (end < content.length) {\n excerpt = excerpt + '...';\n }\n\n return excerpt;\n }\n\n /**\n * Highlight matched terms in text\n */\n function highlight(text, query) {\n if (!query) return escapeHtml(text);\n\n const terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n let escaped = escapeHtml(text);\n\n terms.forEach(function(term) {\n // Skip overly long terms to prevent ReDoS\n if (term.length > 50) return;\n const regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')', 'gi');\n escaped = escaped.replace(regex, '<' + config.highlightTag + '>$1</' + config.highlightTag + '>');\n });\n\n return escaped;\n }\n\n /**\n * Escape HTML entities\n */\n function escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Navigate results with keyboard\n */\n function navigate(direction) {\n let newIndex = state.activeIndex + direction;\n\n if (newIndex < 0) {\n newIndex = state.results.length - 1;\n } else if (newIndex >= state.results.length) {\n newIndex = 0;\n }\n\n setActiveIndex(newIndex);\n }\n\n /**\n * Set active result index\n */\n function setActiveIndex(index) {\n const prevActive = state.resultsContainer.querySelector('.vd-doc-search-result.is-active');\n if (prevActive) {\n prevActive.classList.remove('is-active');\n prevActive.setAttribute('aria-selected', 'false');\n }\n\n state.activeIndex = index;\n\n const newActive = state.resultsContainer.querySelector('[data-index=\"' + index + '\"]');\n if (newActive) {\n newActive.classList.add('is-active');\n newActive.setAttribute('aria-selected', 'true');\n state.input.setAttribute('aria-activedescendant', 'vd-doc-search-result-' + index);\n newActive.scrollIntoView({ block: 'nearest' });\n }\n }\n\n /**\n * Select a result\n */\n function select(index) {\n const result = state.results[index];\n if (!result) return;\n\n // Close search\n close();\n state.input.value = '';\n state.query = '';\n\n // Custom callback\n if (typeof config.onSelect === 'function') {\n safeInvokeCallback('onSelect', config.onSelect, result);\n return;\n }\n\n // Default behavior: navigate to section\n const section = queryOne(result.url) || document.querySelector(result.url);\n if (section) {\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n window.history.pushState(null, '', result.url);\n updateSidebarActive(result.id);\n }\n }\n\n /**\n * Update sidebar navigation active state\n */\n function updateSidebarActive(sectionId) {\n const navLinks = queryAll(config.navSelector);\n navLinks.forEach(function(link) {\n link.classList.remove('active');\n if (link.getAttribute('href') === '#' + sectionId) {\n link.classList.add('active');\n }\n });\n }\n\n /**\n * Open results dropdown\n */\n function open() {\n if (state.isOpen) return;\n\n state.isOpen = true;\n state.resultsContainer.classList.add('is-open');\n state.input.setAttribute('aria-expanded', 'true');\n\n if (typeof config.onOpen === 'function') {\n safeInvokeCallback('onOpen', config.onOpen);\n }\n }\n\n /**\n * Close results dropdown\n */\n function close() {\n if (!state.isOpen) return;\n\n state.isOpen = false;\n state.activeIndex = -1;\n state.resultsContainer.classList.remove('is-open');\n state.input.setAttribute('aria-expanded', 'false');\n state.input.removeAttribute('aria-activedescendant');\n\n if (typeof config.onClose === 'function') {\n safeInvokeCallback('onClose', config.onClose);\n }\n }\n\n /**\n * Destroy the component\n */\n function destroy() {\n unbindEvents();\n \n state.initialized = false;\n state.index = [];\n state.results = [];\n state.isOpen = false;\n state.query = '';\n\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n }\n\n if (state.resultsContainer) {\n setResultsHtml('');\n }\n }\n\n /**\n * Rebuild the search index\n */\n function rebuild() {\n buildIndex();\n }\n\n /**\n * Update configuration\n */\n function setConfig(newConfig) {\n Object.assign(config, newConfig);\n config.root = normalizeRoot(config.root);\n config.highlightTag = normalizeHighlightTag(config.highlightTag);\n }\n\n /**\n * Get current configuration\n */\n function getConfig() {\n return Object.assign({}, config);\n }\n\n /**\n * Get search index\n */\n function getIndex() {\n return state.index.slice();\n }\n\n // Public instance API\n const instance = {\n init: init,\n destroy: destroy,\n rebuild: rebuild,\n search: search,\n open: open,\n close: close,\n setConfig: setConfig,\n getConfig: getConfig,\n getIndex: getIndex,\n getContainer: function () {\n return state.container;\n }\n };\n\n return instance;\n }\n\n /**\n * Search Component (singleton for backward compatibility)\n */\n const Search = {\n // Factory method \u2014 creates and auto-initializes a new independent instance.\n // Always returns the instance so callers retain a reference even if the\n // DOM container is not yet available (they can retry init() later).\n create: function(options) {\n const instance = createSearch(options);\n if (instance) {\n instance.init();\n }\n return instance || null;\n },\n \n // Default instance\n _instance: null,\n \n // Configuration (for default instance)\n config: Object.assign({}, DEFAULTS),\n\n /**\n * Initialize the default search instance\n */\n init: function(rootOrOptions, maybeOptions) {\n const root = isRoot(rootOrOptions) ? rootOrOptions : null;\n const options = root ? maybeOptions : rootOrOptions;\n\n if (this._instance) {\n this._instance.destroy();\n }\n \n if (options) {\n Object.assign(this.config, options);\n }\n \n this._instance = createSearch(Object.assign({}, this.config, root ? { root: root } : {}));\n return this._instance ? this._instance.init() : null;\n },\n\n /**\n * Destroy the default instance\n */\n destroy: function(root) {\n if (root && this._instance && this._instance.getContainer() && typeof window.VanduoLifecycle !== 'undefined') {\n if (!window.VanduoLifecycle.isInRoot(root, this._instance.getContainer())) {\n return;\n }\n }\n\n if (this._instance) {\n this._instance.destroy();\n this._instance = null;\n }\n },\n\n destroyAll: function(root) {\n this.destroy(root);\n },\n\n /**\n * Rebuild the default instance index\n */\n rebuild: function() {\n if (this._instance) {\n this._instance.rebuild();\n }\n },\n\n /**\n * Search using the default instance\n */\n search: function(query) {\n return this._instance ? this._instance.search(query) : [];\n },\n\n /**\n * Open the default instance\n */\n open: function() {\n if (this._instance) {\n this._instance.open();\n }\n },\n\n /**\n * Close the default instance\n */\n close: function() {\n if (this._instance) {\n this._instance.close();\n }\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('docSearch', Search);\n }\n\n // Expose globally (both names for compatibility)\n window.Search = Search;\n window.DocSearch = Search; // Backward compatibility\n window.VanduoDocSearch = Search; // New name compatibility\n\n})();\n", "/**\n * Vanduo Framework - Draggable Component\n * JavaScript functionality for draggable elements and drop zones\n */\n\n(function () {\n 'use strict';\n\n /**\n * Draggable Component\n */\n const Draggable = {\n // Store initialized draggables and their cleanup functions\n instances: new Map(),\n // Store current drag state\n currentDrag: null,\n // Store touch state\n touchState: null,\n // Feedback element\n feedbackElement: null,\n // Shared selector used by init and touch reorder\n containerSelector: '.vd-draggable-container, .vd-draggable-container-vertical',\n\n /**\n * Initialize draggable components\n */\n init: function (root) {\n const draggables = window.Vanduo.queryAll(root, '.vd-draggable, [data-draggable]');\n\n draggables.forEach(element => {\n if (this.instances.has(element)) {\n return;\n }\n this.initDraggable(element);\n });\n\n const containers = window.Vanduo.queryAll(root, this.containerSelector);\n containers.forEach(container => {\n if (!this.instances.has(container)) {\n this.initContainer(container);\n }\n });\n\n const dropZones = window.Vanduo.queryAll(root, '.vd-drop-zone');\n dropZones.forEach(zone => {\n if (!this.instances.has(zone)) {\n this.initDropZone(zone);\n }\n });\n\n this.createFeedbackElement();\n },\n\n /**\n * Initialize a single draggable element\n * @param {HTMLElement} element - Draggable element\n */\n initDraggable: function (element) {\n const cleanupFunctions = [];\n\n // Make element draggable if not already\n if (!element.hasAttribute('draggable')) {\n element.setAttribute('draggable', 'true');\n }\n\n // Accessibility: add ARIA attributes\n if (!element.hasAttribute('tabindex')) {\n element.setAttribute('tabindex', '0');\n }\n element.setAttribute('role', 'option');\n element.setAttribute('aria-roledescription', 'draggable item');\n element.setAttribute('aria-grabbed', 'false');\n\n // Handle drag start\n const dragStartHandler = (e) => {\n this.handleDragStart(e, element);\n };\n element.addEventListener('dragstart', dragStartHandler);\n cleanupFunctions.push(() => element.removeEventListener('dragstart', dragStartHandler));\n\n // Handle drag\n const dragHandler = (e) => {\n this.handleDrag(e, element);\n };\n element.addEventListener('drag', dragHandler);\n cleanupFunctions.push(() => element.removeEventListener('drag', dragHandler));\n\n // Handle drag end\n const dragEndHandler = (e) => {\n this.handleDragEnd(e, element);\n };\n element.addEventListener('dragend', dragEndHandler);\n cleanupFunctions.push(() => element.removeEventListener('dragend', dragEndHandler));\n\n // Handle touch start (for mobile)\n const touchStartHandler = (e) => {\n this.handleTouchStart(e, element);\n };\n element.addEventListener('touchstart', touchStartHandler);\n cleanupFunctions.push(() => element.removeEventListener('touchstart', touchStartHandler));\n\n // Handle touch move (for mobile)\n // { passive: false } is required so that e.preventDefault() works\n // once the drag threshold is reached \u2014 without it, modern browsers\n // treat the listener as passive and silently ignore preventDefault().\n const touchMoveHandler = (e) => {\n this.handleTouchMove(e, element);\n };\n element.addEventListener('touchmove', touchMoveHandler, { passive: false });\n cleanupFunctions.push(() => element.removeEventListener('touchmove', touchMoveHandler));\n\n // Handle touch end (for mobile)\n const touchEndHandler = (e) => {\n this.handleTouchEnd(e, element);\n };\n element.addEventListener('touchend', touchEndHandler, { passive: false });\n cleanupFunctions.push(() => element.removeEventListener('touchend', touchEndHandler));\n\n // Handle touch cancel (for mobile)\n const touchCancelHandler = (e) => {\n this.handleTouchEnd(e, element);\n };\n element.addEventListener('touchcancel', touchCancelHandler);\n cleanupFunctions.push(() => element.removeEventListener('touchcancel', touchCancelHandler));\n\n // Keyboard navigation\n const keydownHandler = (e) => {\n this.handleKeydown(e, element);\n };\n element.addEventListener('keydown', keydownHandler);\n cleanupFunctions.push(() => element.removeEventListener('keydown', keydownHandler));\n\n this.instances.set(element, { cleanup: cleanupFunctions });\n },\n\n /**\n * Initialize a draggable container\n * @param {HTMLElement} container - Draggable container\n */\n initContainer: function (container) {\n // Accessibility: add ARIA role to container\n container.setAttribute('role', 'listbox');\n container.setAttribute('aria-label', container.getAttribute('aria-label') || 'Draggable items');\n\n const items = container.querySelectorAll('.vd-draggable-item');\n items.forEach(item => {\n if (!this.instances.has(item)) {\n this.initDraggable(item);\n }\n });\n\n const cleanupFunctions = [];\n\n // Handle drag enter\n const dragEnterHandler = (e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n };\n\n // Handle drag over for auto-sorting\n const dragOverHandler = (e) => {\n e.preventDefault(); // Necessary to allow drop\n e.dataTransfer.dropEffect = 'move';\n\n if (!this.currentDrag) return;\n const draggingEl = this.currentDrag.element;\n\n // Only reorder if dragging an item that belongs to this container (or if we support cross-container drag, but keep simple)\n if (!container.contains(draggingEl)) return;\n\n // Prevent jumps when the dragging finalizes with 0,0 coordinates near the end\n if (e.clientX === 0 && e.clientY === 0) return;\n\n this.handleReorder(container, draggingEl, e.clientX, e.clientY);\n };\n\n // Handle drop\n const dropHandler = (e) => {\n e.preventDefault(); // crucial to prevent the browser's default handling and snapping back\n };\n\n container.addEventListener('dragenter', dragEnterHandler);\n container.addEventListener('dragover', dragOverHandler);\n container.addEventListener('drop', dropHandler);\n\n cleanupFunctions.push(() => {\n container.removeEventListener('dragenter', dragEnterHandler);\n container.removeEventListener('dragover', dragOverHandler);\n container.removeEventListener('drop', dropHandler);\n });\n\n this.instances.set(container, { cleanup: cleanupFunctions });\n },\n\n /**\n * Initialize a drop zone\n * @param {HTMLElement} zone - Drop zone element\n */\n initDropZone: function (zone) {\n const cleanupFunctions = [];\n\n // Accessibility: add ARIA role to drop zone\n zone.setAttribute('role', 'region');\n zone.setAttribute('aria-dropeffect', 'move');\n if (!zone.hasAttribute('aria-label')) {\n zone.setAttribute('aria-label', 'Drop zone');\n }\n\n // Handle drag over\n const dragOverHandler = (e) => {\n e.preventDefault();\n this.handleDragOver(e, zone);\n };\n zone.addEventListener('dragover', dragOverHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragover', dragOverHandler));\n\n // Handle drag enter\n const dragEnterHandler = (e) => {\n e.preventDefault();\n this.handleDragEnter(e, zone);\n };\n zone.addEventListener('dragenter', dragEnterHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragenter', dragEnterHandler));\n\n // Handle drag leave\n const dragLeaveHandler = (e) => {\n this.handleDragLeave(e, zone);\n };\n zone.addEventListener('dragleave', dragLeaveHandler);\n cleanupFunctions.push(() => zone.removeEventListener('dragleave', dragLeaveHandler));\n\n // Handle drop\n const dropHandler = (e) => {\n e.preventDefault();\n this.handleDrop(e, zone);\n };\n zone.addEventListener('drop', dropHandler);\n cleanupFunctions.push(() => zone.removeEventListener('drop', dropHandler));\n\n this.instances.set(zone, { cleanup: cleanupFunctions });\n },\n\n /**\n * Create feedback element for drag operations\n */\n createFeedbackElement: function () {\n if (!this.feedbackElement) {\n // Reuse existing element if present\n const existing = document.querySelector('.vd-drag-feedback');\n if (existing) {\n this.feedbackElement = existing;\n return;\n }\n\n this.feedbackElement = document.createElement('div');\n this.feedbackElement.className = 'vd-drag-feedback hidden';\n this.feedbackElement.setAttribute('role', 'presentation');\n document.body.appendChild(this.feedbackElement);\n }\n },\n\n /**\n * Handle drag start event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDragStart: function (e, element) {\n // Add dragging class\n element.classList.add('is-dragging');\n\n // Accessibility: update aria-grabbed\n element.setAttribute('aria-grabbed', 'true');\n\n // Store drag state\n this.currentDrag = {\n element: element,\n initialPosition: { x: e.clientX, y: e.clientY },\n initialBounds: element.getBoundingClientRect(),\n data: this.getData(element)\n };\n\n // Set drag data\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', this.currentDrag.data);\n\n // We no longer suppress the native ghost image or manually update feedback\n // for mouse drags, relying on the browser's native rendering instead.\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:start', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: e.clientX, y: e.clientY }\n }\n }));\n },\n\n /**\n * Handle drag event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDrag: function (e, element) {\n // Guard against null state (race condition on fast interactions)\n if (!this.currentDrag) return;\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:drag', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: e.clientX, y: e.clientY },\n delta: {\n x: e.clientX - this.currentDrag.initialPosition.x,\n y: e.clientY - this.currentDrag.initialPosition.y\n }\n }\n }));\n },\n\n /**\n * Handle drag end event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} element - Draggable element\n */\n handleDragEnd: function (e, element) {\n // Remove dragging class\n element.classList.remove('is-dragging');\n element.classList.add('is-dropped');\n setTimeout(() => element.classList.remove('is-dropped'), 300);\n\n // Accessibility: update aria-grabbed\n element.setAttribute('aria-grabbed', 'false');\n\n // Hide feedback\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n\n // Guard against null state\n const data = this.currentDrag?.data || this.getData(element);\n const initialPos = this.currentDrag?.initialPosition || { x: 0, y: 0 };\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:end', {\n bubbles: true,\n detail: {\n element: element,\n data: data,\n position: { x: e.clientX, y: e.clientY },\n delta: {\n x: e.clientX - initialPos.x,\n y: e.clientY - initialPos.y\n }\n }\n }));\n\n // Reset drag state\n this.currentDrag = null;\n },\n\n /**\n * Handle touch start event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchStart: function (e, element) {\n // Don't prevent default here \u2014 it blocks scrolling.\n // We only prevent default in touchmove once drag threshold is reached.\n const touch = e.touches[0];\n const rect = element.getBoundingClientRect();\n this.touchState = {\n element: element,\n startX: touch.clientX,\n startY: touch.clientY,\n lastX: touch.clientX,\n lastY: touch.clientY,\n // Keep preview anchored to the original grab point.\n offsetX: touch.clientX - rect.left,\n offsetY: touch.clientY - rect.top,\n startTime: Date.now(),\n isDragging: false\n };\n },\n\n /**\n * Handle touch move event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchMove: function (e, element) {\n if (!this.touchState) return;\n\n const touch = e.touches[0];\n this.touchState.lastX = touch.clientX;\n this.touchState.lastY = touch.clientY;\n const deltaX = touch.clientX - this.touchState.startX;\n const deltaY = touch.clientY - this.touchState.startY;\n\n // Only start dragging if moved a minimum distance\n if (Math.abs(deltaX) > 10 || Math.abs(deltaY) > 10) {\n // Now we know it's a drag, not a scroll \u2014 prevent default\n if (e.cancelable) e.preventDefault();\n\n if (!this.touchState.isDragging) {\n this.touchState.isDragging = true;\n element.classList.add('is-dragging');\n element.setAttribute('aria-grabbed', 'true');\n\n // Store drag state\n this.currentDrag = {\n element: element,\n initialPosition: { x: this.touchState.startX, y: this.touchState.startY },\n initialBounds: element.getBoundingClientRect(),\n data: this.getData(element),\n // Preserve where inside the element the drag started for accurate ghost positioning.\n offsetX: this.touchState.offsetX,\n offsetY: this.touchState.offsetY\n };\n\n // Dispatch event\n element.dispatchEvent(new CustomEvent('draggable:start', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: touch.clientX, y: touch.clientY }\n }\n }));\n }\n\n // Update feedback\n this.updateFeedback(touch.clientX, touch.clientY);\n\n // Dispatch event\n if (this.currentDrag) {\n element.dispatchEvent(new CustomEvent('draggable:drag', {\n bubbles: true,\n detail: {\n element: element,\n data: this.currentDrag.data,\n position: { x: touch.clientX, y: touch.clientY },\n delta: { x: deltaX, y: deltaY }\n }\n }));\n\n this.updateTouchDropZone(touch.clientX, touch.clientY);\n\n // Reorder for touch\n const container = element.closest(this.containerSelector);\n if (container && container.contains(element)) {\n this.handleReorder(container, element, touch.clientX, touch.clientY);\n }\n }\n }\n },\n\n /**\n * Handle touch end event (for mobile)\n * @param {TouchEvent} e - Touch event\n * @param {HTMLElement} element - Draggable element\n */\n handleTouchEnd: function (e, element) {\n if (this.touchState && this.touchState.isDragging) {\n if (e.cancelable) e.preventDefault();\n const endTouch = e.changedTouches?.[0];\n const endPosition = {\n x: endTouch?.clientX ?? this.touchState.lastX ?? this.touchState.startX,\n y: endTouch?.clientY ?? this.touchState.lastY ?? this.touchState.startY\n };\n\n const dropZone = this.resolveDropZoneAtPoint(endPosition.x, endPosition.y) || this.touchState.overZone;\n if (dropZone) {\n this.dispatchDrop(dropZone, endPosition);\n } else if (this.touchState.overZone) {\n this.touchState.overZone.classList.remove('is-drag-over');\n }\n\n element.classList.remove('is-dragging');\n element.classList.add('is-dropped');\n element.setAttribute('aria-grabbed', 'false');\n setTimeout(() => element.classList.remove('is-dropped'), 300);\n\n // Hide feedback\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n\n // Dispatch event\n const data = this.currentDrag?.data || this.getData(element);\n const startX = this.touchState?.startX || 0;\n const startY = this.touchState?.startY || 0;\n\n element.dispatchEvent(new CustomEvent('draggable:end', {\n bubbles: true,\n detail: {\n element: element,\n data: data,\n position: endPosition,\n delta: {\n x: endPosition.x - startX,\n y: endPosition.y - startY\n }\n }\n }));\n }\n\n // Reset states\n this.touchState = null;\n this.currentDrag = null;\n },\n\n /**\n * Handle drag over event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} _zone - Drop zone element\n */\n handleDragOver: function (e, _zone) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n },\n\n /**\n * Handle drag enter event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDragEnter: function (e, zone) {\n e.preventDefault();\n zone.classList.add('is-drag-over');\n },\n\n /**\n * Handle drag leave event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDragLeave: function (e, zone) {\n zone.classList.remove('is-drag-over');\n },\n\n /**\n * Handle drop event\n * @param {DragEvent} e - Drag event\n * @param {HTMLElement} zone - Drop zone element\n */\n handleDrop: function (e, zone) {\n e.preventDefault();\n this.dispatchDrop(zone, { x: e.clientX, y: e.clientY });\n },\n\n /**\n * Resolve a drop zone from viewport coordinates\n * @param {number} x\n * @param {number} y\n * @returns {HTMLElement|null}\n */\n resolveDropZoneAtPoint: function (x, y) {\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n\n // Prefer the full stacking list so overlays/top elements don't hide real drop targets.\n if (typeof document.elementsFromPoint === 'function') {\n const stacked = document.elementsFromPoint(x, y);\n for (const element of stacked) {\n const zone = element.closest('.vd-drop-zone');\n if (zone) return zone;\n }\n }\n\n const target = document.elementFromPoint(x, y);\n const targetZone = target ? target.closest('.vd-drop-zone') : null;\n if (targetZone) return targetZone;\n\n // Last-resort fallback for mobile emulation edge cases.\n const zones = document.querySelectorAll('.vd-drop-zone');\n for (const zone of zones) {\n const rect = zone.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n return zone;\n }\n }\n\n return null;\n },\n\n /**\n * Track and update active drop-zone hover state on touch devices\n * @param {number} x\n * @param {number} y\n */\n updateTouchDropZone: function (x, y) {\n if (!this.touchState) return;\n\n const nextZone = this.resolveDropZoneAtPoint(x, y);\n const prevZone = this.touchState.overZone || null;\n\n if (prevZone && prevZone !== nextZone) {\n prevZone.classList.remove('is-drag-over');\n }\n\n if (nextZone && nextZone !== prevZone) {\n nextZone.classList.add('is-drag-over');\n }\n\n this.touchState.overZone = nextZone || null;\n },\n\n /**\n * Dispatch a normalized drop event for mouse and touch flows\n * @param {HTMLElement} zone\n * @param {{x:number, y:number}} position\n */\n dispatchDrop: function (zone, position) {\n zone.classList.remove('is-drag-over');\n zone.dispatchEvent(new CustomEvent('draggable:drop', {\n bubbles: true,\n detail: {\n zone: zone,\n element: this.currentDrag?.element,\n data: this.currentDrag?.data,\n position: position\n }\n }));\n },\n\n /**\n * Reorder elements in container based on cursor position\n * @param {HTMLElement} container \n * @param {HTMLElement} element \n * @param {number} clientX \n * @param {number} clientY \n */\n handleReorder: function (container, element, clientX, clientY) {\n const isVertical = container.classList.contains('vd-draggable-container-vertical');\n const siblings = [...container.querySelectorAll('.vd-draggable-item:not(.is-dragging), .vd-draggable:not(.is-dragging)')];\n\n const nextSibling = siblings.reduce((closest, child) => {\n const box = child.getBoundingClientRect();\n const offset = isVertical\n ? clientY - box.top - box.height / 2\n : clientX - box.left - box.width / 2;\n\n if (offset < 0 && offset > closest.offset) {\n return { offset: offset, element: child };\n } else {\n return closest;\n }\n }, { offset: Number.NEGATIVE_INFINITY }).element;\n\n if (nextSibling == null) {\n container.appendChild(element);\n } else {\n container.insertBefore(element, nextSibling);\n }\n },\n\n /**\n * Handle keyboard events\n * @param {KeyboardEvent} e - Keyboard event\n * @param {HTMLElement} element - Draggable element\n */\n handleKeydown: function (e, element) {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n // Trigger click or custom action\n element.click();\n break;\n case 'Escape':\n // Cancel drag if in progress\n if (element.classList.contains('is-dragging')) {\n element.classList.remove('is-dragging');\n element.setAttribute('aria-grabbed', 'false');\n if (this.feedbackElement) {\n this.feedbackElement.classList.add('hidden');\n }\n this.currentDrag = null;\n }\n break;\n case 'ArrowUp':\n case 'ArrowLeft': {\n e.preventDefault();\n const prev = element.previousElementSibling;\n if (prev && (prev.classList.contains('vd-draggable') || prev.classList.contains('vd-draggable-item'))) {\n element.parentNode.insertBefore(element, prev);\n element.focus();\n element.dispatchEvent(new CustomEvent('draggable:reorder', {\n bubbles: true,\n detail: { element: element, direction: 'up' }\n }));\n }\n break;\n }\n case 'ArrowDown':\n case 'ArrowRight': {\n e.preventDefault();\n const next = element.nextElementSibling;\n if (next && (next.classList.contains('vd-draggable') || next.classList.contains('vd-draggable-item'))) {\n element.parentNode.insertBefore(next, element);\n element.focus();\n element.dispatchEvent(new CustomEvent('draggable:reorder', {\n bubbles: true,\n detail: { element: element, direction: 'down' }\n }));\n }\n break;\n }\n }\n },\n\n /**\n * Get data from draggable element\n * @param {HTMLElement} element - Draggable element\n * @returns {string} Data associated with the element\n */\n getData: function (element) {\n return element.dataset.draggable || element.textContent.trim();\n },\n\n /**\n * Update drag feedback element\n * @param {number} x - Current X coordinate\n * @param {number} y - Current Y coordinate\n */\n updateFeedback: function (x, y) {\n if (!this.currentDrag) return;\n\n // Show feedback\n this.feedbackElement.classList.remove('hidden');\n\n // Update feedback content\n const rect = this.currentDrag.initialBounds;\n this.feedbackElement.innerHTML = '';\n const clone = this.currentDrag.element.cloneNode(true);\n this.feedbackElement.appendChild(clone);\n\n // Set styles\n const offsetX = this.currentDrag.offsetX ?? 20;\n const offsetY = this.currentDrag.offsetY ?? 20;\n Object.assign(this.feedbackElement.style, {\n left: (x - offsetX) + 'px',\n top: (y - offsetY) + 'px',\n width: rect.width + 'px',\n height: rect.height + 'px'\n });\n },\n\n /**\n * Make an element draggable programmatically\n * @param {HTMLElement|string} element - Element or selector\n * @param {Object} options - Configuration options\n */\n makeDraggable: function (element, options = {}) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n\n if (el && !this.instances.has(el)) {\n // Add classes and attributes\n el.classList.add('vd-draggable');\n el.setAttribute('draggable', 'true');\n\n // Set options\n if (options.data) {\n el.dataset.draggable = options.data;\n }\n\n // Initialize\n this.initDraggable(el);\n }\n },\n\n /**\n * Remove draggable functionality from an element\n * @param {HTMLElement|string} element - Element or selector\n */\n removeDraggable: function (element) {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n\n if (el && this.instances.has(el)) {\n // Clean up\n const instance = this.instances.get(el);\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n\n // Remove classes and attributes\n el.classList.remove('vd-draggable');\n el.removeAttribute('draggable');\n el.removeAttribute('data-draggable');\n }\n },\n\n /**\n * Destroy a draggable instance and clean up event listeners\n * @param {HTMLElement} element - Draggable element\n */\n destroy: function (element) {\n this.removeDraggable(element);\n },\n\n /**\n * Destroy all draggable instances\n */\n destroyAll: function () {\n const instances = Array.from(this.instances.keys());\n instances.forEach(element => this.destroy(element));\n }\n };\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('draggable', Draggable);\n }\n\n // Expose globally\n window.VanduoDraggable = Draggable;\n})();\n", "/**\n * Vanduo Framework \u2013 LazyLoad Component\n * v1.2.1\n *\n * Provides two levels of API:\n *\n * LOW-LEVEL (generic IntersectionObserver wrapper)\n * VanduoLazyLoad.observe(element, callback, options?)\n * VanduoLazyLoad.unobserve(element)\n * VanduoLazyLoad.unobserveAll()\n *\n * HIGH-LEVEL (HTML-section fetcher, mirrors vanduo-docs SPA behaviour)\n * VanduoLazyLoad.loadSection(url, containerEl, options?)\n * options: { placeholder, threshold, rootMargin, onLoaded, onError }\n * placeholder: 'skeleton' | 'spinner' | HTMLString (default: 'skeleton')\n *\n * ATTRIBUTE-DRIVEN (zero-JS usage, wired by init())\n * <div data-vd-lazy=\"./path/to/section.html\"\n * data-vd-lazy-placeholder=\"skeleton|spinner\">\u2026</div>\n *\n * EVENTS dispatched on the host element:\n * lazysection:loading \u2014 fetch started\n * lazysection:loaded \u2014 content injected\n * lazysection:error \u2014 fetch failed\n */\n\n(function () {\n 'use strict';\n\n /* \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /** @type {Map<Element, IntersectionObserver>} */\n const _observerMap = new Map();\n\n function _isRoot(root) {\n return !!root && (root === document || root.nodeType === 1 || root.nodeType === 9 || root.nodeType === 11);\n }\n\n function _normalizeRoot(root) {\n return _isRoot(root) ? root : document;\n }\n\n function _isInRoot(root, element) {\n const scope = _normalizeRoot(root);\n if (!(element instanceof Element)) return false;\n if (scope === document) {\n return document.documentElement ? document.documentElement.contains(element) : document.contains(element);\n }\n if (scope === element) return true;\n return typeof scope.contains === 'function' && scope.contains(element);\n }\n\n function _queryAll(root, selector) {\n const scope = _normalizeRoot(root);\n const matches = [];\n\n if (scope instanceof Element && typeof scope.matches === 'function' && scope.matches(selector)) {\n matches.push(scope);\n }\n\n if (typeof scope.querySelectorAll === 'function') {\n const descendants = scope.querySelectorAll(selector);\n for (let i = 0; i < descendants.length; i++) {\n matches.push(descendants[i]);\n }\n }\n\n return matches;\n }\n\n /* \u2500\u2500 Security helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Returns true only if `url` resolves to the same origin as the page\n * (relative paths and same-origin absolute URLs are allowed).\n * Cross-origin URLs are rejected to prevent SSRF-style fetch abuse.\n * @param {string} url\n * @returns {boolean}\n */\n function _isSafeUrl(url) {\n try {\n // Relative URLs (no origin) are always safe\n const resolved = new URL(url, window.location.href);\n return resolved.origin === window.location.origin;\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Safely inject fetched HTML into a container by parsing it with\n * DOMParser (avoids script execution) and replacing children via\n * standard DOM APIs instead of raw innerHTML assignment.\n * @param {Element} containerEl\n * @param {string} html\n */\n function _safeInjectHtml(containerEl, html) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html.trim(), 'text/html'); // CodeQL [js/xss-through-dom] Intentional: parsed nodes are sanitized below before adoption into live DOM\n\n const DANGEROUS_TAGS = ['SCRIPT', 'IFRAME', 'OBJECT', 'EMBED', 'FORM', 'BASE', 'LINK', 'META', 'STYLE'];\n for (const tag of DANGEROUS_TAGS) {\n const els = doc.querySelectorAll(tag);\n for (let i = els.length - 1; i >= 0; i--) {\n els[i].parentNode.removeChild(els[i]);\n }\n }\n\n // Strip dangerous attributes (e.g. onerror, javascript: urls) from all elements\n function _sanitizeNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const attrs = node.attributes;\n for (let i = attrs.length - 1; i >= 0; i--) {\n const attrName = attrs[i].name.toLowerCase();\n const attrValue = attrs[i].value.toLowerCase();\n const trimmedValue = attrValue.trim();\n if (\n attrName.startsWith('on') ||\n trimmedValue.startsWith('javascript:') ||\n trimmedValue.startsWith('data:') ||\n trimmedValue.startsWith('vbscript:')\n ) {\n node.removeAttribute(attrs[i].name);\n }\n }\n const children = node.childNodes;\n for (let i = 0; i < children.length; i++) {\n _sanitizeNode(children[i]);\n }\n }\n }\n _sanitizeNode(doc.body);\n\n // Collect all top-level body children\n const nodes = Array.from(doc.body.childNodes);\n // Clear container and append parsed nodes\n while (containerEl.firstChild) {\n containerEl.removeChild(containerEl.firstChild);\n }\n nodes.forEach(function (node) {\n containerEl.appendChild(document.adoptNode(node));\n });\n }\n\n /* \u2500\u2500 Placeholder HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n function _skeletonHtml() {\n return '<div class=\"vd-skeleton-card\" style=\"position:relative;min-height:200px;padding:2rem;overflow:hidden;\">'\n + '<div class=\"vd-skeleton vd-skeleton-heading-lg\" style=\"margin-bottom:1.5rem;\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-paragraph\">'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div>'\n + '<div class=\"vd-skeleton vd-skeleton-text\"></div></div>'\n + '<div class=\"vd-dynamic-loader\" style=\"position:absolute;inset:0;\">'\n + '<div class=\"vd-dynamic-loader-grid\">'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-success\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-warning\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-error\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-info\"></div></div>'\n + '<span class=\"vd-dynamic-loader-text\">Loading\u2026</span></div></div>';\n }\n\n function _spinnerHtml() {\n return '<div class=\"vd-dynamic-loader\" style=\"min-height:180px;display:flex;align-items:center;justify-content:center;\">'\n + '<div class=\"vd-dynamic-loader-grid\">'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-success\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-warning\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-error\"></div>'\n + '<div class=\"vd-spinner vd-spinner-sm vd-spinner-info\"></div></div>'\n + '<span class=\"vd-dynamic-loader-text\">Loading\u2026</span></div>';\n }\n\n function _resolvePlaceholder(placeholder) {\n if (!placeholder || placeholder === 'skeleton') return _skeletonHtml();\n if (placeholder === 'spinner') return _spinnerHtml();\n // Caller-supplied HTML string\n return placeholder;\n }\n\n /* \u2500\u2500 Dispatch helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n function _dispatch(el, eventName, detail) {\n el.dispatchEvent(new CustomEvent(eventName, { bubbles: true, detail: detail || {} }));\n }\n\n /* \u2500\u2500 VanduoLazyLoad \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const VanduoLazyLoad = {\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * LOW-LEVEL API\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Observe an element. `callback` is invoked once when the element\n * enters the viewport, then the element is automatically unobserved.\n *\n * @param {Element} element\n * @param {function(Element): void} callback\n * @param {{ threshold?: number, rootMargin?: string }} [options]\n */\n observe: function (element, callback, options) {\n if (!(element instanceof Element)) {\n console.warn('[VanduoLazyLoad] observe() requires a DOM Element.');\n return;\n }\n if (typeof callback !== 'function') {\n console.warn('[VanduoLazyLoad] observe() requires a callback function.');\n return;\n }\n // Already observed \u2014 ignore\n if (_observerMap.has(element)) return;\n\n const threshold = (options && options.threshold != null) ? options.threshold : 0;\n const rootMargin = (options && options.rootMargin) ? options.rootMargin : '0px';\n\n const observer = new IntersectionObserver(function (entries, obs) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n obs.unobserve(entry.target);\n _observerMap.delete(entry.target);\n if (typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.has(entry.target, 'lazyLoad')) {\n window.VanduoLifecycle.unregister(entry.target, 'lazyLoad');\n }\n try {\n callback(entry.target);\n } catch (e) {\n console.error('[VanduoLazyLoad] Callback threw:', e);\n }\n }\n });\n }, { threshold: threshold, rootMargin: rootMargin });\n\n _observerMap.set(element, observer);\n if (typeof window.VanduoLifecycle !== 'undefined' && !window.VanduoLifecycle.has(element, 'lazyLoad')) {\n window.VanduoLifecycle.register(element, 'lazyLoad', [() => {\n VanduoLazyLoad.unobserve(element, { skipLifecycle: true });\n }]);\n }\n observer.observe(element);\n },\n\n /**\n * Stop observing an element that was previously passed to observe().\n * @param {Element} element\n */\n unobserve: function (element, options) {\n const opts = options || {};\n const observer = _observerMap.get(element);\n if (observer) {\n observer.unobserve(element);\n if (typeof observer.disconnect === 'function') {\n observer.disconnect();\n }\n _observerMap.delete(element);\n }\n\n if (!opts.skipLifecycle && typeof window.VanduoLifecycle !== 'undefined' && window.VanduoLifecycle.has(element, 'lazyLoad')) {\n window.VanduoLifecycle.unregister(element, 'lazyLoad');\n }\n },\n\n /**\n * Stop observing ALL currently observed elements.\n */\n unobserveAll: function () {\n const observed = Array.from(_observerMap.keys());\n observed.forEach(function (element) {\n VanduoLazyLoad.unobserve(element);\n });\n },\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * HIGH-LEVEL API\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Fetch an HTML partial and inject it into `containerEl` when the\n * container enters the viewport. A placeholder is shown immediately.\n *\n * @param {string} url URL of the HTML partial to fetch\n * @param {Element} containerEl Target element whose content will be replaced\n * @param {{\n * placeholder?: 'skeleton'|'spinner'|string,\n * threshold?: number,\n * rootMargin?: string,\n * onLoaded?: function(Element): void,\n * onError?: function(Error): void\n * }} [options]\n */\n loadSection: function (url, containerEl, options) {\n if (typeof url !== 'string' || !url) {\n console.warn('[VanduoLazyLoad] loadSection() requires a non-empty URL string.');\n return;\n }\n if (!(containerEl instanceof Element)) {\n console.warn('[VanduoLazyLoad] loadSection() requires a DOM Element as containerEl.');\n return;\n }\n // Reject cross-origin URLs to prevent SSRF-style fetch abuse\n if (!_isSafeUrl(url)) {\n console.error('[VanduoLazyLoad] loadSection() blocked cross-origin URL:', url);\n return;\n }\n\n const opts = options || {};\n // Placeholders are known-safe static HTML strings built internally\n const placeholderHtml = _resolvePlaceholder(opts.placeholder);\n\n // Use _safeInjectHtml instead of innerHTML to prevent XSS from caller-supplied placeholders\n _safeInjectHtml(containerEl, placeholderHtml);\n _dispatch(containerEl, 'lazysection:loading', { url: url });\n\n // Fetch when visible\n this.observe(containerEl, function () {\n const controller = new window.AbortController();\n const timeoutId = setTimeout(function () { controller.abort(); }, 10000);\n\n window.fetch(url, { signal: controller.signal })\n .then(function (res) {\n clearTimeout(timeoutId);\n if (!res.ok) throw new Error('HTTP ' + res.status);\n return res.text();\n })\n .then(function (html) {\n // Use DOMParser to parse fetched content safely, avoiding\n // raw innerHTML assignment of externally-sourced strings\n _safeInjectHtml(containerEl, html);\n _dispatch(containerEl, 'lazysection:loaded', { url: url });\n // Re-init Vanduo components only inside the injected subtree\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.init(containerEl);\n }\n if (typeof opts.onLoaded === 'function') {\n opts.onLoaded(containerEl);\n }\n })\n .catch(function (err) {\n // Build error node via DOM APIs \u2014 no dynamic HTML strings\n const alertEl = document.createElement('div');\n alertEl.className = 'vd-alert vd-alert-error';\n alertEl.setAttribute('role', 'alert');\n const msgEl = document.createElement('span');\n msgEl.textContent = 'Failed to load content. ';\n const detailEl = document.createElement('small');\n detailEl.style.opacity = '0.7';\n detailEl.textContent = err.message;\n alertEl.appendChild(msgEl);\n alertEl.appendChild(detailEl);\n while (containerEl.firstChild) {\n containerEl.removeChild(containerEl.firstChild);\n }\n containerEl.appendChild(alertEl);\n _dispatch(containerEl, 'lazysection:error', { url: url, error: err });\n console.error('[VanduoLazyLoad] loadSection failed:', err);\n if (typeof opts.onError === 'function') {\n opts.onError(err);\n }\n });\n }, { threshold: opts.threshold, rootMargin: opts.rootMargin });\n },\n\n /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * ATTRIBUTE-DRIVEN INIT\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Scan the DOM for [data-vd-lazy] elements and wire them up.\n * Safe to call multiple times \u2014 already-observed elements are skipped.\n */\n init: function (root) {\n const self = this;\n const elements = _queryAll(root, '[data-vd-lazy]');\n elements.forEach(function (el) {\n // Skip already-observed or already-loaded elements\n if (_observerMap.has(el) || el.dataset.vdLazyState === 'loading' || el.dataset.vdLazyState === 'loaded') return;\n\n const url = el.getAttribute('data-vd-lazy');\n if (!url) return;\n\n el.dataset.vdLazyState = 'loading';\n const placeholder = el.getAttribute('data-vd-lazy-placeholder') || 'skeleton';\n\n self.loadSection(url, el, {\n placeholder: placeholder,\n onLoaded: function () {\n el.dataset.vdLazyState = 'loaded';\n },\n onError: function () {\n el.dataset.vdLazyState = 'error';\n }\n });\n });\n },\n\n destroy: function (element) {\n this.unobserve(element);\n },\n\n destroyAll: function (root) {\n const scope = _normalizeRoot(root);\n\n if (scope === document) {\n this.unobserveAll();\n return;\n }\n\n const observed = Array.from(_observerMap.keys());\n observed.forEach((element) => {\n if (_isInRoot(scope, element)) {\n this.unobserve(element);\n }\n });\n }\n };\n\n /* \u2500\u2500 Register with Vanduo \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('lazyLoad', VanduoLazyLoad, { aliases: ['LazyLoad'] });\n }\n\n /* \u2500\u2500 Global convenience alias \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n window.VanduoLazyLoad = VanduoLazyLoad;\n\n})();\n", "/**\n * Vanduo Framework - Glass Scroll Activation\n * Generic scroll-aware glass activation via IntersectionObserver.\n *\n * Usage:\n * Add `data-glass-scroll` to any element carrying a `.vd-glass*` class.\n * By default the previous sibling is used as the sentinel.\n * Point to a custom sentinel via `data-glass-sentinel=\"<CSS selector>\"`.\n *\n * Behaviour:\n * - Adds `.is-glass-active` when the sentinel leaves the viewport (scrolled past).\n * - Removes `.is-glass-active` when the sentinel re-enters the viewport.\n */\n(function () {\n 'use strict';\n\n const GlassScroll = {\n /** @type {Map<Element, IntersectionObserver>} */\n observers: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '[data-glass-scroll]').forEach(el => {\n if (this.observers.has(el)) return;\n this.initElement(el);\n });\n },\n\n /**\n * Wire up a single scroll-activated glass element.\n * @param {HTMLElement} el\n */\n initElement: function (el) {\n const sentinelSelector = el.dataset.glassSentinel;\n let sentinel;\n\n if (sentinelSelector) {\n sentinel = document.querySelector(sentinelSelector);\n }\n\n if (!sentinel) {\n // Fall back to the previous sibling element\n sentinel = el.previousElementSibling;\n }\n\n if (!sentinel) {\n // No sentinel available \u2014 activate immediately so glass is always shown\n el.classList.add('is-glass-active');\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n // Active when sentinel is NOT intersecting (scrolled past it)\n el.classList.toggle('is-glass-active', !entry.isIntersecting);\n });\n },\n { threshold: 0, rootMargin: '0px' }\n );\n\n observer.observe(sentinel);\n this.observers.set(el, observer);\n },\n\n /**\n * Disconnect and remove a single element's observer.\n * @param {HTMLElement} el\n */\n destroy: function (el) {\n const observer = this.observers.get(el);\n if (observer) {\n observer.disconnect();\n this.observers.delete(el);\n }\n },\n\n destroyAll: function () {\n this.observers.forEach((observer, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('glassScroll', GlassScroll);\n }\n\n window.VanduoGlassScroll = GlassScroll;\n})();\n", "/**\n * Vanduo Framework - Water Morph Effect Component\n * Liquid wave content-swap animation on click\n *\n * Usage:\n * Add .vd-morph or [data-vd-morph] to any element.\n * Provide .vd-morph-content.vd-morph-current and .vd-morph-content.vd-morph-next children.\n * Wave and shine layers are auto-created if absent.\n *\n * JS API:\n * VanduoMorph.morph(el) \u2014 trigger morph programmatically (from center)\n * VanduoMorph.destroy(el) \u2014 tear down listeners for one element\n * VanduoMorph.destroyAll() \u2014 tear down all instances\n */\n\n(function () {\n 'use strict';\n\n const MORPH_DURATION_MS = 750;\n\n const Morph = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-morph, [data-vd-morph]');\n elements.forEach(function (el) {\n if (Morph.instances.has(el)) return;\n if (el.getAttribute('data-vd-morph') === 'manual') return;\n Morph.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n Morph._ensureLayers(el);\n\n const cleanup = [];\n let morphing = false;\n\n const handleClick = function (e) {\n if (morphing) return;\n Morph._runMorph(el, e, function () { morphing = false; });\n morphing = true;\n };\n\n el.addEventListener('click', handleClick);\n cleanup.push(function () { el.removeEventListener('click', handleClick); });\n\n this.instances.set(el, { cleanup: cleanup });\n },\n\n morph: function (el) {\n if (!el) return;\n if (!this.instances.has(el)) this.initInstance(el);\n this._runMorph(el, null, null);\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(function (fn) { fn(); });\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach(function (_, el) { Morph.destroy(el); });\n },\n\n /* \u2500\u2500 Internal helpers \u2500\u2500 */\n\n _ensureLayers: function (el) {\n if (!el.querySelector('.vd-morph-wave')) {\n const wave = document.createElement('span');\n wave.className = 'vd-morph-wave';\n wave.setAttribute('aria-hidden', 'true');\n el.insertBefore(wave, el.firstChild);\n }\n if (!el.querySelector('.vd-morph-shine')) {\n const shine = document.createElement('span');\n shine.className = 'vd-morph-shine';\n shine.setAttribute('aria-hidden', 'true');\n const waveEl = el.querySelector('.vd-morph-wave');\n if (waveEl && waveEl.nextSibling) {\n el.insertBefore(shine, waveEl.nextSibling);\n } else {\n el.insertBefore(shine, el.firstChild);\n }\n }\n },\n\n _runMorph: function (el, pointerEvent, onComplete) {\n const wave = el.querySelector('.vd-morph-wave');\n if (wave) {\n const rect = el.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const px = pointerEvent ? (pointerEvent.clientX || cx) : cx;\n const py = pointerEvent ? (pointerEvent.clientY || cy) : cy;\n wave.style.left = (px - rect.left) + 'px';\n wave.style.top = (py - rect.top) + 'px';\n }\n\n el.classList.add('is-morphing');\n\n let duration = MORPH_DURATION_MS;\n const custom = getComputedStyle(el).getPropertyValue('--vd-morph-duration');\n if (custom) {\n const parsed = parseFloat(custom);\n if (!isNaN(parsed)) duration = parsed * (custom.indexOf('ms') !== -1 ? 1 : 1000);\n }\n\n setTimeout(function () {\n el.classList.remove('is-morphing');\n\n const current = el.querySelector('.vd-morph-current');\n const next = el.querySelector('.vd-morph-next');\n if (current && next) {\n current.classList.remove('vd-morph-current');\n current.classList.add('vd-morph-next');\n next.classList.remove('vd-morph-next');\n next.classList.add('vd-morph-current');\n }\n\n if (typeof onComplete === 'function') onComplete();\n }, duration);\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('morph', Morph);\n }\n\n window.VanduoMorph = Morph;\n\n})();\n", "/**\n * Vanduo Framework \u2014 Expanding flex cards\n * Click / Enter / Space / Arrow keys to change the active card.\n *\n * Usage:\n * <div class=\"vd-expanding-cards\" data-vd-expanding-cards>\n * Use data-vd-expanding-cards=\"manual\" to skip auto-init.\n */\n\n(function () {\n 'use strict';\n\n const ExpandingCards = {\n instances: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-expanding-cards').forEach(function (el) {\n if (el.getAttribute('data-vd-expanding-cards') === 'manual') return;\n if (ExpandingCards.instances.has(el)) return;\n ExpandingCards.initContainer(el);\n });\n },\n\n initContainer: function (container) {\n const cleanup = [];\n\n const getCards = function () {\n return Array.prototype.slice.call(container.querySelectorAll('.vd-expanding-card'));\n };\n\n const setActive = function (card) {\n const cards = getCards();\n if (!card || cards.indexOf(card) === -1) return;\n cards.forEach(function (c) {\n c.classList.toggle('is-active', c === card);\n });\n card.focus({ preventScroll: true });\n };\n\n const onClick = function (e) {\n const t = e.target;\n const card = t.closest ? t.closest('.vd-expanding-card') : null;\n if (!card || !container.contains(card)) return;\n setActive(card);\n };\n\n const onKeydown = function (e) {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight' && e.key !== 'Home' && e.key !== 'End') {\n return;\n }\n const cards = getCards().filter(function (c) {\n return c.offsetParent !== null || c.getClientRects().length > 0;\n });\n if (!cards.length) return;\n const activeEl = document.activeElement;\n let idx = cards.indexOf(activeEl);\n if (idx < 0) {\n idx = cards.findIndex(function (c) {\n return c.classList.contains('is-active');\n });\n }\n if (idx < 0) idx = 0;\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n setActive(cards[Math.max(0, idx - 1)]);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n setActive(cards[Math.min(cards.length - 1, idx + 1)]);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(cards[0]);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(cards[cards.length - 1]);\n }\n };\n\n container.addEventListener('click', onClick);\n cleanup.push(function () {\n container.removeEventListener('click', onClick);\n });\n\n container.addEventListener('keydown', onKeydown);\n cleanup.push(function () {\n container.removeEventListener('keydown', onKeydown);\n });\n\n getCards().forEach(function (card) {\n if (!card.hasAttribute('tabindex')) {\n card.setAttribute('tabindex', '0');\n }\n card.setAttribute('role', 'button');\n if (!card.hasAttribute('aria-pressed')) {\n card.setAttribute('aria-pressed', card.classList.contains('is-active') ? 'true' : 'false');\n }\n });\n\n const syncAria = function () {\n getCards().forEach(function (card) {\n card.setAttribute('aria-pressed', card.classList.contains('is-active') ? 'true' : 'false');\n });\n };\n\n const mo = new MutationObserver(syncAria);\n mo.observe(container, { attributes: true, subtree: true, attributeFilter: ['class'] });\n cleanup.push(function () {\n mo.disconnect();\n });\n syncAria();\n\n ExpandingCards.instances.set(container, { cleanup: cleanup });\n },\n\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n inst.cleanup.forEach(function (fn) {\n fn();\n });\n this.instances.delete(container);\n },\n\n destroyAll: function () {\n this.instances.forEach(function (_, el) {\n ExpandingCards.destroy(el);\n });\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('expandingCards', ExpandingCards);\n }\n\n window.VanduoExpandingCards = ExpandingCards;\n})();\n", "/**\n * Vanduo Framework \u2014 Timeline animated reveal\n * Opt-in: add `.vd-timeline-animated` to a `.vd-timeline` container.\n * Uses IntersectionObserver to add `.is-revealed` per item with staggered delays.\n * Optional: `.vd-timeline-playback` with `[data-vd-timeline-prev|next|play|pause]` for stepped control.\n */\n\n(function () {\n 'use strict';\n\n const STAGGER_MS = 140;\n const MAX_STAGGER_INDEX = 7;\n const PLAY_INTERVAL_MS = 800;\n\n function countRevealedPrefix(items) {\n let count = 0;\n for (let i = 0; i < items.length; i++) {\n if (!items[i].classList.contains('is-revealed')) break;\n count++;\n }\n return count;\n }\n\n function findPlaybackControls(container) {\n return container.parentElement || document.body;\n }\n\n function initPlayback(container, items, cleanup) {\n items.forEach(function (item) {\n item.classList.remove('is-revealed');\n });\n\n const scope = findPlaybackControls(container);\n const prevBtn = scope.querySelector('[data-vd-timeline-prev]');\n const nextBtn = scope.querySelector('[data-vd-timeline-next]');\n const playBtn = scope.querySelector('[data-vd-timeline-play]');\n const pauseBtn = scope.querySelector('[data-vd-timeline-pause]');\n\n let playTimer = null;\n let isPlaying = false;\n let playToken = 0;\n\n function updateNavButtons() {\n const k = countRevealedPrefix(items);\n const n = items.length;\n if (prevBtn) {\n const atStart = k === 0;\n prevBtn.disabled = atStart;\n prevBtn.setAttribute('aria-disabled', atStart ? 'true' : 'false');\n }\n if (nextBtn) {\n const atEnd = k >= n;\n nextBtn.disabled = atEnd;\n nextBtn.setAttribute('aria-disabled', atEnd ? 'true' : 'false');\n }\n if (playBtn) {\n playBtn.setAttribute('aria-pressed', isPlaying ? 'true' : 'false');\n }\n if (pauseBtn) {\n pauseBtn.disabled = !isPlaying;\n }\n }\n\n function stepNext() {\n const k = countRevealedPrefix(items);\n if (k < items.length) {\n items[k].classList.add('is-revealed');\n }\n updateNavButtons();\n }\n\n function stepPrev() {\n const k = countRevealedPrefix(items);\n if (k > 0) {\n items[k - 1].classList.remove('is-revealed');\n }\n updateNavButtons();\n }\n\n function scheduleNext() {\n const token = ++playToken;\n playTimer = setTimeout(function () {\n playTimer = null;\n\n if (!isPlaying || token !== playToken) {\n return;\n }\n\n if (countRevealedPrefix(items) >= items.length) {\n pause();\n return;\n }\n\n stepNext();\n\n if (countRevealedPrefix(items) >= items.length) {\n pause();\n return;\n }\n\n scheduleNext();\n }, PLAY_INTERVAL_MS);\n }\n\n function play() {\n if (isPlaying) return;\n isPlaying = true;\n scheduleNext();\n updateNavButtons();\n }\n\n function pause() {\n isPlaying = false;\n playToken++;\n if (playTimer) {\n clearTimeout(playTimer);\n playTimer = null;\n }\n updateNavButtons();\n }\n\n function addClick(el, fn) {\n if (!el) return;\n const handler = function (e) {\n e.preventDefault();\n fn();\n };\n el.addEventListener('click', handler);\n cleanup.push(function () {\n el.removeEventListener('click', handler);\n });\n }\n\n addClick(prevBtn, stepPrev);\n addClick(nextBtn, stepNext);\n addClick(playBtn, play);\n addClick(pauseBtn, pause);\n\n cleanup.push(function () {\n pause();\n });\n\n updateNavButtons();\n\n return {\n stepNext: stepNext,\n stepPrev: stepPrev,\n play: play,\n pause: pause\n };\n }\n\n const Timeline = {\n instances: new Map(),\n\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-timeline.vd-timeline-animated').forEach(function (el) {\n if (Timeline.instances.has(el)) return;\n Timeline.initInstance(el);\n });\n },\n\n reinit: function (root) {\n Timeline.destroyAll(root);\n Timeline.init(root);\n },\n\n initInstance: function (container) {\n const cleanup = [];\n const items = Array.prototype.filter.call(container.children, function (child) {\n return child.classList && child.classList.contains('vd-timeline-item');\n });\n\n items.forEach(function (item, i) {\n const idx = Math.min(i, MAX_STAGGER_INDEX);\n item.style.setProperty('--vd-timeline-reveal-delay', (idx * STAGGER_MS) + 'ms');\n });\n\n const reducedMotion = typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n items.forEach(function (item) {\n item.classList.add('is-revealed');\n });\n Timeline.instances.set(container, { cleanup: cleanup });\n return;\n }\n\n const playback = container.classList && container.classList.contains('vd-timeline-playback');\n\n if (playback) {\n const playbackApi = initPlayback(container, items, cleanup);\n Timeline.instances.set(container, { cleanup: cleanup, playback: playbackApi });\n return;\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n items.forEach(function (item) {\n item.classList.add('is-revealed');\n });\n Timeline.instances.set(container, { cleanup: cleanup });\n return;\n }\n\n const observer = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (!entry.isIntersecting) return;\n entry.target.classList.add('is-revealed');\n observer.unobserve(entry.target);\n });\n }, {\n root: null,\n rootMargin: '0px 0px -10% 0px',\n threshold: 0.15\n });\n\n items.forEach(function (item) {\n observer.observe(item);\n });\n\n cleanup.push(function () {\n observer.disconnect();\n });\n\n Timeline.instances.set(container, { cleanup: cleanup });\n },\n\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n inst.cleanup.forEach(function (fn) {\n fn();\n });\n this.instances.delete(container);\n },\n\n destroyAll: function (root) {\n const scope = window.Vanduo && typeof window.Vanduo._normalizeRoot === 'function'\n ? window.Vanduo._normalizeRoot(root)\n : document;\n\n this.instances.forEach(function (_, el) {\n if (scope !== document && scope !== el && (!scope.contains || !scope.contains(el))) return;\n Timeline.destroy(el);\n });\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('timeline', Timeline);\n }\n\n window.VanduoTimeline = Timeline;\n})();\n", "/**\n * Vanduo Framework - Flow (Carousel/Slider) Component\n * Touch-enabled carousel with slide/fade transitions, autoplay, indicators\n */\n\n(function () {\n 'use strict';\n\n const Flow = {\n instances: new Map(),\n\n init: function (root) {\n const carousels = window.Vanduo.queryAll(root, '.vd-flow, .vd-carousel');\n carousels.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const track = el.querySelector('.vd-flow-track');\n if (!track) return;\n\n const slides = Array.from(track.querySelectorAll('.vd-flow-slide'));\n if (slides.length === 0) return;\n\n const isFade = el.classList.contains('vd-flow-fade');\n const autoplay = el.hasAttribute('data-vd-autoplay');\n const interval = parseInt(el.getAttribute('data-vd-interval'), 10) || 5000;\n const loop = el.getAttribute('data-vd-loop') !== 'false';\n\n const state = {\n current: 0,\n total: slides.length,\n autoplayTimer: null,\n isFade: isFade,\n loop: loop,\n isDragging: false,\n startX: 0,\n currentX: 0,\n threshold: 50\n };\n\n const cleanup = [];\n\n // Set initial active slide\n slides.forEach((slide, i) => {\n slide.setAttribute('role', 'group');\n slide.setAttribute('aria-roledescription', 'slide');\n slide.setAttribute('aria-label', 'Slide ' + (i + 1) + ' of ' + slides.length);\n if (i === 0) slide.classList.add('is-active');\n });\n\n el.setAttribute('role', 'region');\n el.setAttribute('aria-roledescription', 'carousel');\n if (!el.getAttribute('aria-label')) {\n el.setAttribute('aria-label', 'Carousel');\n }\n\n // Live region for announcements\n const liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.className = 'sr-only';\n liveRegion.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);';\n el.appendChild(liveRegion);\n\n const goTo = (index, announce) => {\n if (announce === undefined) announce = true;\n let target = index;\n if (state.loop) {\n target = ((index % state.total) + state.total) % state.total;\n } else {\n target = Math.max(0, Math.min(index, state.total - 1));\n }\n\n const prev = state.current;\n state.current = target;\n\n if (state.isFade) {\n slides.forEach((s, i) => {\n s.classList.toggle('is-active', i === target);\n });\n } else {\n track.style.transform = 'translateX(-' + (target * 100) + '%)';\n }\n\n // Update indicators\n const indicators = el.querySelectorAll('.vd-flow-indicator');\n indicators.forEach((ind, i) => {\n ind.classList.toggle('is-active', i === target);\n ind.setAttribute('aria-selected', i === target ? 'true' : 'false');\n });\n\n // Update slide ARIA\n slides.forEach((s, i) => {\n s.setAttribute('aria-hidden', i !== target ? 'true' : 'false');\n });\n\n if (announce) {\n liveRegion.textContent = 'Slide ' + (target + 1) + ' of ' + state.total;\n }\n\n el.dispatchEvent(new CustomEvent('flow:change', {\n detail: { current: target, previous: prev, total: state.total }\n }));\n };\n\n const next = () => goTo(state.current + 1);\n const prev = () => goTo(state.current - 1);\n\n // Controls\n const prevBtn = el.querySelector('.vd-flow-prev');\n const nextBtn = el.querySelector('.vd-flow-next');\n\n if (prevBtn) {\n const h = () => prev();\n prevBtn.addEventListener('click', h);\n cleanup.push(() => prevBtn.removeEventListener('click', h));\n }\n if (nextBtn) {\n const h = () => next();\n nextBtn.addEventListener('click', h);\n cleanup.push(() => nextBtn.removeEventListener('click', h));\n }\n\n // Indicators\n const indicators = el.querySelectorAll('.vd-flow-indicator');\n indicators.forEach((ind, i) => {\n ind.setAttribute('role', 'tab');\n ind.setAttribute('aria-selected', i === 0 ? 'true' : 'false');\n ind.setAttribute('aria-label', 'Go to slide ' + (i + 1));\n const h = () => goTo(i);\n ind.addEventListener('click', h);\n cleanup.push(() => ind.removeEventListener('click', h));\n });\n\n // Keyboard navigation\n const keyHandler = (e) => {\n if (e.key === 'ArrowLeft') { prev(); e.preventDefault(); }\n if (e.key === 'ArrowRight') { next(); e.preventDefault(); }\n };\n el.setAttribute('tabindex', '0');\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n\n // Touch / pointer support\n const pointerDown = (e) => {\n state.isDragging = true;\n state.startX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n state.currentX = state.startX;\n el.classList.add('is-dragging');\n };\n\n const pointerMove = (e) => {\n if (!state.isDragging) return;\n state.currentX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n };\n\n const pointerUp = () => {\n if (!state.isDragging) return;\n state.isDragging = false;\n el.classList.remove('is-dragging');\n const diff = state.startX - state.currentX;\n if (Math.abs(diff) > state.threshold) {\n if (diff > 0) next();\n else prev();\n }\n };\n\n el.addEventListener('mousedown', pointerDown);\n el.addEventListener('mousemove', pointerMove);\n el.addEventListener('mouseup', pointerUp);\n el.addEventListener('mouseleave', pointerUp);\n el.addEventListener('touchstart', pointerDown, { passive: true });\n el.addEventListener('touchmove', pointerMove, { passive: true });\n el.addEventListener('touchend', pointerUp);\n\n cleanup.push(\n () => el.removeEventListener('mousedown', pointerDown),\n () => el.removeEventListener('mousemove', pointerMove),\n () => el.removeEventListener('mouseup', pointerUp),\n () => el.removeEventListener('mouseleave', pointerUp),\n () => el.removeEventListener('touchstart', pointerDown),\n () => el.removeEventListener('touchmove', pointerMove),\n () => el.removeEventListener('touchend', pointerUp)\n );\n\n // Autoplay\n const startAutoplay = () => {\n stopAutoplay();\n state.autoplayTimer = setInterval(next, interval);\n };\n\n const stopAutoplay = () => {\n if (state.autoplayTimer) {\n clearInterval(state.autoplayTimer);\n state.autoplayTimer = null;\n }\n };\n\n if (autoplay) {\n startAutoplay();\n const pauseHandler = () => stopAutoplay();\n const resumeHandler = () => startAutoplay();\n el.addEventListener('mouseenter', pauseHandler);\n el.addEventListener('mouseleave', resumeHandler);\n el.addEventListener('focusin', pauseHandler);\n el.addEventListener('focusout', resumeHandler);\n cleanup.push(\n () => el.removeEventListener('mouseenter', pauseHandler),\n () => el.removeEventListener('mouseleave', resumeHandler),\n () => el.removeEventListener('focusin', pauseHandler),\n () => el.removeEventListener('focusout', resumeHandler),\n () => stopAutoplay()\n );\n }\n\n // Initial ARIA state\n goTo(0, false);\n\n this.instances.set(el, {\n cleanup: cleanup,\n goTo: goTo,\n next: next,\n prev: prev,\n getState: () => ({ ...state })\n });\n },\n\n goTo: function (el, index) {\n const instance = this.instances.get(el);\n if (instance) instance.goTo(index);\n },\n\n next: function (el) {\n const instance = this.instances.get(el);\n if (instance) instance.next();\n },\n\n prev: function (el) {\n const instance = this.instances.get(el);\n if (instance) instance.prev();\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('flow', Flow);\n }\n\n window.VanduoFlow = Flow;\n\n})();\n", "/**\n * Vanduo Framework - Bubble (Popover) Component\n * Click-triggered rich HTML popover, reuses tooltip positioning concepts\n */\n\n(function () {\n 'use strict';\n\n const Bubble = {\n instances: new Map(),\n _globalCleanups: [],\n\n init: function (root) {\n const triggers = window.Vanduo.queryAll(root, '[data-vd-bubble], [data-vd-popover]');\n triggers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n\n if (this._globalCleanups.length === 0) {\n const outsideClick = (e) => {\n this.instances.forEach((inst, trigger) => {\n if (!inst.popover.contains(e.target) && !trigger.contains(e.target)) {\n this.hide(trigger);\n }\n });\n };\n const escHandler = (e) => {\n if (e.key === 'Escape') {\n this.instances.forEach((_, trigger) => this.hide(trigger));\n }\n };\n document.addEventListener('click', outsideClick, true);\n document.addEventListener('keydown', escHandler);\n this._globalCleanups.push(\n () => document.removeEventListener('click', outsideClick, true),\n () => document.removeEventListener('keydown', escHandler)\n );\n }\n },\n\n initInstance: function (trigger) {\n const cleanup = [];\n const placement = trigger.getAttribute('data-vd-bubble-placement') ||\n trigger.getAttribute('data-vd-popover-placement') || 'bottom';\n\n // Build popover element\n const popover = document.createElement('div');\n popover.className = 'vd-bubble-content';\n popover.setAttribute('role', 'dialog');\n popover.setAttribute('aria-modal', 'false');\n popover.setAttribute('data-placement', placement);\n\n const title = trigger.getAttribute('data-vd-bubble-title') ||\n trigger.getAttribute('data-vd-popover-title');\n const content = trigger.getAttribute('data-vd-bubble') ||\n trigger.getAttribute('data-vd-popover') || '';\n const htmlContent = trigger.getAttribute('data-vd-bubble-html') ||\n trigger.getAttribute('data-vd-popover-html');\n const allowSvg = trigger.hasAttribute('data-vd-bubble-allow-svg') ||\n trigger.hasAttribute('data-vd-popover-allow-svg');\n\n if (title) {\n const header = document.createElement('div');\n header.className = 'vd-bubble-header';\n const titleSpan = document.createElement('span');\n titleSpan.textContent = title;\n const closeBtn = document.createElement('button');\n closeBtn.className = 'vd-bubble-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.innerHTML = '&times;';\n header.appendChild(titleSpan);\n header.appendChild(closeBtn);\n popover.appendChild(header);\n\n const closeHandler = (e) => { e.stopPropagation(); this.hide(trigger); };\n closeBtn.addEventListener('click', closeHandler);\n cleanup.push(() => closeBtn.removeEventListener('click', closeHandler));\n }\n\n const body = document.createElement('div');\n body.className = 'vd-bubble-body';\n if (htmlContent) {\n if (typeof sanitizeHtml === 'function') {\n body.innerHTML = sanitizeHtml(htmlContent, { allowSvg, allowStyle: false });\n } else {\n body.textContent = htmlContent;\n }\n } else {\n body.textContent = content;\n }\n popover.appendChild(body);\n\n document.body.appendChild(popover);\n\n // ARIA on trigger\n const popId = 'vd-bubble-' + Math.random().toString(36).slice(2, 9);\n popover.id = popId;\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.setAttribute('aria-controls', popId);\n\n // Toggle on click\n const toggleHandler = (e) => {\n e.stopPropagation();\n if (popover.classList.contains('is-visible')) {\n this.hide(trigger);\n } else {\n this.hideAll();\n this.show(trigger);\n }\n };\n trigger.addEventListener('click', toggleHandler);\n cleanup.push(() => trigger.removeEventListener('click', toggleHandler));\n\n this.instances.set(trigger, { popover, cleanup, placement });\n },\n\n position: function (trigger, popover, placement) {\n const rect = trigger.getBoundingClientRect();\n const popRect = popover.getBoundingClientRect();\n const gap = 10;\n let top, left;\n\n switch (placement) {\n case 'top':\n top = rect.top - popRect.height - gap + window.scrollY;\n left = rect.left + (rect.width - popRect.width) / 2 + window.scrollX;\n break;\n case 'left':\n top = rect.top + (rect.height - popRect.height) / 2 + window.scrollY;\n left = rect.left - popRect.width - gap + window.scrollX;\n break;\n case 'right':\n top = rect.top + (rect.height - popRect.height) / 2 + window.scrollY;\n left = rect.right + gap + window.scrollX;\n break;\n default: // bottom\n top = rect.bottom + gap + window.scrollY;\n left = rect.left + (rect.width - popRect.width) / 2 + window.scrollX;\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, window.innerWidth - popRect.width - 8));\n top = Math.max(8, top);\n\n popover.style.top = top + 'px';\n popover.style.left = left + 'px';\n },\n\n show: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n const { popover, placement } = instance;\n\n popover.style.display = 'block';\n popover.classList.add('is-visible');\n trigger.setAttribute('aria-expanded', 'true');\n\n requestAnimationFrame(() => {\n this.position(trigger, popover, placement);\n });\n\n trigger.dispatchEvent(new CustomEvent('bubble:show', {\n bubbles: true,\n detail: { trigger: trigger, placement: placement }\n }));\n },\n\n hide: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n instance.popover.classList.remove('is-visible');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.dispatchEvent(new CustomEvent('bubble:hide', {\n bubbles: true,\n detail: { trigger: trigger }\n }));\n },\n\n hideAll: function () {\n this.instances.forEach((_, trigger) => this.hide(trigger));\n },\n\n destroy: function (trigger) {\n const instance = this.instances.get(trigger);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n if (instance.popover.parentNode) {\n instance.popover.parentNode.removeChild(instance.popover);\n }\n trigger.removeAttribute('aria-haspopup');\n trigger.removeAttribute('aria-expanded');\n trigger.removeAttribute('aria-controls');\n this.instances.delete(trigger);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, trigger) => this.destroy(trigger));\n this._globalCleanups.forEach(fn => fn());\n this._globalCleanups = [];\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('bubble', Bubble);\n }\n\n window.VanduoBubble = Bubble;\n\n})();\n", "/**\n * Vanduo Framework - Waypoint (Scrollspy) Component\n * Highlights navigation links based on scroll position using IntersectionObserver\n */\n\n(function () {\n 'use strict';\n\n const Waypoint = {\n instances: new Map(),\n\n init: function (root) {\n const navs = window.Vanduo.queryAll(root, '[data-vd-waypoint-nav], [data-vd-scrollspy-nav]');\n navs.forEach(nav => {\n if (this.instances.has(nav)) return;\n this.initInstance(nav);\n });\n },\n\n initInstance: function (nav) {\n const links = Array.from(nav.querySelectorAll('a[href^=\"#\"]'));\n if (links.length === 0) return;\n\n const cleanup = [];\n const offset = parseInt(nav.getAttribute('data-vd-waypoint-offset') || '80', 10);\n const sections = [];\n\n links.forEach(link => {\n const id = link.getAttribute('href').slice(1);\n const section = document.getElementById(id);\n if (section) {\n section.setAttribute('data-vd-waypoint-section', '');\n sections.push({ id, link, section });\n }\n });\n\n if (sections.length === 0) return;\n\n const activeSections = new Set();\n\n const setActive = (id) => {\n links.forEach(l => l.classList.remove('is-active'));\n const target = links.find(l => l.getAttribute('href') === '#' + id);\n if (target) {\n target.classList.add('is-active');\n nav.dispatchEvent(new CustomEvent('waypoint:change', {\n detail: { activeId: id, link: target }\n }));\n }\n };\n\n const rootMargin = '-' + offset + 'px 0px -40% 0px';\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n activeSections.add(entry.target.id);\n } else {\n activeSections.delete(entry.target.id);\n }\n });\n\n // Pick the topmost visible section\n for (let i = 0; i < sections.length; i++) {\n if (activeSections.has(sections[i].id)) {\n setActive(sections[i].id);\n return;\n }\n }\n }, {\n rootMargin: rootMargin,\n threshold: 0\n });\n\n sections.forEach(s => observer.observe(s.section));\n\n // Smooth scroll on click\n links.forEach(link => {\n const clickHandler = (e) => {\n e.preventDefault();\n const id = link.getAttribute('href').slice(1);\n const section = document.getElementById(id);\n if (section) {\n section.scrollIntoView({ behavior: 'smooth' });\n setActive(id);\n }\n };\n link.addEventListener('click', clickHandler);\n cleanup.push(() => link.removeEventListener('click', clickHandler));\n });\n\n cleanup.push(() => observer.disconnect());\n\n this.instances.set(nav, { observer, cleanup, sections, setActive });\n },\n\n refresh: function (nav) {\n this.destroy(nav);\n this.initInstance(nav);\n },\n\n destroy: function (nav) {\n const instance = this.instances.get(nav);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(nav);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, nav) => this.destroy(nav));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('waypoint', Waypoint);\n }\n\n window.VanduoWaypoint = Waypoint;\n\n})();\n", "/**\n * Vanduo Framework - Ripple (Waves Effect) Component\n * Adds expanding circle animation on click at pointer position\n */\n\n(function () {\n 'use strict';\n\n const Ripple = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-ripple, [data-vd-ripple]');\n elements.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n\n const createWave = (e) => {\n const rect = el.getBoundingClientRect();\n const size = Math.max(rect.width, rect.height);\n const x = (e.clientX || (e.touches && e.touches[0].clientX) || rect.left + rect.width / 2) - rect.left - size / 2;\n const y = (e.clientY || (e.touches && e.touches[0].clientY) || rect.top + rect.height / 2) - rect.top - size / 2;\n\n const wave = document.createElement('span');\n wave.className = 'vd-ripple-wave';\n wave.style.width = size + 'px';\n wave.style.height = size + 'px';\n wave.style.left = x + 'px';\n wave.style.top = y + 'px';\n\n el.appendChild(wave);\n\n wave.addEventListener('animationend', () => {\n if (wave.parentNode) wave.parentNode.removeChild(wave);\n });\n };\n\n el.addEventListener('mousedown', createWave);\n el.addEventListener('touchstart', createWave, { passive: true });\n\n cleanup.push(\n () => el.removeEventListener('mousedown', createWave),\n () => el.removeEventListener('touchstart', createWave)\n );\n\n this.instances.set(el, { cleanup });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n // Remove any lingering wave elements\n el.querySelectorAll('.vd-ripple-wave').forEach(w => w.remove());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('ripple', Ripple);\n }\n\n window.VanduoRipple = Ripple;\n\n})();\n", "/**\n * Vanduo Framework - Affix (Sticky) Component\n * Uses IntersectionObserver to toggle .is-stuck within the nearest scrollable parent\n */\n\n(function () {\n 'use strict';\n\n function isScrollable(element) {\n if (!element || element === document.body) return false;\n\n const style = window.getComputedStyle(element);\n const overflowY = style.overflowY;\n const overflowX = style.overflowX;\n const canScrollY = /(auto|scroll|overlay)/.test(overflowY) && element.scrollHeight > element.clientHeight;\n const canScrollX = /(auto|scroll|overlay)/.test(overflowX) && element.scrollWidth > element.clientWidth;\n\n return canScrollY || canScrollX;\n }\n\n function getScrollParent(element) {\n let parent = element.parentElement;\n\n while (parent && parent !== document.body && parent !== document.documentElement) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n\n return null;\n }\n\n const Affix = {\n instances: new Map(),\n\n init: function (root) {\n const elements = window.Vanduo.queryAll(root, '.vd-affix, .vd-sticky, [data-vd-affix]');\n elements.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const parsedOffset = parseInt(el.getAttribute('data-vd-affix-offset') || '0', 10);\n const offset = Number.isNaN(parsedOffset) ? 0 : parsedOffset;\n const scrollParent = getScrollParent(el);\n let isStuck = false;\n\n const sentinel = document.createElement('div');\n sentinel.style.cssText = 'display:block;height:1px;margin-bottom:-1px;visibility:hidden;pointer-events:none;';\n el.parentNode.insertBefore(sentinel, el);\n\n el.style.setProperty('--vd-affix-top-offset', offset + 'px');\n\n function stick() {\n if (isStuck) return;\n isStuck = true;\n el.classList.add('is-stuck');\n el.dispatchEvent(new CustomEvent('affix:stuck', {\n bubbles: true,\n detail: {\n offset: offset,\n root: scrollParent || window\n }\n }));\n }\n\n function unstick() {\n if (!isStuck) return;\n isStuck = false;\n el.classList.remove('is-stuck');\n el.dispatchEvent(new CustomEvent('affix:unstuck', {\n bubbles: true,\n detail: {\n offset: offset,\n root: scrollParent || window\n }\n }));\n }\n\n const observer = new IntersectionObserver(function (entries) {\n entries.forEach(entry => {\n if (!entry.isIntersecting) {\n stick();\n } else {\n unstick();\n }\n });\n }, {\n root: scrollParent,\n rootMargin: '-' + offset + 'px 0px 0px 0px',\n threshold: 0\n });\n\n observer.observe(sentinel);\n\n cleanup.push(\n () => observer.disconnect(),\n () => { if (sentinel.parentNode) sentinel.parentNode.removeChild(sentinel); },\n () => {\n el.classList.remove('is-stuck');\n el.style.removeProperty('--vd-affix-top-offset');\n }\n );\n\n this.instances.set(el, { cleanup, observer, sentinel, scrollParent });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n el.classList.remove('is-stuck');\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('affix', Affix);\n }\n\n window.VanduoAffix = Affix;\n\n})();\n", "/**\n * Vanduo Framework - Suggest (Autocomplete) Component\n * Dropdown suggestion list with keyboard navigation, static/async data sources\n */\n\n(function () {\n 'use strict';\n\n /**\n * Escape HTML entities to prevent XSS when inserting into innerHTML\n * @param {string} text\n * @returns {string}\n */\n function _escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Allow same-origin URLs by default, or an explicit allowlist of origins.\n * @param {string} url\n * @param {string[]} allowlist\n * @returns {boolean}\n */\n function _isSafeUrl(url, allowlist) {\n try {\n const resolved = new URL(url, window.location.href);\n if (resolved.origin === window.location.origin) return true;\n return allowlist.includes(resolved.origin);\n } catch (_e) {\n return false;\n }\n }\n\n const Suggest = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-suggest], [data-vd-autocomplete]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const minChars = parseInt(input.getAttribute('data-vd-suggest-min-chars') || '1', 10);\n const url = input.getAttribute('data-vd-suggest-url') || '';\n const allowlistAttr = input.getAttribute('data-vd-suggest-allowlist') || '';\n const allowlist = allowlistAttr\n .split(',')\n .map(value => value.trim())\n .filter(Boolean);\n const staticData = input.getAttribute('data-vd-suggest') || input.getAttribute('data-vd-autocomplete') || '';\n let items = [];\n\n try { items = JSON.parse(staticData); } catch (_e) {\n items = staticData.split(',').map(s => s.trim()).filter(Boolean);\n }\n\n // Wrap input if not already wrapped\n let wrapper = input.closest('.vd-suggest-wrapper, .vd-autocomplete-wrapper');\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.className = 'vd-suggest-wrapper';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n }\n\n // Create dropdown list\n const list = document.createElement('ul');\n list.className = 'vd-suggest-list';\n list.setAttribute('role', 'listbox');\n const listId = 'vd-suggest-' + Math.random().toString(36).slice(2, 9);\n list.id = listId;\n wrapper.appendChild(list);\n\n // ARIA\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-controls', listId);\n input.setAttribute('autocomplete', 'off');\n\n let highlighted = -1;\n let currentItems = [];\n let debounceTimer = null;\n\n const renderItems = (filtered, query) => {\n list.innerHTML = '';\n currentItems = filtered;\n highlighted = -1;\n\n if (filtered.length === 0) {\n const empty = document.createElement('li');\n empty.className = 'vd-suggest-empty';\n empty.textContent = 'No results';\n list.appendChild(empty);\n return;\n }\n\n filtered.forEach((item, i) => {\n const li = document.createElement('li');\n li.className = 'vd-suggest-item';\n li.setAttribute('role', 'option');\n li.id = listId + '-item-' + i;\n\n const text = typeof item === 'object' ? (item.label || item.text || String(item)) : String(item);\n if (query) {\n // Escape HTML first to prevent XSS, then highlight matches in the safe string\n const escaped = _escapeHtml(text);\n const re = new RegExp('(' + query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')', 'gi');\n li.innerHTML = escaped.replace(re, '<span class=\"vd-suggest-match\">$1</span>');\n } else {\n li.textContent = text;\n }\n\n li.addEventListener('click', () => selectItem(i));\n list.appendChild(li);\n });\n };\n\n const open = () => {\n list.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n };\n\n const close = () => {\n list.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n highlighted = -1;\n input.removeAttribute('aria-activedescendant');\n };\n\n const selectItem = (index) => {\n const item = currentItems[index];\n const value = typeof item === 'object' ? (item.value || item.label || String(item)) : String(item);\n input.value = value;\n close();\n input.dispatchEvent(new CustomEvent('suggest:select', {\n detail: { value, item, index },\n bubbles: true\n }));\n };\n\n const highlight = (index) => {\n const listItems = list.querySelectorAll('.vd-suggest-item');\n listItems.forEach(li => li.classList.remove('is-highlighted'));\n if (index >= 0 && index < listItems.length) {\n highlighted = index;\n listItems[index].classList.add('is-highlighted');\n input.setAttribute('aria-activedescendant', listItems[index].id);\n listItems[index].scrollIntoView({ block: 'nearest' });\n }\n };\n\n const doSearch = async (query) => {\n if (query.length < minChars) { close(); return; }\n\n let filtered;\n if (url) {\n try {\n if (!_isSafeUrl(url, allowlist)) {\n console.warn('[VanduoSuggest] Blocked non-allowlisted URL:', url);\n filtered = [];\n } else {\n const separator = url.includes('?') ? '&' : '?';\n const res = await window.fetch(url + separator + 'q=' + encodeURIComponent(query));\n filtered = await res.json();\n }\n } catch (_e) {\n filtered = [];\n }\n } else {\n const lower = query.toLowerCase();\n filtered = items.filter(item => {\n const text = typeof item === 'object' ? (item.label || item.text || String(item)) : String(item);\n return text.toLowerCase().includes(lower);\n });\n }\n\n renderItems(filtered, query);\n if (filtered.length > 0) open();\n else open(); // show \"no results\"\n };\n\n const inputHandler = () => {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => doSearch(input.value), 200);\n };\n\n const keyHandler = (e) => {\n if (!list.classList.contains('is-open')) {\n if (e.key === 'ArrowDown') { doSearch(input.value); e.preventDefault(); }\n return;\n }\n\n const total = currentItems.length;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n highlight(highlighted < total - 1 ? highlighted + 1 : 0);\n break;\n case 'ArrowUp':\n e.preventDefault();\n highlight(highlighted > 0 ? highlighted - 1 : total - 1);\n break;\n case 'Enter':\n e.preventDefault();\n if (highlighted >= 0) selectItem(highlighted);\n break;\n case 'Escape':\n close();\n break;\n }\n };\n\n const blurHandler = () => {\n setTimeout(close, 200);\n };\n const focusHandler = () => {\n if (input.value.length >= minChars) {\n doSearch(input.value);\n }\n };\n\n input.addEventListener('input', inputHandler);\n input.addEventListener('keydown', keyHandler);\n input.addEventListener('blur', blurHandler);\n input.addEventListener('focus', focusHandler);\n\n cleanup.push(\n () => input.removeEventListener('input', inputHandler),\n () => input.removeEventListener('keydown', keyHandler),\n () => input.removeEventListener('blur', blurHandler),\n () => input.removeEventListener('focus', focusHandler),\n () => clearTimeout(debounceTimer),\n () => { if (list.parentNode) list.parentNode.removeChild(list); }\n );\n\n this.instances.set(input, { cleanup, list, close });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('suggest', Suggest);\n }\n\n window.VanduoSuggest = Suggest;\n\n})();\n", "/**\n * Vanduo Framework - Validate (Form Validation) Component\n * Declarative validation via data attributes with real-time and on-submit modes\n */\n\n(function () {\n 'use strict';\n\n const Validate = {\n instances: new Map(),\n\n rules: {\n required: (value) => value.trim().length > 0,\n email: (value) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),\n url: (value) => { try { new URL(value); return true; } catch (_e) { return false; } },\n number: (value) => !isNaN(parseFloat(value)) && isFinite(value),\n min: (value, param) => value.length >= parseInt(param, 10),\n max: (value, param) => value.length <= parseInt(param, 10),\n minVal: (value, param) => parseFloat(value) >= parseFloat(param),\n maxVal: (value, param) => parseFloat(value) <= parseFloat(param),\n pattern: (value, param) => {\n try {\n // Cap regex length to prevent ReDoS from excessively complex patterns\n if (param.length > 100) return false;\n return new RegExp(param).test(value);\n } catch (_e) { return false; }\n },\n match: (value, param) => {\n try {\n const escaped = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(param) : param;\n const other = document.querySelector('[name=\"' + escaped + '\"]');\n return other ? value === other.value : false;\n } catch (_e) {\n return false;\n }\n }\n },\n\n messages: {\n required: 'This field is required',\n email: 'Please enter a valid email address',\n url: 'Please enter a valid URL',\n number: 'Please enter a valid number',\n min: 'Minimum {0} characters required',\n max: 'Maximum {0} characters allowed',\n minVal: 'Value must be at least {0}',\n maxVal: 'Value must be at most {0}',\n pattern: 'Invalid format',\n match: 'Fields do not match'\n },\n\n init: function (root) {\n const forms = window.Vanduo.queryAll(root, '[data-vd-validate], .vd-validate');\n forms.forEach(form => {\n if (this.instances.has(form)) return;\n this.initInstance(form);\n });\n },\n\n initInstance: function (form) {\n const cleanup = [];\n const mode = form.getAttribute('data-vd-validate-mode') || 'blur'; // blur | input | submit\n const fields = form.querySelectorAll('[data-vd-rules]');\n\n const validateField = (field) => {\n const rulesStr = field.getAttribute('data-vd-rules') || '';\n const rules = rulesStr.split('|').map(r => r.trim()).filter(Boolean);\n const value = field.value;\n const errors = [];\n\n for (const rule of rules) {\n const [name, ...params] = rule.split(':');\n const param = params.join(':');\n const validator = this.rules[name];\n\n if (validator && !validator(value, param)) {\n const customMsg = field.getAttribute('data-vd-msg-' + name);\n let msg = customMsg || this.messages[name] || 'Invalid';\n if (param) msg = msg.replace('{0}', param);\n errors.push(msg);\n break; // one error at a time\n }\n }\n\n this.setFieldState(field, errors);\n return errors.length === 0;\n };\n\n const validateAll = () => {\n let valid = true;\n fields.forEach(field => {\n if (!validateField(field)) valid = false;\n });\n return valid;\n };\n\n // Per-field listeners\n fields.forEach(field => {\n if (mode === 'input' || mode === 'blur') {\n const eventType = mode === 'input' ? 'input' : 'blur';\n const handler = () => validateField(field);\n field.addEventListener(eventType, handler);\n cleanup.push(() => field.removeEventListener(eventType, handler));\n\n if (mode === 'blur') {\n const inputClear = () => {\n if (field.classList.contains('is-invalid') || field.classList.contains('is-valid')) {\n validateField(field);\n }\n };\n field.addEventListener('input', inputClear);\n cleanup.push(() => field.removeEventListener('input', inputClear));\n }\n }\n });\n\n // Form submit\n const submitHandler = (e) => {\n const valid = validateAll();\n if (!valid) {\n e.preventDefault();\n e.stopPropagation();\n // Focus first invalid field\n const firstInvalid = form.querySelector('.is-invalid');\n if (firstInvalid) firstInvalid.focus();\n }\n form.dispatchEvent(new CustomEvent('validate:submit', {\n detail: { valid },\n bubbles: true\n }));\n };\n\n form.addEventListener('submit', submitHandler);\n cleanup.push(() => form.removeEventListener('submit', submitHandler));\n\n this.instances.set(form, { cleanup, validateAll, validateField });\n },\n\n setFieldState: function (field, errors) {\n const wrapper = field.closest('.vd-form-group') || field.parentElement;\n let errorEl = wrapper.querySelector('.vd-validate-error');\n\n field.classList.remove('is-valid', 'is-invalid');\n\n if (errors.length > 0) {\n field.classList.add('is-invalid');\n field.setAttribute('aria-invalid', 'true');\n if (!errorEl) {\n errorEl = document.createElement('div');\n errorEl.className = 'vd-validate-error';\n errorEl.id = 'vd-err-' + Math.random().toString(36).slice(2, 9);\n errorEl.setAttribute('role', 'alert');\n wrapper.appendChild(errorEl);\n }\n errorEl.textContent = errors[0];\n errorEl.style.display = '';\n field.setAttribute('aria-describedby', errorEl.id);\n } else if (field.value.trim()) {\n field.classList.add('is-valid');\n field.removeAttribute('aria-invalid');\n if (errorEl) errorEl.style.display = 'none';\n } else {\n field.removeAttribute('aria-invalid');\n if (errorEl) errorEl.style.display = 'none';\n }\n },\n\n validateForm: function (form) {\n const instance = this.instances.get(form);\n return instance ? instance.validateAll() : false;\n },\n\n addRule: function (name, validator, message) {\n this.rules[name] = validator;\n if (message) this.messages[name] = message;\n },\n\n destroy: function (form) {\n const instance = this.instances.get(form);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(form);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, form) => this.destroy(form));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('validate', Validate);\n }\n\n window.VanduoValidate = Validate;\n\n})();\n", "/**\n * Vanduo Framework - Datepicker Component\n * Calendar popup attached to input field with month/year navigation\n */\n\n(function () {\n 'use strict';\n\n const DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n function escapeRegexChar(c) {\n return c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n function buildParseFormat(format) {\n let regex = '^';\n const order = [];\n let i = 0;\n while (i < format.length) {\n const slice = format.slice(i);\n if (slice.toLowerCase().startsWith('yyyy')) {\n regex += '(\\\\d{4})';\n order.push('y');\n i += 4;\n } else if (slice.toLowerCase().startsWith('mm')) {\n regex += '(\\\\d{2})';\n order.push('m');\n i += 2;\n } else if (slice.toLowerCase().startsWith('dd')) {\n regex += '(\\\\d{2})';\n order.push('d');\n i += 2;\n } else {\n regex += escapeRegexChar(format[i]);\n i++;\n }\n }\n regex += '$';\n return { regex: new RegExp(regex), order };\n }\n\n function parseDateFromFormat(value, format) {\n if (!value || !format) return null;\n const { regex, order } = buildParseFormat(format);\n const m = value.trim().match(regex);\n if (!m) return null;\n let y;\n let mo;\n let d;\n let ci = 1;\n for (let k = 0; k < order.length; k++) {\n const part = order[k];\n const v = parseInt(m[ci++], 10);\n if (Number.isNaN(v)) return null;\n if (part === 'y') y = v;\n else if (part === 'm') mo = v - 1;\n else if (part === 'd') d = v;\n }\n if (y === undefined || mo === undefined || d === undefined) return null;\n const dt = new Date(y, mo, d);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;\n return dt;\n }\n\n function formatDate(d, format) {\n const yyyy = String(d.getFullYear());\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n let out = '';\n let i = 0;\n while (i < format.length) {\n const slice = format.slice(i);\n if (slice.toLowerCase().startsWith('yyyy')) {\n out += yyyy;\n i += 4;\n } else if (slice.toLowerCase().startsWith('mm')) {\n out += mm;\n i += 2;\n } else if (slice.toLowerCase().startsWith('dd')) {\n out += dd;\n i += 2;\n } else {\n out += format[i];\n i++;\n }\n }\n return out;\n }\n\n function dateKey(d) {\n return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n }\n\n function addDays(d, n) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n x.setDate(x.getDate() + n);\n return x;\n }\n\n function addMonthsClamped(d, n) {\n return new Date(d.getFullYear(), d.getMonth() + n, d.getDate());\n }\n\n function parseYmdLocal(ymd) {\n if (!ymd || typeof ymd !== 'string') return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(ymd.trim());\n if (!m) return null;\n const y = +m[1];\n const mo = +m[2] - 1;\n const day = +m[3];\n const dt = new Date(y, mo, day);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== day) return null;\n return dt;\n }\n\n function startOfWeekSunday(d) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const day = x.getDay();\n x.setDate(x.getDate() - day);\n return x;\n }\n\n function endOfWeekSunday(d) {\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const day = x.getDay();\n x.setDate(x.getDate() + (6 - day));\n return x;\n }\n\n function positionAnchoredPopup(anchor, popup, gap) {\n const padding = 8;\n const offset = gap != null ? gap : 4;\n const rect = anchor.getBoundingClientRect();\n\n popup.style.minWidth = Math.max(rect.width, 0) + 'px';\n\n let top = rect.bottom + offset;\n let left = rect.left;\n popup.style.top = top + 'px';\n popup.style.left = left + 'px';\n\n const popRect = popup.getBoundingClientRect();\n if (popRect.bottom > window.innerHeight - padding && rect.top - popRect.height > padding) {\n top = rect.top - popRect.height - offset;\n popup.style.top = top + 'px';\n }\n\n const alignedRect = popup.getBoundingClientRect();\n left = rect.left;\n if (left + alignedRect.width > window.innerWidth - padding) {\n left = window.innerWidth - alignedRect.width - padding;\n }\n popup.style.left = Math.max(padding, left) + 'px';\n }\n\n const Datepicker = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-datepicker]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const format = input.getAttribute('data-vd-datepicker-format') || 'YYYY-MM-DD';\n const minStr = input.getAttribute('data-vd-datepicker-min');\n const maxStr = input.getAttribute('data-vd-datepicker-max');\n const minDate = minStr ? parseYmdLocal(minStr) : null;\n const maxDate = maxStr ? parseYmdLocal(maxStr) : null;\n\n const today = new Date();\n let viewYear = today.getFullYear();\n let viewMonth = today.getMonth();\n let selectedDate = null;\n let viewMode = 'days'; // days | months | years\n let focusedDate = null;\n /** Prevents focus() after close from immediately re-opening the popup */\n let skipNextFocusOpen = false;\n\n const isDisabled = (d) => {\n if (minDate) {\n const t = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n if (t < minDate.getTime()) return true;\n }\n if (maxDate) {\n const t = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n if (t > maxDate.getTime()) return true;\n }\n return false;\n };\n\n const ensureMonthInRange = (y, m) => {\n if (!minDate && !maxDate) return { y: y, m: m };\n const first = new Date(y, m, 1);\n const last = new Date(y, m + 1, 0);\n if (minDate && last.getTime() < minDate.getTime()) {\n return { y: minDate.getFullYear(), m: minDate.getMonth() };\n }\n if (maxDate && first.getTime() > maxDate.getTime()) {\n return { y: maxDate.getFullYear(), m: maxDate.getMonth() };\n }\n return { y: y, m: m };\n };\n\n const firstSelectableInMonth = (y, m) => {\n const last = new Date(y, m + 1, 0).getDate();\n for (let day = 1; day <= last; day++) {\n const dt = new Date(y, m, day);\n if (!isDisabled(dt)) return dt;\n }\n return new Date(y, m, 1);\n };\n\n if (input.value) {\n const trimmed = input.value.trim();\n let parsed = parseDateFromFormat(trimmed, format);\n if (!parsed) {\n const fallback = new Date(trimmed);\n if (!isNaN(fallback.getTime())) parsed = fallback;\n }\n if (parsed) {\n selectedDate = parsed;\n viewYear = parsed.getFullYear();\n viewMonth = parsed.getMonth();\n }\n }\n\n const clampedInit = ensureMonthInRange(viewYear, viewMonth);\n viewYear = clampedInit.y;\n viewMonth = clampedInit.m;\n\n // Create popup\n const popup = document.createElement('div');\n popup.className = 'vd-datepicker-popup';\n popup.setAttribute('role', 'dialog');\n popup.setAttribute('aria-label', 'Choose date');\n popup.tabIndex = -1;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'vd-suggest-wrapper';\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n document.body.appendChild(popup);\n\n const isSameDay = (a, b) => a && b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n const selectDate = (date) => {\n selectedDate = date;\n viewYear = date.getFullYear();\n viewMonth = date.getMonth();\n input.value = formatDate(date, format);\n skipNextFocusOpen = true;\n close();\n input.dispatchEvent(new CustomEvent('datepicker:select', {\n detail: { date: date, formatted: input.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.focus();\n };\n\n const focusFocusedDay = () => {\n if (viewMode !== 'days' || !focusedDate) return;\n const key = dateKey(focusedDate);\n const btn = popup.querySelector('[data-vd-date=\"' + key + '\"]');\n if (btn && !btn.classList.contains('is-outside') && btn.getAttribute('aria-disabled') !== 'true') {\n btn.focus();\n }\n };\n\n const skipDisabled = (d, stepDir, maxSteps) => {\n let x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const step = stepDir > 0 ? 1 : -1;\n for (let i = 0; i < maxSteps; i++) {\n if (!isDisabled(x)) return x;\n x = addDays(x, step);\n }\n return d;\n };\n\n const createDayBtn = (day, outside, date) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-day';\n btn.textContent = day;\n btn.setAttribute('role', 'gridcell');\n\n if (outside) {\n btn.classList.add('is-outside');\n btn.tabIndex = -1;\n btn.setAttribute('aria-disabled', 'true');\n return btn;\n }\n\n btn.setAttribute('data-vd-date', dateKey(date));\n\n if (date && isSameDay(date, today)) btn.classList.add('is-today');\n if (date && isSameDay(date, selectedDate)) btn.classList.add('is-selected');\n if (date && isDisabled(date)) {\n btn.classList.add('is-disabled');\n btn.setAttribute('aria-disabled', 'true');\n btn.tabIndex = -1;\n return btn;\n }\n\n if (date) {\n const isFocused = focusedDate && isSameDay(date, focusedDate);\n btn.tabIndex = isFocused ? 0 : -1;\n\n btn.addEventListener('click', () => {\n selectedDate = date;\n viewYear = date.getFullYear();\n viewMonth = date.getMonth();\n focusedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n input.value = formatDate(date, format);\n skipNextFocusOpen = true;\n close();\n input.dispatchEvent(new CustomEvent('datepicker:select', {\n detail: { date: date, formatted: input.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.focus();\n });\n }\n\n return btn;\n };\n\n const render = () => {\n popup.innerHTML = '';\n\n // Header\n const header = document.createElement('div');\n header.className = 'vd-datepicker-header';\n\n const prevBtn = document.createElement('button');\n prevBtn.type = 'button';\n prevBtn.className = 'vd-datepicker-prev';\n prevBtn.innerHTML = '&#8249;';\n prevBtn.setAttribute('aria-label', 'Previous');\n\n const nextBtn = document.createElement('button');\n nextBtn.type = 'button';\n nextBtn.className = 'vd-datepicker-next';\n nextBtn.innerHTML = '&#8250;';\n nextBtn.setAttribute('aria-label', 'Next');\n\n const title = document.createElement('span');\n title.className = 'vd-datepicker-title';\n\n if (viewMode === 'days') {\n title.textContent = MONTHS[viewMonth] + ' ' + viewYear;\n title.addEventListener('click', () => { viewMode = 'months'; render(); });\n prevBtn.addEventListener('click', () => { viewMonth--; if (viewMonth < 0) { viewMonth = 11; viewYear--; } render(); });\n nextBtn.addEventListener('click', () => { viewMonth++; if (viewMonth > 11) { viewMonth = 0; viewYear++; } render(); });\n } else if (viewMode === 'months') {\n title.textContent = String(viewYear);\n title.addEventListener('click', () => { viewMode = 'years'; render(); });\n prevBtn.addEventListener('click', () => { viewYear--; render(); });\n nextBtn.addEventListener('click', () => { viewYear++; render(); });\n } else {\n const decadeStart = Math.floor(viewYear / 10) * 10;\n title.textContent = decadeStart + ' - ' + (decadeStart + 9);\n prevBtn.addEventListener('click', () => { viewYear -= 10; render(); });\n nextBtn.addEventListener('click', () => { viewYear += 10; render(); });\n }\n\n header.appendChild(prevBtn);\n header.appendChild(title);\n header.appendChild(nextBtn);\n popup.appendChild(header);\n\n if (viewMode === 'days') {\n const gridWrap = document.createElement('div');\n gridWrap.className = 'vd-datepicker-grid';\n gridWrap.setAttribute('role', 'grid');\n gridWrap.setAttribute('aria-label', 'Calendar');\n\n const weekdays = document.createElement('div');\n weekdays.className = 'vd-datepicker-weekdays';\n weekdays.setAttribute('role', 'row');\n DAYS.forEach(function (d) {\n const span = document.createElement('span');\n span.setAttribute('role', 'columnheader');\n span.setAttribute('aria-label', d);\n span.textContent = d;\n weekdays.appendChild(span);\n });\n gridWrap.appendChild(weekdays);\n\n const firstDay = new Date(viewYear, viewMonth, 1).getDay();\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const daysInPrev = new Date(viewYear, viewMonth, 0).getDate();\n\n const cells = [];\n\n for (let i = firstDay - 1; i >= 0; i--) {\n const dayNum = daysInPrev - i;\n const prevMonth = viewMonth === 0 ? 11 : viewMonth - 1;\n const prevYear = viewMonth === 0 ? viewYear - 1 : viewYear;\n const date = new Date(prevYear, prevMonth, dayNum);\n cells.push({ day: dayNum, outside: true, date: date });\n }\n\n for (let d = 1; d <= daysInMonth; d++) {\n const date = new Date(viewYear, viewMonth, d);\n cells.push({ day: d, outside: false, date: date });\n }\n\n const totalCells = firstDay + daysInMonth;\n const remaining = totalCells % 7 === 0 ? 0 : 7 - (totalCells % 7);\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(viewYear, viewMonth + 1, i);\n cells.push({ day: i, outside: true, date: date });\n }\n\n for (let r = 0; r < cells.length; r += 7) {\n const row = document.createElement('div');\n row.className = 'vd-datepicker-row';\n row.setAttribute('role', 'row');\n for (let c = 0; c < 7; c++) {\n const cell = cells[r + c];\n row.appendChild(createDayBtn(cell.day, cell.outside, cell.date));\n }\n gridWrap.appendChild(row);\n }\n\n popup.appendChild(gridWrap);\n } else if (viewMode === 'months') {\n const grid = document.createElement('div');\n grid.className = 'vd-datepicker-months';\n MONTHS.forEach((name, i) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-month-btn';\n btn.textContent = name.slice(0, 3);\n if (selectedDate && selectedDate.getFullYear() === viewYear && selectedDate.getMonth() === i) {\n btn.classList.add('is-selected');\n }\n btn.addEventListener('click', () => { viewMonth = i; viewMode = 'days'; render(); });\n grid.appendChild(btn);\n });\n popup.appendChild(grid);\n } else {\n const grid = document.createElement('div');\n grid.className = 'vd-datepicker-years';\n const decadeStart = Math.floor(viewYear / 10) * 10;\n for (let y = decadeStart - 1; y <= decadeStart + 10; y++) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-datepicker-year-btn';\n btn.textContent = y;\n if (selectedDate && selectedDate.getFullYear() === y) btn.classList.add('is-selected');\n if (y < decadeStart || y > decadeStart + 9) btn.style.opacity = '0.4';\n btn.addEventListener('click', () => { viewYear = y; viewMode = 'months'; render(); });\n grid.appendChild(btn);\n }\n popup.appendChild(grid);\n }\n\n if (popup.classList.contains('is-open')) {\n requestAnimationFrame(positionPopup);\n }\n };\n\n const handleGridKeydown = (e) => {\n if (!popup.classList.contains('is-open') || viewMode !== 'days') return;\n const grid = popup.querySelector('.vd-datepicker-grid');\n if (!grid || !grid.contains(e.target)) return;\n\n const key = e.key;\n if (key !== 'ArrowLeft' && key !== 'ArrowRight' && key !== 'ArrowUp' && key !== 'ArrowDown' &&\n key !== 'Home' && key !== 'End' && key !== 'PageUp' && key !== 'PageDown' &&\n key !== 'Enter' && key !== ' ' && key !== 'Escape') {\n return;\n }\n\n if (key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n skipNextFocusOpen = true;\n close();\n input.focus();\n return;\n }\n\n if (!focusedDate) {\n focusedDate = firstSelectableInMonth(viewYear, viewMonth);\n }\n\n if (key === 'Enter' || key === ' ') {\n e.preventDefault();\n if (focusedDate && !isDisabled(focusedDate)) {\n selectDate(new Date(focusedDate.getFullYear(), focusedDate.getMonth(), focusedDate.getDate()));\n }\n return;\n }\n\n e.preventDefault();\n\n let next = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), focusedDate.getDate());\n let skipDir = 1;\n\n if (key === 'ArrowLeft') {\n next = addDays(next, -1);\n skipDir = -1;\n } else if (key === 'ArrowRight') {\n next = addDays(next, 1);\n skipDir = 1;\n } else if (key === 'ArrowUp') {\n next = addDays(next, -7);\n skipDir = -1;\n } else if (key === 'ArrowDown') {\n next = addDays(next, 7);\n skipDir = 1;\n } else if (key === 'Home') {\n next = startOfWeekSunday(next);\n skipDir = 1;\n } else if (key === 'End') {\n next = endOfWeekSunday(next);\n skipDir = -1;\n } else if (key === 'PageUp') {\n next = addMonthsClamped(next, -1);\n skipDir = -1;\n } else if (key === 'PageDown') {\n next = addMonthsClamped(next, 1);\n skipDir = 1;\n }\n\n next = skipDisabled(next, skipDir, 400);\n\n if (next.getMonth() !== viewMonth || next.getFullYear() !== viewYear) {\n viewYear = next.getFullYear();\n viewMonth = next.getMonth();\n const cl = ensureMonthInRange(viewYear, viewMonth);\n viewYear = cl.y;\n viewMonth = cl.m;\n }\n\n focusedDate = next;\n render();\n requestAnimationFrame(focusFocusedDay);\n };\n\n const positionPopup = () => {\n if (!popup.classList.contains('is-open')) return;\n positionAnchoredPopup(input, popup);\n };\n\n const repositionHandler = () => {\n positionPopup();\n };\n\n const open = () => {\n viewMode = 'days';\n if (selectedDate) {\n viewYear = selectedDate.getFullYear();\n viewMonth = selectedDate.getMonth();\n }\n const cl = ensureMonthInRange(viewYear, viewMonth);\n viewYear = cl.y;\n viewMonth = cl.m;\n\n if (selectedDate) {\n focusedDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\n } else {\n focusedDate = firstSelectableInMonth(viewYear, viewMonth);\n }\n\n render();\n popup.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n requestAnimationFrame(() => {\n positionPopup();\n focusFocusedDay();\n });\n };\n\n const close = () => {\n popup.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n viewMode = 'days';\n };\n\n const focusHandler = () => {\n if (skipNextFocusOpen) {\n skipNextFocusOpen = false;\n return;\n }\n open();\n };\n const outsideHandler = (e) => {\n if (!input.contains(e.target) && !popup.contains(e.target)) close();\n };\n const escHandler = (e) => {\n if (e.key === 'Escape' && popup.classList.contains('is-open')) {\n skipNextFocusOpen = true;\n close();\n input.focus();\n }\n };\n\n input.addEventListener('focus', focusHandler);\n document.addEventListener('click', outsideHandler, true);\n document.addEventListener('keydown', escHandler);\n popup.addEventListener('keydown', handleGridKeydown);\n window.addEventListener('resize', repositionHandler);\n window.addEventListener('scroll', repositionHandler, true);\n\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('autocomplete', 'off');\n\n cleanup.push(\n () => input.removeEventListener('focus', focusHandler),\n () => document.removeEventListener('click', outsideHandler, true),\n () => document.removeEventListener('keydown', escHandler),\n () => popup.removeEventListener('keydown', handleGridKeydown),\n () => window.removeEventListener('resize', repositionHandler),\n () => window.removeEventListener('scroll', repositionHandler, true),\n () => popup.remove()\n );\n\n this.instances.set(input, { cleanup: cleanup, open: open, close: close, popup: popup });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('datepicker', Datepicker);\n }\n\n window.VanduoDatepicker = Datepicker;\n\n})();\n", "/**\n * Vanduo Framework - Timepicker Component\n * Dropdown time selection with 12h/24h format and configurable step intervals\n */\n\n(function () {\n 'use strict';\n\n function positionAnchoredPopup(anchor, popup, gap) {\n const padding = 8;\n const offset = gap != null ? gap : 4;\n const rect = anchor.getBoundingClientRect();\n\n popup.style.minWidth = Math.max(rect.width, 0) + 'px';\n\n let top = rect.bottom + offset;\n let left = rect.left;\n popup.style.top = top + 'px';\n popup.style.left = left + 'px';\n\n const popRect = popup.getBoundingClientRect();\n if (popRect.bottom > window.innerHeight - padding && rect.top - popRect.height > padding) {\n top = rect.top - popRect.height - offset;\n popup.style.top = top + 'px';\n }\n\n const alignedRect = popup.getBoundingClientRect();\n left = rect.left;\n if (left + alignedRect.width > window.innerWidth - padding) {\n left = window.innerWidth - alignedRect.width - padding;\n }\n popup.style.left = Math.max(padding, left) + 'px';\n }\n\n const Timepicker = {\n instances: new Map(),\n\n init: function (root) {\n const inputs = window.Vanduo.queryAll(root, '[data-vd-timepicker]');\n inputs.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (input) {\n const cleanup = [];\n const is24h = input.getAttribute('data-vd-timepicker-format') === '24h';\n const step = parseInt(input.getAttribute('data-vd-timepicker-step') || '30', 10);\n\n // Create wrapper\n let wrapper = input.closest('.vd-suggest-wrapper');\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n input.parentNode.insertBefore(wrapper, input);\n wrapper.appendChild(input);\n }\n\n // Create popup\n const popup = document.createElement('div');\n popup.className = 'vd-timepicker-popup';\n popup.setAttribute('role', 'listbox');\n document.body.appendChild(popup);\n\n // Generate time slots\n const times = [];\n for (let h = 0; h < 24; h++) {\n for (let m = 0; m < 60; m += step) {\n const hh24 = String(h).padStart(2, '0');\n const mm = String(m).padStart(2, '0');\n\n if (is24h) {\n times.push({ display: hh24 + ':' + mm, value: hh24 + ':' + mm });\n } else {\n const period = h < 12 ? 'AM' : 'PM';\n const h12 = h === 0 ? 12 : (h > 12 ? h - 12 : h);\n const display = h12 + ':' + mm + ' ' + period;\n times.push({ display, value: hh24 + ':' + mm });\n }\n }\n }\n\n const render = () => {\n popup.innerHTML = '';\n times.forEach(t => {\n const item = document.createElement('div');\n item.className = 'vd-timepicker-item';\n item.setAttribute('role', 'option');\n item.textContent = t.display;\n\n if (input.value === t.value || input.value === t.display) {\n item.classList.add('is-selected');\n }\n\n item.addEventListener('click', () => {\n input.value = t.display;\n popup.querySelectorAll('.vd-timepicker-item').forEach(i => i.classList.remove('is-selected'));\n item.classList.add('is-selected');\n close();\n input.dispatchEvent(new CustomEvent('timepicker:select', {\n detail: { display: t.display, value: t.value },\n bubbles: true\n }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n });\n\n popup.appendChild(item);\n });\n };\n\n const positionPopup = () => {\n if (!popup.classList.contains('is-open')) return;\n positionAnchoredPopup(input, popup);\n };\n\n const repositionHandler = () => {\n positionPopup();\n };\n\n const open = () => {\n render();\n popup.classList.add('is-open');\n input.setAttribute('aria-expanded', 'true');\n requestAnimationFrame(() => {\n positionPopup();\n const selected = popup.querySelector('.is-selected');\n if (selected) selected.scrollIntoView({ block: 'center' });\n });\n };\n\n const close = () => {\n popup.classList.remove('is-open');\n input.setAttribute('aria-expanded', 'false');\n };\n\n const focusHandler = () => open();\n const outsideHandler = (e) => {\n if (!input.contains(e.target) && !popup.contains(e.target)) close();\n };\n const escHandler = (e) => { if (e.key === 'Escape') close(); };\n\n input.addEventListener('focus', focusHandler);\n document.addEventListener('click', outsideHandler, true);\n document.addEventListener('keydown', escHandler);\n window.addEventListener('resize', repositionHandler);\n window.addEventListener('scroll', repositionHandler, true);\n input.setAttribute('aria-haspopup', 'listbox');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('autocomplete', 'off');\n input.readOnly = true;\n\n cleanup.push(\n () => input.removeEventListener('focus', focusHandler),\n () => document.removeEventListener('click', outsideHandler, true),\n () => document.removeEventListener('keydown', escHandler),\n () => window.removeEventListener('resize', repositionHandler),\n () => window.removeEventListener('scroll', repositionHandler, true),\n () => popup.remove()\n );\n\n this.instances.set(input, { cleanup, open, close });\n },\n\n destroy: function (el) {\n const instance = this.instances.get(el);\n if (!instance) return;\n instance.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('timepicker', Timepicker);\n }\n\n window.VanduoTimepicker = Timepicker;\n\n})();\n", "/**\n * Vanduo Framework - Stepper Component\n * Multi-step progress indicator with state management\n */\n\n(function () {\n 'use strict';\n\n const Stepper = {\n instances: new Map(),\n\n init: function (root) {\n const steppers = window.Vanduo.queryAll(root, '.vd-stepper');\n steppers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const items = Array.from(el.querySelectorAll('.vd-stepper-item'));\n const isClickable = el.classList.contains('vd-stepper-clickable');\n let currentIndex = items.findIndex(i => i.classList.contains('is-active'));\n if (currentIndex === -1) currentIndex = 0;\n\n const setStep = (index) => {\n if (index < 0 || index >= items.length) return;\n const prev = currentIndex;\n currentIndex = index;\n\n items.forEach((item, i) => {\n item.classList.remove('is-active', 'is-completed');\n if (i < index) item.classList.add('is-completed');\n else if (i === index) item.classList.add('is-active');\n });\n\n el.dispatchEvent(new CustomEvent('stepper:change', {\n detail: { current: index, previous: prev, total: items.length },\n bubbles: true\n }));\n };\n\n if (isClickable) {\n items.forEach((item, i) => {\n const handler = () => setStep(i);\n item.addEventListener('click', handler);\n cleanup.push(() => item.removeEventListener('click', handler));\n });\n }\n\n // Initialize current state\n setStep(currentIndex);\n\n this.instances.set(el, {\n cleanup,\n setStep,\n next: () => setStep(currentIndex + 1),\n prev: () => setStep(currentIndex - 1),\n getCurrent: () => currentIndex\n });\n },\n\n setStep: function (el, index) {\n const inst = this.instances.get(el);\n if (inst) inst.setStep(index);\n },\n\n next: function (el) {\n const inst = this.instances.get(el);\n if (inst) inst.next();\n },\n\n prev: function (el) {\n const inst = this.instances.get(el);\n if (inst) inst.prev();\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('stepper', Stepper);\n }\n\n window.VanduoStepper = Stepper;\n\n})();\n", "/**\n * Vanduo Framework - Rating Component\n * Star-based rating input with hover preview and read-only mode\n */\n\n(function () {\n 'use strict';\n\n const Rating = {\n instances: new Map(),\n\n init: function (root) {\n const ratings = window.Vanduo.queryAll(root, '[data-vd-rating]');\n ratings.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const max = parseInt(el.getAttribute('data-vd-rating-max') || '5', 10);\n const initialValue = parseFloat(el.getAttribute('data-vd-rating-value') || '0');\n const readonly = el.classList.contains('vd-rating-readonly') || el.hasAttribute('data-vd-rating-readonly');\n let currentValue = initialValue;\n\n el.classList.add('vd-rating');\n el.setAttribute('role', 'radiogroup');\n el.setAttribute('aria-label', el.getAttribute('aria-label') || 'Rating');\n\n // Clear existing stars\n el.innerHTML = '';\n\n // Create stars\n const stars = [];\n for (let i = 1; i <= max; i++) {\n const star = document.createElement('button');\n star.type = 'button';\n star.className = 'vd-rating-star';\n star.setAttribute('role', 'radio');\n star.setAttribute('aria-label', i + ' star' + (i > 1 ? 's' : ''));\n star.setAttribute('aria-checked', i <= currentValue ? 'true' : 'false');\n if (readonly) star.tabIndex = -1;\n stars.push(star);\n el.appendChild(star);\n }\n\n // Value display\n const valueDisplay = document.createElement('span');\n valueDisplay.className = 'vd-rating-value';\n valueDisplay.textContent = currentValue > 0 ? currentValue.toString() : '';\n el.appendChild(valueDisplay);\n\n const updateStars = (value) => {\n stars.forEach((star, i) => {\n star.classList.remove('is-active', 'is-half');\n const starNum = i + 1;\n if (starNum <= Math.floor(value)) {\n star.classList.add('is-active');\n } else if (starNum - 0.5 <= value) {\n star.classList.add('is-half');\n }\n star.setAttribute('aria-checked', starNum <= value ? 'true' : 'false');\n });\n valueDisplay.textContent = value > 0 ? value.toString() : '';\n };\n\n updateStars(currentValue);\n\n if (!readonly) {\n stars.forEach((star, i) => {\n const enterHandler = () => {\n stars.forEach((s, j) => {\n s.classList.toggle('is-hovered', j <= i);\n });\n };\n const leaveHandler = () => {\n stars.forEach(s => s.classList.remove('is-hovered'));\n };\n const clickHandler = () => {\n currentValue = i + 1;\n el.setAttribute('data-vd-rating-value', currentValue);\n updateStars(currentValue);\n el.dispatchEvent(new CustomEvent('rating:change', {\n detail: { value: currentValue, max },\n bubbles: true\n }));\n };\n\n star.addEventListener('mouseenter', enterHandler);\n star.addEventListener('mouseleave', leaveHandler);\n star.addEventListener('click', clickHandler);\n\n cleanup.push(\n () => star.removeEventListener('mouseenter', enterHandler),\n () => star.removeEventListener('mouseleave', leaveHandler),\n () => star.removeEventListener('click', clickHandler)\n );\n });\n\n // Keyboard\n const keyHandler = (e) => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n if (currentValue < max) {\n currentValue++;\n updateStars(currentValue);\n stars[currentValue - 1].focus();\n el.dispatchEvent(new CustomEvent('rating:change', { detail: { value: currentValue, max }, bubbles: true }));\n }\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n if (currentValue > 1) {\n currentValue--;\n updateStars(currentValue);\n stars[currentValue - 1].focus();\n el.dispatchEvent(new CustomEvent('rating:change', { detail: { value: currentValue, max }, bubbles: true }));\n }\n }\n };\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n }\n\n this.instances.set(el, {\n cleanup,\n getValue: () => currentValue,\n setValue: (v) => { currentValue = v; updateStars(v); }\n });\n },\n\n getValue: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getValue() : 0;\n },\n\n setValue: function (el, value) {\n const inst = this.instances.get(el);\n if (inst) inst.setValue(value);\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('rating', Rating);\n }\n\n window.VanduoRating = Rating;\n\n})();\n", "/**\n * Vanduo Framework - Transfer (Dual-list) Component\n * Source-to-target list transfer with search, select-all, and move actions\n */\n\n(function () {\n 'use strict';\n\n const Transfer = {\n instances: new Map(),\n\n init: function (root) {\n const transfers = window.Vanduo.queryAll(root, '[data-vd-transfer]');\n transfers.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n el.classList.add('vd-transfer');\n\n let sourceData, targetData;\n try {\n const raw = JSON.parse(el.getAttribute('data-vd-transfer') || '[]');\n sourceData = raw.map((item, i) => ({\n id: item.id || 'item-' + i,\n label: item.label || item.text || String(item),\n selected: false\n }));\n } catch (_e) {\n sourceData = [];\n }\n targetData = [];\n\n const sourceSelected = new Set();\n const targetSelected = new Set();\n\n const render = () => {\n el.innerHTML = '';\n\n // Source panel\n const sourcePanel = createPanel('Source', sourceData, sourceSelected, 'source');\n // Actions\n const actions = document.createElement('div');\n actions.className = 'vd-transfer-actions';\n\n const moveRightBtn = document.createElement('button');\n moveRightBtn.type = 'button';\n moveRightBtn.className = 'vd-transfer-btn';\n moveRightBtn.innerHTML = '&#8250;';\n moveRightBtn.setAttribute('aria-label', 'Move to target');\n moveRightBtn.disabled = sourceSelected.size === 0;\n moveRightBtn.addEventListener('click', () => moveRight());\n\n const moveLeftBtn = document.createElement('button');\n moveLeftBtn.type = 'button';\n moveLeftBtn.className = 'vd-transfer-btn';\n moveLeftBtn.innerHTML = '&#8249;';\n moveLeftBtn.setAttribute('aria-label', 'Move to source');\n moveLeftBtn.disabled = targetSelected.size === 0;\n moveLeftBtn.addEventListener('click', () => moveLeft());\n\n actions.appendChild(moveRightBtn);\n actions.appendChild(moveLeftBtn);\n\n // Target panel\n const targetPanel = createPanel('Target', targetData, targetSelected, 'target');\n\n el.appendChild(sourcePanel);\n el.appendChild(actions);\n el.appendChild(targetPanel);\n };\n\n const createPanel = (title, data, selected, _side) => {\n const panel = document.createElement('div');\n panel.className = 'vd-transfer-panel';\n\n const header = document.createElement('div');\n header.className = 'vd-transfer-header';\n const titleSpan = document.createElement('span');\n titleSpan.textContent = title;\n const count = document.createElement('span');\n count.className = 'vd-transfer-count';\n count.textContent = selected.size + '/' + data.length;\n header.appendChild(titleSpan);\n header.appendChild(count);\n panel.appendChild(header);\n\n // Search\n const searchDiv = document.createElement('div');\n searchDiv.className = 'vd-transfer-search';\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.placeholder = 'Search...';\n searchInput.setAttribute('aria-label', 'Search ' + title.toLowerCase());\n searchDiv.appendChild(searchInput);\n panel.appendChild(searchDiv);\n\n // List\n const list = document.createElement('ul');\n list.className = 'vd-transfer-list';\n list.setAttribute('role', 'listbox');\n\n const renderList = (filter) => {\n list.innerHTML = '';\n const filtered = filter ? data.filter(d => {\n const label = (d.label || d.text || String(d)).toLowerCase();\n return label.includes(filter.toLowerCase());\n }) : data;\n filtered.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vd-transfer-item';\n li.setAttribute('role', 'option');\n if (selected.has(item.id)) li.classList.add('is-selected');\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = selected.has(item.id);\n checkbox.setAttribute('aria-label', item.label);\n\n const label = document.createElement('span');\n label.textContent = item.label;\n\n li.addEventListener('click', () => {\n if (selected.has(item.id)) selected.delete(item.id);\n else selected.add(item.id);\n render();\n });\n\n li.appendChild(checkbox);\n li.appendChild(label);\n list.appendChild(li);\n });\n };\n\n searchInput.addEventListener('input', () => renderList(searchInput.value));\n renderList('');\n\n panel.appendChild(list);\n return panel;\n };\n\n const moveRight = () => {\n const toMove = sourceData.filter(d => sourceSelected.has(d.id));\n sourceData = sourceData.filter(d => !sourceSelected.has(d.id));\n targetData = targetData.concat(toMove);\n sourceSelected.clear();\n render();\n fireChange();\n };\n\n const moveLeft = () => {\n const toMove = targetData.filter(d => targetSelected.has(d.id));\n targetData = targetData.filter(d => !targetSelected.has(d.id));\n sourceData = sourceData.concat(toMove);\n targetSelected.clear();\n render();\n fireChange();\n };\n\n const fireChange = () => {\n el.dispatchEvent(new CustomEvent('transfer:change', {\n detail: {\n source: sourceData.map(d => d.id),\n target: targetData.map(d => d.id)\n },\n bubbles: true\n }));\n };\n\n render();\n\n this.instances.set(el, {\n cleanup,\n getTarget: () => targetData.map(d => d.id),\n getSource: () => sourceData.map(d => d.id)\n });\n },\n\n getSelected: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getTarget() : [];\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n el.innerHTML = '';\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('transfer', Transfer);\n }\n\n window.VanduoTransfer = Transfer;\n\n})();\n", "/**\n * Vanduo Framework - Tree View Component\n * Hierarchical collapsible tree with checkbox selection and keyboard navigation\n */\n\n(function () {\n 'use strict';\n\n const Tree = {\n instances: new Map(),\n\n init: function (root) {\n const trees = window.Vanduo.queryAll(root, '[data-vd-tree]');\n trees.forEach(el => {\n if (this.instances.has(el)) return;\n this.initInstance(el);\n });\n },\n\n initInstance: function (el) {\n const cleanup = [];\n const cascade = el.getAttribute('data-vd-tree-cascade') !== 'false';\n\n let data;\n try { data = JSON.parse(el.getAttribute('data-vd-tree') || '[]'); } catch (_e) { data = []; }\n\n el.classList.add('vd-tree');\n el.setAttribute('role', 'tree');\n\n const render = (items, parent) => {\n parent.innerHTML = '';\n items.forEach(item => {\n const node = document.createElement('li');\n node.className = 'vd-tree-node';\n node.setAttribute('role', 'treeitem');\n node.setAttribute('aria-expanded', item.open ? 'true' : 'false');\n if (item.open) node.classList.add('is-open');\n\n const content = document.createElement('div');\n content.className = 'vd-tree-node-content';\n\n // Toggle\n if (item.children && item.children.length > 0) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'vd-tree-toggle';\n toggle.setAttribute('aria-label', 'Toggle');\n toggle.addEventListener('click', (e) => {\n e.stopPropagation();\n item.open = !item.open;\n node.classList.toggle('is-open');\n node.setAttribute('aria-expanded', item.open ? 'true' : 'false');\n });\n content.appendChild(toggle);\n } else {\n const ph = document.createElement('span');\n ph.className = 'vd-tree-toggle-placeholder';\n content.appendChild(ph);\n }\n\n // Checkbox\n if (el.hasAttribute('data-vd-tree-checkbox')) {\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.className = 'vd-tree-checkbox';\n cb.checked = !!item.checked;\n cb.setAttribute('aria-label', item.label);\n cb.addEventListener('change', (e) => {\n e.stopPropagation();\n item.checked = cb.checked;\n if (cascade && item.children) {\n setChildChecked(item.children, cb.checked);\n render(data, el);\n }\n el.dispatchEvent(new CustomEvent('tree:check', {\n detail: { id: item.id, checked: cb.checked, label: item.label },\n bubbles: true\n }));\n });\n content.appendChild(cb);\n }\n\n // Icon\n if (item.icon) {\n const icon = document.createElement('span');\n icon.className = 'vd-tree-icon ' + item.icon;\n content.appendChild(icon);\n }\n\n // Label\n const label = document.createElement('span');\n label.className = 'vd-tree-label';\n label.textContent = item.label || '';\n content.appendChild(label);\n\n node.appendChild(content);\n\n // Children\n if (item.children && item.children.length > 0) {\n const childList = document.createElement('ul');\n childList.className = 'vd-tree-children';\n childList.setAttribute('role', 'group');\n render(item.children, childList);\n node.appendChild(childList);\n }\n\n parent.appendChild(node);\n });\n };\n\n const setChildChecked = (items, checked) => {\n items.forEach(item => {\n item.checked = checked;\n if (item.children) setChildChecked(item.children, checked);\n });\n };\n\n // Keyboard\n const keyHandler = (e) => {\n const focused = document.activeElement;\n if (!el.contains(focused)) return;\n\n const nodes = Array.from(el.querySelectorAll('.vd-tree-node-content'));\n const idx = nodes.indexOf(focused.closest('.vd-tree-node-content'));\n if (idx === -1) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (idx < nodes.length - 1) {\n const next = nodes[idx + 1].querySelector('.vd-tree-toggle, .vd-tree-label');\n if (next) next.focus();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (idx > 0) {\n const prev = nodes[idx - 1].querySelector('.vd-tree-toggle, .vd-tree-label');\n if (prev) prev.focus();\n }\n break;\n }\n };\n\n el.addEventListener('keydown', keyHandler);\n cleanup.push(() => el.removeEventListener('keydown', keyHandler));\n\n render(data, el);\n\n this.instances.set(el, {\n cleanup,\n getData: () => data,\n getChecked: () => {\n const checked = [];\n const collect = (items) => {\n items.forEach(i => {\n if (i.checked) checked.push(i.id || i.label);\n if (i.children) collect(i.children);\n });\n };\n collect(data);\n return checked;\n }\n });\n },\n\n getChecked: function (el) {\n const inst = this.instances.get(el);\n return inst ? inst.getChecked() : [];\n },\n\n destroy: function (el) {\n const inst = this.instances.get(el);\n if (!inst) return;\n inst.cleanup.forEach(fn => fn());\n el.innerHTML = '';\n this.instances.delete(el);\n },\n\n destroyAll: function () {\n this.instances.forEach((_, el) => this.destroy(el));\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('tree', Tree);\n }\n\n window.VanduoTree = Tree;\n\n})();\n", "/**\n * Vanduo Framework - Spotlight (Feature Discovery) Component\n * Guided tour with overlay highlight and step-through tooltip\n */\n\n(function () {\n 'use strict';\n\n const Spotlight = {\n _active: false,\n _steps: [],\n _currentStep: 0,\n _elements: {},\n _cleanup: [],\n _boundTriggers: new WeakMap(),\n _triggerElement: null,\n\n init: function (root) {\n const triggers = window.Vanduo.queryAll(root, '[data-vd-spotlight]');\n\n triggers.forEach(trigger => {\n if (this._boundTriggers.has(trigger)) return;\n\n const clickHandler = (event) => {\n event.preventDefault();\n\n const steps = this._parseSteps(trigger.getAttribute('data-vd-spotlight'));\n if (steps.length === 0) return;\n\n this.start(steps, { trigger });\n };\n\n trigger.addEventListener('click', clickHandler);\n this._boundTriggers.set(trigger, clickHandler);\n });\n },\n\n _parseSteps: function (raw) {\n if (typeof raw !== 'string' || raw.trim() === '') return [];\n\n try {\n const parsed = JSON.parse(raw);\n return this._normalizeSteps(parsed);\n } catch (error) {\n console.error('VanduoSpotlight: invalid data-vd-spotlight payload.', error);\n return [];\n }\n },\n\n _normalizeStep: function (step) {\n if (!step || typeof step !== 'object') return null;\n\n const target = step.target;\n const hasSelectorTarget = typeof target === 'string' && target.trim() !== '';\n const hasElementTarget = typeof Element !== 'undefined' && target instanceof Element;\n\n if (!hasSelectorTarget && !hasElementTarget) return null;\n\n const title = typeof step.title === 'string' ? step.title : '';\n const description = typeof step.description === 'string'\n ? step.description\n : (typeof step.content === 'string' ? step.content : '');\n\n return {\n target,\n title,\n description\n };\n },\n\n _normalizeSteps: function (steps) {\n if (!Array.isArray(steps)) return [];\n\n return steps\n .map(step => this._normalizeStep(step))\n .filter(Boolean);\n },\n\n start: function (steps, options) {\n if (this._active) this.stop();\n\n const normalizedSteps = this._normalizeSteps(steps);\n if (normalizedSteps.length === 0) return;\n\n const startOptions = options || {};\n\n this._steps = normalizedSteps;\n this._currentStep = 0;\n this._active = true;\n this._triggerElement = startOptions.trigger || (document.activeElement instanceof HTMLElement ? document.activeElement : null);\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.className = 'vd-spotlight-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n document.body.appendChild(overlay);\n\n // Create tooltip\n const tooltip = document.createElement('div');\n tooltip.className = 'vd-spotlight-tooltip';\n tooltip.setAttribute('role', 'dialog');\n tooltip.setAttribute('aria-modal', 'true');\n tooltip.tabIndex = -1;\n document.body.appendChild(tooltip);\n\n this._elements = { overlay, tooltip };\n\n // ESC to close\n const escHandler = (e) => { if (e.key === 'Escape') this.stop(); };\n document.addEventListener('keydown', escHandler);\n this._cleanup.push(() => document.removeEventListener('keydown', escHandler));\n\n // Overlay click to close\n overlay.addEventListener('click', () => this.stop());\n\n this._showStep(this._currentStep);\n },\n\n _showStep: function (index) {\n const step = this._steps[index];\n if (!step) return;\n\n const target = typeof step.target === 'string' ? document.querySelector(step.target) : step.target;\n const { tooltip } = this._elements;\n\n // Remove previous highlight\n document.querySelectorAll('.vd-spotlight-target').forEach(el => {\n el.classList.remove('vd-spotlight-target');\n });\n\n // Highlight target\n if (target) {\n target.classList.add('vd-spotlight-target');\n target.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n\n // Build tooltip content\n const total = this._steps.length;\n tooltip.innerHTML = '';\n tooltip.removeAttribute('aria-labelledby');\n tooltip.removeAttribute('aria-describedby');\n\n if (step.title) {\n const title = document.createElement('h4');\n title.className = 'vd-spotlight-title';\n title.id = 'vd-spotlight-title-' + index + '-' + Date.now();\n title.textContent = step.title;\n tooltip.appendChild(title);\n tooltip.setAttribute('aria-labelledby', title.id);\n }\n\n if (step.description) {\n const desc = document.createElement('p');\n desc.className = 'vd-spotlight-description';\n desc.id = 'vd-spotlight-description-' + index + '-' + Date.now();\n desc.textContent = step.description;\n tooltip.appendChild(desc);\n tooltip.setAttribute('aria-describedby', desc.id);\n }\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'vd-spotlight-footer';\n footer.setAttribute('aria-label', 'Step ' + (index + 1) + ' of ' + total);\n\n const counter = document.createElement('span');\n counter.className = 'vd-spotlight-counter';\n counter.textContent = (index + 1) + ' / ' + total;\n\n const actions = document.createElement('div');\n actions.className = 'vd-spotlight-actions';\n\n if (index > 0) {\n const prevBtn = document.createElement('button');\n prevBtn.type = 'button';\n prevBtn.className = 'vd-spotlight-btn';\n prevBtn.textContent = 'Back';\n prevBtn.addEventListener('click', () => this.prev());\n actions.appendChild(prevBtn);\n }\n\n const skipBtn = document.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'vd-spotlight-btn';\n skipBtn.textContent = 'Skip';\n skipBtn.addEventListener('click', () => this.stop());\n actions.appendChild(skipBtn);\n\n if (index < total - 1) {\n const nextBtn = document.createElement('button');\n nextBtn.type = 'button';\n nextBtn.className = 'vd-spotlight-btn vd-spotlight-btn-primary';\n nextBtn.textContent = 'Next';\n nextBtn.addEventListener('click', () => this.next());\n actions.appendChild(nextBtn);\n } else {\n const doneBtn = document.createElement('button');\n doneBtn.type = 'button';\n doneBtn.className = 'vd-spotlight-btn vd-spotlight-btn-primary';\n doneBtn.textContent = 'Done';\n doneBtn.addEventListener('click', () => this.stop());\n actions.appendChild(doneBtn);\n }\n\n footer.appendChild(counter);\n footer.appendChild(actions);\n tooltip.appendChild(footer);\n\n // Position tooltip near target\n if (target) {\n requestAnimationFrame(() => {\n const rect = target.getBoundingClientRect();\n const tRect = tooltip.getBoundingClientRect();\n let top = rect.bottom + 12 + window.scrollY;\n let left = rect.left + (rect.width - tRect.width) / 2 + window.scrollX;\n\n // Keep in viewport\n left = Math.max(8, Math.min(left, window.innerWidth - tRect.width - 8));\n if (top + tRect.height > window.innerHeight + window.scrollY) {\n top = rect.top - tRect.height - 12 + window.scrollY;\n }\n\n tooltip.style.top = top + 'px';\n tooltip.style.left = left + 'px';\n });\n }\n\n document.dispatchEvent(new CustomEvent('spotlight:step', {\n detail: { index, step: index, total, data: step }\n }));\n },\n\n next: function () {\n if (this._currentStep < this._steps.length - 1) {\n this._currentStep++;\n this._showStep(this._currentStep);\n }\n },\n\n prev: function () {\n if (this._currentStep > 0) {\n this._currentStep--;\n this._showStep(this._currentStep);\n }\n },\n\n stop: function () {\n if (!this._active) return;\n\n const total = this._steps.length;\n const detail = {\n completedSteps: total === 0 ? 0 : Math.min(this._currentStep + 1, total),\n total,\n completed: total > 0 && this._currentStep >= total - 1\n };\n\n this._active = false;\n\n document.querySelectorAll('.vd-spotlight-target').forEach(el => {\n el.classList.remove('vd-spotlight-target');\n });\n\n if (this._elements.overlay && this._elements.overlay.parentNode) {\n this._elements.overlay.parentNode.removeChild(this._elements.overlay);\n }\n if (this._elements.tooltip && this._elements.tooltip.parentNode) {\n this._elements.tooltip.parentNode.removeChild(this._elements.tooltip);\n }\n\n this._cleanup.forEach(fn => fn());\n this._cleanup = [];\n this._elements = {};\n this._steps = [];\n this._currentStep = 0;\n\n if (this._triggerElement && this._triggerElement.isConnected && typeof this._triggerElement.focus === 'function') {\n this._triggerElement.focus();\n }\n this._triggerElement = null;\n\n document.dispatchEvent(new CustomEvent('spotlight:end', { detail }));\n },\n\n destroyAll: function () {\n this.stop();\n }\n };\n\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('spotlight', Spotlight);\n }\n\n window.VanduoSpotlight = Spotlight;\n\n})();\n", "/**\n * Vanduo Framework - Music Player Component\n * HTML5 Audio-based music player with transport controls, volume,\n * and optional shuffle, seek bar, and playlist features.\n *\n * Options (passed to MusicPlayer.init or data-music-player-options):\n * tracks {Array} - [{name, url}] \u2014 required\n * volume {number} - Initial volume 0\u20131 (default 0.5)\n * shuffle {boolean} - Shuffle on init (default false)\n * showProgress {boolean} - Show seek/progress bar (default false)\n * showPlaylist {boolean} - Show expandable playlist panel (default false)\n * autoAdvance {boolean} - Auto-play next track on end (default true)\n * glass {boolean} - Frosted-glass surface styling (default false)\n * detachable {boolean} - Show detach/attach; float above page when detached (default false)\n * floatingPosition {string|null} - After detach: 'bottom-left' or 'bottom-right' (default null = bottom-right)\n * draggable {boolean} - When detached+detachable, drag by handle (default false)\n * minimizable {boolean} - Minimize/expand control (default false)\n * startMinimized {boolean} - On first detach, start minimized (default false)\n * persistPosition {boolean} - Save floating x/y in localStorage (default false)\n * persistKey {string} - Storage key for persist (default from element id)\n *\n * Custom events (all bubble, dispatched on container):\n * musicplayer:play \u2014 playback started\n * musicplayer:pause \u2014 playback paused\n * musicplayer:trackchange \u2014 detail: { index, name, url }\n * musicplayer:volumechange \u2014 detail: { volume }\n * musicplayer:ended \u2014 last track ended (autoAdvance=false only)\n * musicplayer:detach \u2014 after floating player is created\n * musicplayer:attach \u2014 after returned to document flow\n * musicplayer:minimize \u2014 collapsed to minimal controls\n * musicplayer:expand \u2014 full controls visible again\n *\n * Programmatic API:\n * MusicPlayer.init(container?, options?)\n * MusicPlayer.play(container)\n * MusicPlayer.pause(container)\n * MusicPlayer.toggle(container)\n * MusicPlayer.next(container)\n * MusicPlayer.previous(container)\n * MusicPlayer.setVolume(container, value)\n * MusicPlayer.setTrack(container, index)\n * MusicPlayer.shuffle(container)\n * MusicPlayer.detach(container, position?)\n * MusicPlayer.attach(container)\n * MusicPlayer.minimize(container)\n * MusicPlayer.expand(container)\n * MusicPlayer.toggleMinimize(container)\n * MusicPlayer.setPosition(container, 'bottom-left'|'bottom-right'|{x,y})\n * MusicPlayer.getState(container)\n * MusicPlayer.destroy(container)\n * MusicPlayer.destroyAll()\n */\n\n(function () {\n 'use strict';\n\n /* \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Fisher-Yates shuffle (returns new array).\n * @param {Array} arr\n * @returns {Array}\n */\n function shuffleArray(arr) {\n const shuffled = arr.slice();\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = tmp;\n }\n return shuffled;\n }\n\n /**\n * Format seconds as m:ss.\n * @param {number} seconds\n * @returns {string}\n */\n function formatTime(seconds) {\n if (!isFinite(seconds) || seconds < 0) return '0:00';\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return m + ':' + (s < 10 ? '0' : '') + s;\n }\n\n /**\n * Set CSS background-size on a range input to visually fill the track.\n * @param {HTMLInputElement} input\n */\n /**\n * @param {string|undefined} id\n * @returns {string}\n */\n function persistStorageKey(id) {\n return 'vanduo:music-player:' + (id && id.trim() ? id.trim() : 'default') + ':pos';\n }\n\n function updateRangeFill(input) {\n const min = parseFloat(input.min) || 0;\n const max = parseFloat(input.max) || 1;\n const val = parseFloat(input.value) || 0;\n const pct = ((val - min) / (max - min)) * 100;\n input.style.setProperty('--vd-fill', pct + '%');\n // Fallback inline gradient for browsers without ::-moz-range-progress\n input.style.backgroundImage =\n 'linear-gradient(to right, var(--vd-music-player-track-fill, currentColor) 0%, ' +\n 'var(--vd-music-player-track-fill, currentColor) ' + pct + '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) ' + pct + '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) 100%)';\n }\n\n /* \u2500\u2500\u2500 Phosphor icon helper (matches framework icon style) \u2500 */\n\n /**\n * Return an <i class=\"ph ph-{name}\"> element (Phosphor icon).\n * @param {string} name\n * @returns {HTMLElement}\n */\n function icon(name) {\n const el = document.createElement('i');\n el.className = 'ph ph-' + name;\n el.setAttribute('aria-hidden', 'true');\n return el;\n }\n\n /* \u2500\u2500\u2500 Component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const MusicPlayer = {\n /** @type {Map<HTMLElement, Object>} */\n instances: new Map(),\n\n /**\n * Default options.\n */\n defaults: {\n tracks: [],\n volume: 0.5,\n shuffle: false,\n showProgress: false,\n showPlaylist: false,\n autoAdvance: true,\n glass: false,\n detachable: false,\n /** @type {null|string} */\n floatingPosition: null,\n draggable: false,\n minimizable: false,\n startMinimized: false,\n persistPosition: false,\n persistKey: '',\n },\n\n /**\n * Auto-initialize all .vd-music-player / [data-music-player] elements.\n * Options can be provided via data-music-player-options (JSON string).\n */\n init: function (root) {\n window.Vanduo.queryAll(root, '.vd-music-player, [data-music-player]').forEach((el) => {\n if (this.instances.has(el)) return;\n\n let opts = {};\n const attr = el.getAttribute('data-music-player-options');\n if (attr) {\n try { opts = JSON.parse(attr); } catch (_) { /* ignore malformed JSON */ }\n }\n this.initPlayer(el, opts);\n });\n },\n\n /**\n * Initialize a single player element.\n * @param {HTMLElement} container\n * @param {Object} [options]\n */\n initPlayer: function (container, options) {\n const opts = Object.assign({}, this.defaults, options || {});\n\n // Validate and normalise tracks\n const rawTracks = Array.isArray(opts.tracks) ? opts.tracks : [];\n const tracks = rawTracks.filter((t) => t && typeof t.url === 'string' && t.url.trim());\n\n // Build shuffled working copy without mutating opts\n const trackList = opts.shuffle ? shuffleArray(tracks) : tracks.slice();\n\n /* \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const state = {\n tracks: trackList,\n originalTracks: tracks.slice(),\n currentIndex: 0,\n isPlaying: false,\n volume: Math.max(0, Math.min(1, opts.volume)),\n shuffle: opts.shuffle,\n showProgress: opts.showProgress,\n showPlaylist: opts.showPlaylist,\n autoAdvance: opts.autoAdvance,\n audio: null,\n glass: Boolean(opts.glass),\n detachable: Boolean(opts.detachable),\n floatingPosition: opts.floatingPosition || 'bottom-right',\n draggable: Boolean(opts.draggable) && Boolean(opts.detachable),\n minimizable: Boolean(opts.minimizable),\n startMinimized: Boolean(opts.startMinimized),\n persistPosition: Boolean(opts.persistPosition),\n persistKey: typeof opts.persistKey === 'string' ? opts.persistKey : '',\n isDetached: false,\n isMinimized: false,\n _startMinimizeApplied: false,\n };\n\n /* \u2500\u2500 Audio element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const audio = new Audio();\n audio.volume = state.volume;\n audio.preload = 'metadata';\n state.audio = audio;\n\n /* \u2500\u2500 Build DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this._buildDOM(container, state);\n\n // Grab references after DOM build\n const refs = {\n btnPlay: container.querySelector('.vd-music-player-btn-play'),\n btnPrev: container.querySelector('.vd-music-player-btn-prev'),\n btnNext: container.querySelector('.vd-music-player-btn-next'),\n btnShuffle: container.querySelector('.vd-music-player-btn-shuffle'),\n btnPlaylist: container.querySelector('.vd-music-player-btn-playlist'),\n btnDetach: container.querySelector('.vd-music-player-btn-detach'),\n btnAttach: container.querySelector('.vd-music-player-btn-attach'),\n btnMinimize: container.querySelector('.vd-music-player-btn-minimize'),\n dragHandle: container.querySelector('.vd-music-player-drag-handle'),\n trackName: container.querySelector('.vd-music-player-track-name'),\n volumeSlider: container.querySelector('.vd-music-player-volume-slider'),\n volumeIcon: container.querySelector('.vd-music-player-volume-icon'),\n progressBar: container.querySelector('.vd-music-player-progress-bar'),\n timeElapsed: container.querySelector('.vd-music-player-time-elapsed'),\n timeDuration: container.querySelector('.vd-music-player-time-duration'),\n playlistPanel: container.querySelector('.vd-music-player-playlist'),\n };\n\n /* \u2500\u2500 Internal render helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const renderPlayIcon = () => {\n const btn = refs.btnPlay;\n if (!btn) return;\n btn.innerHTML = '';\n btn.appendChild(icon(state.isPlaying ? 'pause' : 'play'));\n btn.setAttribute('aria-label', state.isPlaying ? 'Pause' : 'Play');\n btn.classList.toggle('is-active', state.isPlaying);\n };\n\n const renderTrackName = () => {\n const el = refs.trackName;\n if (!el) return;\n const track = state.tracks[state.currentIndex];\n if (track) {\n el.textContent = track.name || 'Unknown Track';\n el.classList.remove('is-idle');\n } else {\n el.textContent = 'No tracks loaded';\n el.classList.add('is-idle');\n }\n };\n\n const renderVolumeIcon = () => {\n const el = refs.volumeIcon;\n if (!el) return;\n el.innerHTML = '';\n const v = state.volume;\n const name = v === 0 ? 'speaker-none' : v < 0.5 ? 'speaker-low' : 'speaker-high';\n el.appendChild(icon(name));\n };\n\n const renderShuffleBtn = () => {\n const btn = refs.btnShuffle;\n if (!btn) return;\n btn.classList.toggle('is-active', state.shuffle);\n btn.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n };\n\n const renderPlaylistItems = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n panel.innerHTML = '';\n state.tracks.forEach((track, i) => {\n const item = document.createElement('button');\n item.className =\n 'vd-music-player-playlist-item' + (i === state.currentIndex ? ' is-active' : '');\n item.type = 'button';\n item.setAttribute('data-index', String(i));\n item.setAttribute('aria-current', i === state.currentIndex ? 'true' : 'false');\n\n const num = document.createElement('span');\n num.className = 'vd-music-player-playlist-num';\n num.textContent = String(i + 1);\n\n const name = document.createElement('span');\n name.className = 'vd-music-player-playlist-name';\n name.textContent = track.name || 'Track ' + (i + 1);\n\n item.appendChild(num);\n item.appendChild(name);\n panel.appendChild(item);\n });\n };\n\n const renderProgress = () => {\n const bar = refs.progressBar;\n if (!bar || !audio.duration) return;\n const pct = (audio.currentTime / audio.duration) * 100;\n bar.value = String(pct);\n updateRangeFill(bar);\n if (refs.timeElapsed) refs.timeElapsed.textContent = formatTime(audio.currentTime);\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n };\n\n /* \u2500\u2500 Load track \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const loadTrack = (index, autoPlay) => {\n const track = state.tracks[index];\n if (!track) return;\n state.currentIndex = index;\n audio.src = track.url;\n renderTrackName();\n renderPlaylistItems();\n\n // Reset progress\n if (refs.progressBar) {\n refs.progressBar.value = '0';\n updateRangeFill(refs.progressBar);\n }\n if (refs.timeElapsed) refs.timeElapsed.textContent = '0:00';\n if (refs.timeDuration) refs.timeDuration.textContent = '0:00';\n\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n })\n );\n\n if (autoPlay) {\n audio.play().catch(() => { /* browser may block autoplay */ });\n }\n };\n\n /* \u2500\u2500 Audio event listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const cleanupFunctions = [];\n\n const onPlay = () => {\n state.isPlaying = true;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:play', { bubbles: true }));\n };\n\n const onPause = () => {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:pause', { bubbles: true }));\n };\n\n const onEnded = () => {\n if (state.autoAdvance && state.tracks.length > 1) {\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, true);\n } else {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:ended', { bubbles: true }));\n }\n };\n\n const onTimeUpdate = () => {\n if (state.showProgress) renderProgress();\n };\n\n const onLoadedMetadata = () => {\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n if (refs.progressBar) {\n refs.progressBar.max = '100';\n updateRangeFill(refs.progressBar);\n }\n };\n\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onLoadedMetadata);\n cleanupFunctions.push(() => {\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onLoadedMetadata);\n audio.pause();\n audio.src = '';\n });\n\n /* \u2500\u2500 Control button listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n if (refs.btnPlay) {\n const handler = () => {\n if (!audio.src && state.tracks.length) loadTrack(state.currentIndex, false);\n if (state.isPlaying) {\n audio.pause();\n } else {\n audio.play().catch(() => {});\n }\n };\n refs.btnPlay.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('click', handler));\n\n // Keyboard: Space / Enter (already native for <button>; guard for edge cases)\n const keyHandler = (e) => {\n if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handler(); }\n };\n refs.btnPlay.addEventListener('keydown', keyHandler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('keydown', keyHandler));\n }\n\n if (refs.btnPrev) {\n const handler = () => {\n if (!state.tracks.length) return;\n // If more than 3s into track, restart; otherwise go to previous\n if (audio.currentTime > 3) {\n audio.currentTime = 0;\n } else {\n const prev =\n state.currentIndex === 0 ? state.tracks.length - 1 : state.currentIndex - 1;\n loadTrack(prev, state.isPlaying);\n }\n };\n refs.btnPrev.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPrev.removeEventListener('click', handler));\n }\n\n if (refs.btnNext) {\n const handler = () => {\n if (!state.tracks.length) return;\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, state.isPlaying);\n };\n refs.btnNext.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnNext.removeEventListener('click', handler));\n }\n\n if (refs.btnShuffle) {\n const handler = () => {\n state.shuffle = !state.shuffle;\n if (state.shuffle) {\n const current = state.tracks[state.currentIndex];\n state.tracks = shuffleArray(state.tracks);\n // Keep current track at position 0 of the new order\n const newIdx = state.tracks.findIndex((t) => t === current);\n if (newIdx > 0) {\n state.tracks.splice(newIdx, 1);\n state.tracks.unshift(current);\n }\n state.currentIndex = 0;\n } else {\n // Restore original order, keep same track\n const current = state.tracks[state.currentIndex];\n state.tracks = state.originalTracks.slice();\n state.currentIndex = state.tracks.findIndex((t) => t === current);\n if (state.currentIndex < 0) state.currentIndex = 0;\n }\n renderShuffleBtn();\n renderPlaylistItems();\n };\n refs.btnShuffle.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnShuffle.removeEventListener('click', handler));\n }\n\n if (refs.btnPlaylist) {\n const handler = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n const isOpen = panel.classList.toggle('is-open');\n refs.btnPlaylist.classList.toggle('is-active', isOpen);\n refs.btnPlaylist.setAttribute('aria-expanded', isOpen ? 'true' : 'false');\n };\n refs.btnPlaylist.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlaylist.removeEventListener('click', handler));\n }\n\n if (refs.volumeSlider) {\n const handler = (e) => {\n const v = parseFloat(e.target.value);\n state.volume = v;\n audio.volume = v;\n renderVolumeIcon();\n updateRangeFill(refs.volumeSlider);\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } })\n );\n };\n refs.volumeSlider.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.volumeSlider.removeEventListener('input', handler));\n // Initial fill\n updateRangeFill(refs.volumeSlider);\n }\n\n if (refs.progressBar) {\n const handler = (e) => {\n if (!audio.duration) return;\n const pct = parseFloat(e.target.value);\n audio.currentTime = (pct / 100) * audio.duration;\n updateRangeFill(refs.progressBar);\n };\n refs.progressBar.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.progressBar.removeEventListener('input', handler));\n }\n\n // Playlist item click (event delegation)\n if (refs.playlistPanel) {\n const panelHandler = (e) => {\n const item = e.target.closest('.vd-music-player-playlist-item');\n if (!item) return;\n const idx = parseInt(item.getAttribute('data-index'), 10);\n if (!isNaN(idx)) loadTrack(idx, true);\n };\n refs.playlistPanel.addEventListener('click', panelHandler);\n cleanupFunctions.push(() =>\n refs.playlistPanel.removeEventListener('click', panelHandler)\n );\n }\n\n /* \u2500\u2500 Detach / attach / minimize chrome \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n if (refs.btnDetach) {\n const h = () => {\n this.detach(container);\n };\n refs.btnDetach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnDetach.removeEventListener('click', h));\n }\n if (refs.btnAttach) {\n const h = () => {\n this.attach(container);\n };\n refs.btnAttach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnAttach.removeEventListener('click', h));\n }\n if (refs.btnMinimize) {\n const h = () => {\n this.toggleMinimize(container);\n };\n refs.btnMinimize.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnMinimize.removeEventListener('click', h));\n }\n\n /* \u2500\u2500 Initial render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n renderPlayIcon();\n renderTrackName();\n renderVolumeIcon();\n if (opts.showPlaylist) renderPlaylistItems();\n\n /* \u2500\u2500 Persist instance \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this.instances.set(container, {\n state,\n audio,\n refs,\n cleanup: cleanupFunctions,\n ui: { restore: null, unbindDrag: null },\n });\n container.setAttribute('data-music-player-initialized', 'true');\n },\n\n /* \u2500\u2500\u2500 DOM builder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Build the inner DOM structure inside container.\n * Pre-existing inner content is replaced only if it has no\n * recognised child elements (allows server-rendered markup).\n * @param {HTMLElement} container\n * @param {Object} state\n */\n _buildDOM: function (container, state) {\n // Skip if already has the expected structure\n if (container.querySelector('.vd-music-player-controls')) return;\n\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Music Player');\n\n if (state.showProgress) container.classList.add('has-progress');\n if (state.showPlaylist) container.classList.add('has-playlist');\n if (state.glass) container.classList.add('vd-music-player-glass');\n if (state.draggable) container.classList.add('vd-music-player-draggable');\n\n // Detach / minimize / drag handle\n if (state.detachable || state.minimizable) {\n const tb = document.createElement('div');\n tb.className = 'vd-music-player-toolbar';\n tb.setAttribute('role', 'toolbar');\n tb.setAttribute('aria-label', 'Player window');\n if (state.draggable) {\n const h = document.createElement('button');\n h.type = 'button';\n h.className = 'vd-music-player-drag-handle';\n h.setAttribute('aria-label', 'Drag to move player');\n h.appendChild(icon('dots-six-vertical'));\n tb.appendChild(h);\n }\n const tSp = document.createElement('span');\n tSp.className = 'vd-music-player-toolbar-spacer';\n tSp.setAttribute('aria-hidden', 'true');\n tb.appendChild(tSp);\n if (state.minimizable) {\n const bMin = document.createElement('button');\n bMin.type = 'button';\n bMin.className = 'vd-music-player-btn vd-music-player-btn-minimize';\n bMin.setAttribute('aria-label', 'Minimize player');\n bMin.setAttribute('aria-expanded', 'true');\n bMin.appendChild(icon('minus'));\n tb.appendChild(bMin);\n }\n if (state.detachable) {\n const bOut = document.createElement('button');\n bOut.type = 'button';\n bOut.className = 'vd-music-player-btn vd-music-player-btn-detach';\n bOut.setAttribute('aria-label', 'Detach player');\n bOut.appendChild(icon('arrows-out'));\n tb.appendChild(bOut);\n const bIn = document.createElement('button');\n bIn.type = 'button';\n bIn.className = 'vd-music-player-btn vd-music-player-btn-attach';\n bIn.setAttribute('aria-label', 'Attach player');\n bIn.appendChild(icon('arrows-in'));\n tb.appendChild(bIn);\n }\n container.classList.add('vd-music-player-has-chrome');\n container.appendChild(tb);\n }\n\n // Track info row\n const info = document.createElement('div');\n info.className = 'vd-music-player-info';\n\n const iconWrap = document.createElement('span');\n iconWrap.className = 'vd-music-player-icon';\n iconWrap.setAttribute('aria-hidden', 'true');\n iconWrap.appendChild(icon('music-note'));\n\n const trackName = document.createElement('span');\n trackName.className = 'vd-music-player-track-name';\n trackName.setAttribute('aria-live', 'polite');\n trackName.setAttribute('aria-atomic', 'true');\n\n info.appendChild(iconWrap);\n info.appendChild(trackName);\n container.appendChild(info);\n\n // Controls row\n const controls = document.createElement('div');\n controls.className = 'vd-music-player-controls';\n controls.setAttribute('role', 'group');\n controls.setAttribute('aria-label', 'Playback controls');\n\n const btnPrev = document.createElement('button');\n btnPrev.type = 'button';\n btnPrev.className = 'vd-music-player-btn vd-music-player-btn-prev';\n btnPrev.setAttribute('aria-label', 'Previous track');\n btnPrev.appendChild(icon('skip-back'));\n\n const btnPlay = document.createElement('button');\n btnPlay.type = 'button';\n btnPlay.className = 'vd-music-player-btn vd-music-player-btn-play';\n btnPlay.setAttribute('aria-label', 'Play');\n btnPlay.appendChild(icon('play'));\n\n const btnNext = document.createElement('button');\n btnNext.type = 'button';\n btnNext.className = 'vd-music-player-btn vd-music-player-btn-next';\n btnNext.setAttribute('aria-label', 'Next track');\n btnNext.appendChild(icon('skip-forward'));\n\n controls.appendChild(btnPrev);\n controls.appendChild(btnPlay);\n controls.appendChild(btnNext);\n\n // Optional shuffle button\n if (state.showPlaylist || state.shuffle !== undefined) {\n // Always render shuffle so it can be shown when shuffle option is used\n const btnShuffle = document.createElement('button');\n btnShuffle.type = 'button';\n btnShuffle.className = 'vd-music-player-btn vd-music-player-btn-shuffle';\n btnShuffle.setAttribute('aria-label', 'Shuffle');\n btnShuffle.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n btnShuffle.appendChild(icon('shuffle'));\n controls.appendChild(btnShuffle);\n }\n\n // Spacer\n const spacer = document.createElement('span');\n spacer.className = 'vd-music-player-spacer';\n spacer.setAttribute('aria-hidden', 'true');\n controls.appendChild(spacer);\n\n // Volume\n const volumeWrap = document.createElement('div');\n volumeWrap.className = 'vd-music-player-volume';\n\n const volumeIcon = document.createElement('span');\n volumeIcon.className = 'vd-music-player-volume-icon';\n volumeIcon.setAttribute('aria-hidden', 'true');\n\n const volumeSlider = document.createElement('input');\n volumeSlider.type = 'range';\n volumeSlider.className = 'vd-music-player-volume-slider';\n volumeSlider.min = '0';\n volumeSlider.max = '1';\n volumeSlider.step = '0.01';\n volumeSlider.value = String(state.volume);\n volumeSlider.setAttribute('aria-label', 'Volume');\n\n volumeWrap.appendChild(volumeIcon);\n volumeWrap.appendChild(volumeSlider);\n controls.appendChild(volumeWrap);\n\n // Optional playlist toggle button\n if (state.showPlaylist) {\n const btnPlaylist = document.createElement('button');\n btnPlaylist.type = 'button';\n btnPlaylist.className = 'vd-music-player-btn vd-music-player-btn-playlist';\n btnPlaylist.setAttribute('aria-label', 'Show playlist');\n btnPlaylist.setAttribute('aria-expanded', 'false');\n btnPlaylist.appendChild(icon('playlist'));\n controls.appendChild(btnPlaylist);\n }\n\n container.appendChild(controls);\n\n // Optional progress bar\n if (state.showProgress) {\n const progressRow = document.createElement('div');\n progressRow.className = 'vd-music-player-progress';\n\n const timeElapsed = document.createElement('span');\n timeElapsed.className = 'vd-music-player-time vd-music-player-time-elapsed';\n timeElapsed.textContent = '0:00';\n timeElapsed.setAttribute('aria-hidden', 'true');\n\n const progressBar = document.createElement('input');\n progressBar.type = 'range';\n progressBar.className = 'vd-music-player-progress-bar';\n progressBar.min = '0';\n progressBar.max = '100';\n progressBar.step = '0.1';\n progressBar.value = '0';\n progressBar.setAttribute('aria-label', 'Seek');\n\n const timeDuration = document.createElement('span');\n timeDuration.className = 'vd-music-player-time vd-music-player-time-duration';\n timeDuration.textContent = '0:00';\n timeDuration.setAttribute('aria-hidden', 'true');\n\n progressRow.appendChild(timeElapsed);\n progressRow.appendChild(progressBar);\n progressRow.appendChild(timeDuration);\n container.appendChild(progressRow);\n }\n\n // Optional playlist panel (hidden until toggled)\n if (state.showPlaylist) {\n const playlist = document.createElement('div');\n playlist.className = 'vd-music-player-playlist';\n playlist.setAttribute('aria-label', 'Playlist');\n container.appendChild(playlist);\n }\n },\n\n /* \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * @param {HTMLElement} container\n */\n play: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (!inst.audio.src && inst.state.tracks.length) {\n inst.audio.src = inst.state.tracks[inst.state.currentIndex].url;\n }\n inst.audio.play().catch(() => {});\n },\n\n /**\n * @param {HTMLElement} container\n */\n pause: function (container) {\n const inst = this.instances.get(container);\n if (inst) inst.audio.pause();\n },\n\n /**\n * @param {HTMLElement} container\n */\n toggle: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (inst.state.isPlaying) {\n this.pause(container);\n } else {\n this.play(container);\n }\n },\n\n /**\n * @param {HTMLElement} container\n */\n next: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const next = (inst.state.currentIndex + 1) % inst.state.tracks.length;\n this._loadTrack(inst, next, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n */\n previous: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const len = inst.state.tracks.length;\n const prev = (inst.state.currentIndex - 1 + len) % len;\n this._loadTrack(inst, prev, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} value - 0 to 1\n */\n setVolume: function (container, value) {\n const inst = this.instances.get(container);\n if (!inst) return;\n const v = Math.max(0, Math.min(1, value));\n inst.state.volume = v;\n inst.audio.volume = v;\n if (inst.refs.volumeSlider) {\n inst.refs.volumeSlider.value = String(v);\n updateRangeFill(inst.refs.volumeSlider);\n }\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } })\n );\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} index - Track index\n */\n setTrack: function (container, index) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._loadTrack(inst, index, inst.state.isPlaying);\n },\n\n /**\n * Shuffle or un-shuffle the track list.\n * @param {HTMLElement} container\n */\n shuffle: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.refs.btnShuffle) return;\n inst.refs.btnShuffle.click();\n },\n\n /**\n * Float the player above the page. Requires { detachable: true } at init.\n * @param {HTMLElement} container\n * @param {string} [position] 'bottom-left' or 'bottom-right'\n */\n detach: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.detachable || inst.state.isDetached) return;\n const s = inst.state;\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n s.isDetached = true;\n inst.ui.restore = {\n parent: container.parentNode,\n next: container.nextSibling,\n };\n document.body.appendChild(container);\n container.classList.add('vd-music-player-floating', 'vd-music-player-detached');\n const pos = position != null && position !== undefined ? position : s.floatingPosition;\n this._setCornerPosition(\n container,\n pos === 'bottom-left' || pos === 'bottom-right' ? pos : 'bottom-right'\n );\n this._loadPersistedPosition(container, inst);\n if (s.startMinimized && !s._startMinimizeApplied) {\n s._startMinimizeApplied = true;\n this.minimize(container);\n }\n this._bindFloatingDrag(inst);\n container.dispatchEvent(new CustomEvent('musicplayer:detach', { bubbles: true }));\n },\n\n /**\n * Return a detached player to its original place in the document.\n * @param {HTMLElement} container\n */\n attach: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n this._unbindFloatingDrag(inst);\n inst.state.isDetached = false;\n const r = inst.ui && inst.ui.restore;\n container.classList.remove(\n 'vd-music-player-floating',\n 'vd-music-player-detached',\n 'vd-music-player-floating-bottom-left',\n 'vd-music-player-floating-bottom-right',\n 'is-position-custom'\n );\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n if (r && r.parent && r.parent.isConnected) {\n r.parent.insertBefore(container, r.next);\n }\n if (inst.ui) {\n inst.ui.restore = null;\n inst.ui.unbindDrag = null;\n }\n container.dispatchEvent(new CustomEvent('musicplayer:attach', { bubbles: true }));\n },\n\n /**\n * Collapse to essential controls. Requires { minimizable: true } at init.\n * @param {HTMLElement} container\n */\n minimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || inst.state.isMinimized) return;\n const s = inst.state;\n s.isMinimized = true;\n container.classList.add('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, true);\n if (\n inst.refs.playlistPanel &&\n inst.refs.playlistPanel.classList.contains('is-open') &&\n inst.refs.btnPlaylist\n ) {\n inst.refs.playlistPanel.classList.remove('is-open');\n inst.refs.btnPlaylist.classList.remove('is-active');\n inst.refs.btnPlaylist.setAttribute('aria-expanded', 'false');\n }\n container.dispatchEvent(new CustomEvent('musicplayer:minimize', { bubbles: true }));\n },\n\n /**\n * Restore from minimized state.\n * @param {HTMLElement} container\n */\n expand: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || !inst.state.isMinimized) return;\n inst.state.isMinimized = false;\n container.classList.remove('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, false);\n container.dispatchEvent(new CustomEvent('musicplayer:expand', { bubbles: true }));\n },\n\n /**\n * Toggle minimize / expand.\n * @param {HTMLElement} container\n */\n toggleMinimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable) return;\n if (inst.state.isMinimized) {\n this.expand(container);\n } else {\n this.minimize(container);\n }\n },\n\n /**\n * Set floating corner or pixel position (detached only).\n * @param {HTMLElement} container\n * @param {string|{x:number,y:number}} position 'bottom-left' | 'bottom-right' | { x, y } viewport\n */\n setPosition: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n if (typeof position === 'string') {\n this._setCornerPosition(\n container,\n position === 'bottom-left' || position === 'bottom-right' ? position : 'bottom-right'\n );\n } else if (position && typeof position.x === 'number' && typeof position.y === 'number') {\n this._setCustomPositionFromRect(container, position.x, position.y);\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n this._savePositionPixels(inst, r.left, r.top);\n }\n },\n\n /**\n * @param {Object} inst\n * @param {boolean} minimized\n */\n _setMinimizeButtonState: function (inst, minimized) {\n const b = inst.refs && inst.refs.btnMinimize;\n if (!b) return;\n b.innerHTML = '';\n b.appendChild(icon(minimized ? 'plus' : 'minus'));\n b.setAttribute('aria-label', minimized ? 'Expand player' : 'Minimize player');\n b.setAttribute('aria-expanded', minimized ? 'false' : 'true');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {string} which 'bottom-left' | 'bottom-right'\n */\n _setCornerPosition: function (container, which) {\n container.classList.remove('is-position-custom', 'vd-music-player-floating-bottom-left', 'vd-music-player-floating-bottom-right');\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n if (which === 'bottom-left') {\n container.classList.add('vd-music-player-floating-bottom-left');\n } else {\n container.classList.add('vd-music-player-floating-bottom-right');\n }\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} left\n * @param {number} top\n */\n _setCustomPositionFromRect: function (container, left, top) {\n container.classList.remove('vd-music-player-floating-bottom-left', 'vd-music-player-floating-bottom-right');\n container.classList.add('is-position-custom');\n container.style.setProperty('--vd-music-player-floating-left', left + 'px');\n container.style.setProperty('--vd-music-player-floating-top', top + 'px');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {Object} inst\n */\n _loadPersistedPosition: function (container, inst) {\n if (!inst.state.persistPosition) return;\n const key = this._persistKeyForInstance(inst, container);\n let raw = null;\n if (typeof window.safeStorageGet === 'function') {\n raw = window.safeStorageGet(key, null);\n } else {\n try {\n raw = localStorage.getItem(key);\n } catch (_e) {\n /* ignore unavailable storage */\n }\n }\n if (!raw) return;\n try {\n const o = JSON.parse(raw);\n if (o && typeof o.x === 'number' && typeof o.y === 'number') {\n this._setCustomPositionFromRect(container, o.x, o.y);\n }\n } catch (_err) { /* ignore */ }\n },\n\n /**\n * @param {Object} inst\n * @param {number} x\n * @param {number} y\n */\n _savePositionPixels: function (inst, x, y) {\n if (!inst.state.persistPosition) return;\n const container = this._containerOf(inst);\n if (!container) return;\n const key = this._persistKeyForInstance(inst, container);\n const val = JSON.stringify({ x, y });\n if (typeof window.safeStorageSet === 'function') {\n window.safeStorageSet(key, val);\n } else {\n try {\n localStorage.setItem(key, val);\n } catch (_e) { /* ignore */ }\n }\n },\n\n /**\n * @param {Object} inst\n * @param {HTMLElement} container\n * @returns {string}\n */\n _persistKeyForInstance: function (inst, container) {\n const pk = inst.state.persistKey;\n if (pk && String(pk).trim()) return persistStorageKey(String(pk).trim());\n return persistStorageKey(container.id || '');\n },\n\n /**\n * @param {Object} inst\n */\n _unbindFloatingDrag: function (inst) {\n if (inst.ui && typeof inst.ui.unbindDrag === 'function') {\n inst.ui.unbindDrag();\n inst.ui.unbindDrag = null;\n }\n },\n\n /**\n * Free-form pointer drag on the handle. Vanduo's `draggable` component uses HTML5\n * drag/drop for list reordering; floating players use pointer events on the handle instead.\n * @param {Object} inst\n */\n _bindFloatingDrag: function (inst) {\n this._unbindFloatingDrag(inst);\n const h = inst.refs && inst.refs.dragHandle;\n if (!h || !inst.state || !inst.state.draggable) return;\n const self = this;\n const container = this._containerOf(inst);\n if (!container) return;\n let startX = 0;\n let startY = 0;\n let origL = 0;\n let origT = 0;\n let activeDrag = false;\n const onDown = function (e) {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.preventDefault();\n activeDrag = true;\n const r = container.getBoundingClientRect();\n origL = r.left;\n origT = r.top;\n startX = e.clientX;\n startY = e.clientY;\n self._setCustomPositionFromRect(container, origL, origT);\n try {\n h.setPointerCapture(e.pointerId);\n } catch (_err) { /* empty */ }\n };\n const onMove = function (e) {\n if (!activeDrag) return;\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n let nl = origL + dx;\n let nt = origT + dy;\n const r = container.getBoundingClientRect();\n const w = r.width;\n const ph = r.height;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = 8;\n nl = Math.max(pad, Math.min(nl, vw - w - pad));\n nt = Math.max(pad, Math.min(nt, vh - ph - pad));\n self._setCustomPositionFromRect(container, nl, nt);\n };\n const onUp = function (e) {\n if (!activeDrag) return;\n activeDrag = false;\n if (typeof h.hasPointerCapture === 'function' && h.hasPointerCapture(e.pointerId)) {\n try {\n h.releasePointerCapture(e.pointerId);\n } catch (_e) { /* empty */ }\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n self._savePositionPixels(inst, r.left, r.top);\n }\n };\n h.addEventListener('pointerdown', onDown);\n h.addEventListener('pointermove', onMove);\n h.addEventListener('pointerup', onUp);\n h.addEventListener('pointercancel', onUp);\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n inst.ui.unbindDrag = function () {\n h.removeEventListener('pointerdown', onDown);\n h.removeEventListener('pointermove', onMove);\n h.removeEventListener('pointerup', onUp);\n h.removeEventListener('pointercancel', onUp);\n };\n },\n\n /**\n * Return a shallow copy of the current player state.\n * @param {HTMLElement} container\n * @returns {Object|null}\n */\n getState: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return null;\n const s = inst.state;\n return {\n isPlaying: s.isPlaying,\n currentIndex: s.currentIndex,\n currentTrack: s.tracks[s.currentIndex] || null,\n volume: s.volume,\n shuffle: s.shuffle,\n tracks: s.tracks.slice(),\n isDetached: Boolean(s.isDetached),\n isMinimized: Boolean(s.isMinimized),\n };\n },\n\n /**\n * Stop playback, clean up listeners, remove instance.\n * @param {HTMLElement} container\n */\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._unbindFloatingDrag(inst);\n if (inst.state && inst.state.isDetached) {\n try {\n this.attach(container);\n } catch (_e) { /* empty */ }\n }\n inst.cleanup.forEach((fn) => fn());\n this.instances.delete(container);\n container.removeAttribute('data-music-player-initialized');\n },\n\n /**\n * Destroy all instances.\n */\n destroyAll: function () {\n this.instances.forEach((_, container) => this.destroy(container));\n },\n\n /* \u2500\u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Load track by index on an already-initialised instance object.\n * @param {Object} inst\n * @param {number} index\n * @param {boolean} autoPlay\n */\n _loadTrack: function (inst, index, autoPlay) {\n const track = inst.state.tracks[index];\n if (!track) return;\n const container = this._containerOf(inst);\n\n inst.state.currentIndex = index;\n inst.audio.src = track.url;\n\n if (inst.refs.trackName) {\n inst.refs.trackName.textContent = track.name || 'Unknown Track';\n inst.refs.trackName.classList.remove('is-idle');\n }\n\n // Update playlist highlights\n if (inst.refs.playlistPanel) {\n inst.refs.playlistPanel.querySelectorAll('.vd-music-player-playlist-item').forEach((item, i) => {\n const active = i === index;\n item.classList.toggle('is-active', active);\n item.setAttribute('aria-current', active ? 'true' : 'false');\n });\n }\n\n // Reset progress\n if (inst.refs.progressBar) {\n inst.refs.progressBar.value = '0';\n updateRangeFill(inst.refs.progressBar);\n }\n if (inst.refs.timeElapsed) inst.refs.timeElapsed.textContent = '0:00';\n if (inst.refs.timeDuration) inst.refs.timeDuration.textContent = '0:00';\n\n if (container) {\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n })\n );\n }\n\n if (autoPlay) inst.audio.play().catch(() => {});\n },\n\n /**\n * Reverse-lookup the container element for a given instance object.\n * @param {Object} inst\n * @returns {HTMLElement|null}\n */\n _containerOf: function (inst) {\n for (const [container, i] of this.instances) {\n if (i === inst) return container;\n }\n return null;\n },\n };\n\n // Register with Vanduo framework\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('musicPlayer', MusicPlayer);\n }\n\n // Convenience global\n window.VanduoMusicPlayer = MusicPlayer;\n})();\n", "/**\n * Vanduo Framework - Bundle Entry Point\n * This file imports all framework components for bundling.\n *\n * All component files are side-effect modules that:\n * 1. Define their component object\n * 2. Register with window.Vanduo via Vanduo.register()\n * 3. Expose a convenience global (e.g. window.VanduoTooltips)\n *\n * The IIFE build uses `globalName: 'VanduoBundle'` so that esbuild's\n * wrapper variable does NOT shadow the real `window.Vanduo` that the\n * side-effect scripts create. After the bundle executes, `window.Vanduo`\n * is the fully-populated framework object.\n *\n * For ESM/CJS consumers we re-export `window.Vanduo` as the default\n * and named export so `import { Vanduo }` and `const { Vanduo } = require()`\n * both work.\n */\n\n// Utilities (must load first \u2014 helpers defines `ready()`, `safeStorageGet()` etc.)\nimport './utils/helpers.js';\nimport './utils/lifecycle.js';\n\n// Core framework object (creates window.Vanduo)\nimport './vanduo.js';\n\n// Components (each registers itself with window.Vanduo)\nimport './components/code-snippet.js';\nimport './components/collapsible.js';\nimport './components/dropdown.js';\nimport './components/font-switcher.js';\nimport './components/grid.js';\nimport './components/image-box.js';\nimport './components/modals.js';\nimport './components/navbar.js';\nimport './components/pagination.js';\nimport './components/parallax.js';\nimport './components/preloader.js';\nimport './components/select.js';\nimport './components/sidenav.js';\nimport './components/tabs.js';\nimport './components/theme-customizer.js';\nimport './components/theme-switcher.js';\nimport './components/toast.js';\nimport './components/tooltips.js';\nimport './components/doc-search.js';\nimport './components/draggable.js';\nimport './components/lazy-load.js';\n\n// Effects (glass scroll activation, water morph)\nimport './components/glass.js';\nimport './components/morph.js';\nimport './components/expanding-cards.js';\nimport './components/timeline.js';\n\n// Phase 10 (v1.2.7) components\nimport './components/flow.js';\nimport './components/bubble.js';\nimport './components/waypoint.js';\nimport './components/ripple.js';\nimport './components/affix.js';\nimport './components/suggest.js';\nimport './components/validate.js';\nimport './components/datepicker.js';\nimport './components/timepicker.js';\nimport './components/stepper.js';\nimport './components/rating.js';\nimport './components/transfer.js';\nimport './components/tree.js';\nimport './components/spotlight.js';\nimport './components/music-player.js';\n\n// Re-export for ESM / CJS consumers\nconst Vanduo = window.Vanduo;\nexport { Vanduo };\nexport default Vanduo;\n"],
5
+ "mappings": "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",
6
+ "names": ["normalizeCallbacks", "value", "fn", "normalizeOptions", "options", "callSafely", "label", "error", "Lifecycle", "root", "element", "scope", "selector", "matches", "descendants", "i", "componentName", "cleanupFns", "optionBag", "cleanup", "onDestroy", "componentEntries", "existing", "entry", "entries", "toRemove", "container", "result", "VANDUO_VERSION", "hasOwn", "Vanduo", "name", "root", "selector", "scope", "matches", "descendants", "i", "component", "key", "lifecycle", "componentName", "instance", "element", "cleanup", "framework", "originalInit", "args", "scopedRoot", "result", "syncRoot", "originalDestroyAll", "e", "options", "opts", "alias", "canonicalName", "names", "CodeSnippet", "root", "selector", "scope", "matches", "descendants", "snippet", "baseId", "target", "event", "handler", "toggle", "content", "tabs", "panes", "copyBtn", "pane", "isExpanded", "expanded", "snippetId", "tabList", "tab", "index", "lang", "isActive", "e", "activeTab", "activePane", "tabArray", "currentIndex", "newIndex", "code", "copySuccess", "text", "textarea", "success", "err", "announcement", "source", "html", "codeEl", "lines", "indent", "indentSize", "formattedLines", "line", "hasOpenTag", "isSelfClosing", "div", "normalized", "rawCode", "escaped", "mode", "highlighted", "nextCodeEl", "css", "js", "kw", "regex", "lineCount", "lineNumbers", "i", "lineNum", "codeWrapper", "fn", "Collapsible", "root", "container", "isAccordion", "items", "cleanupFunctions", "item", "header", "body", "trigger", "clickHandler", "e", "otherItem", "otherBody", "animate", "height", "el", "instance", "fn", "Dropdown", "root", "dropdown", "toggle", "menu", "cleanupFunctions", "toggleClickHandler", "e", "documentClickHandler", "keydownHandler", "item", "itemClickHandler", "itemKeydownHandler", "otherMenu", "otherDropdown", "otherToggle", "firstItem", "rect", "menuRect", "viewportWidth", "viewportHeight", "padding", "isOpen", "items", "currentIndex", "nextIndex", "prevIndex", "instance", "match", "i", "el", "fn", "FontSwitcher", "root", "fontKey", "event", "toggle", "onChange", "e", "onClick", "fontKeys", "nextIndex", "label", "eventName", "key", "fallback", "value", "supportsHas", "GridLayout", "root", "container", "mode", "cleanupFunctions", "button", "clickHandler", "e", "targetSelector", "target", "row", "count", "btn", "isActive", "instance", "event", "newMode", "fn", "scope", "ImageBox", "root", "self", "backdropClickHandler", "e", "imgClickHandler", "closeBtnHandler", "escHandler", "scrollHandler", "currentScrollY", "trigger", "errorHandler", "loadHandler", "clickHandler", "keyHandler", "originalCleanup", "imgSrc", "captionText", "scrollbarWidth", "fn", "Modals", "modal", "state", "root", "trigger", "triggerClickHandler", "e", "modalId", "backdrop", "closeButtons", "dialog", "cleanupFunctions", "title", "button", "closeHandler", "backdropClickHandler", "topModal", "el", "modalData", "_dialog", "scrollbarWidth", "trapHandler", "firstFocusable", "index", "self", "focusableElements", "firstElement", "lastElement", "fn", "scope", "data", "Navbar", "breakpointValue", "parsed", "root", "navbar", "isGlass", "isTransparent", "getThreshold", "attr", "onScroll", "scrolled", "toggle", "menu", "overlay", "cleanupFunctions", "scrollWatcherCleanup", "toggleClickHandler", "e", "overlayClickHandler", "keydownHandler", "resizeTimer", "resizeHandler", "breakpoint", "documentClickHandler", "dropdownToggle", "dropdownClickHandler", "dropdownMenu", "instance", "fn", "_navbar", "Pagination", "root", "pagination", "totalPages", "currentPage", "maxVisible", "clickHandler", "e", "link", "item", "page", "options", "html", "pages", "lastPage", "safePage", "half", "start", "end", "i", "el", "instance", "fn", "Parallax", "root", "element", "disableMobile", "layers", "speed", "direction", "config", "rect", "windowHeight", "elementTop", "elementHeight", "offset", "layer", "_index", "layerSpeed", "layerOffset", "el", "_config", "Preloader", "root", "bar", "initialValue", "value", "animate", "el", "text", "targetValue", "duration", "startValue", "difference", "startTime", "currentTime", "elapsed", "progress", "easeOut", "currentValue", "preloader", "Select", "root", "select", "cleanupFunctions", "wrapper", "button", "dropdown", "searchWrapper", "searchInput", "filterFn", "e", "searchHandler", "buttonClickHandler", "documentClickHandler", "keydownHandler", "changeHandler", "options", "fragment", "option", "index", "group", "groupElement", "optionElement", "_e", "selected", "selectedOption", "selectedValues", "opt", "optionEl", "value", "firstOption", "isOpen", "currentIndex", "nextIndex", "prevIndex", "instance", "match", "searchTerm", "term", "element", "id", "fn", "Sidenav", "sidenav", "state", "finalizeRestore", "transitionEndHandler", "event", "root", "toggle", "toggleClickHandler", "e", "targetId", "resizeHandler", "position", "prefix", "overlay", "closeButton", "cleanupFunctions", "closeHandler", "overlayClickHandler", "escKeyHandler", "el", "isOpen", "content", "data", "fn", "scope", "Tabs", "root", "container", "tabList", "tabLinks", "tabPanes", "cleanupFunctions", "link", "index", "tabId", "pane", "clickHandler", "e", "keydownHandler", "fallbackIndex", "tab", "allTabs", "allPanes", "tabIndex", "t", "p", "event", "currentTab", "isVertical", "tabs", "currentIndex", "newIndex", "tabElement", "instance", "fn", "ThemeCustomizer", "root", "selector", "scope", "matches", "descendants", "trigger", "target", "event", "handler", "options", "theme", "key", "value", "colorKey", "neutralKey", "radius", "fontKey", "mode", "expected", "themeSwitcher", "type", "detail", "changeEvent", "scopedTriggers", "existingCustomizer", "overlay", "panel", "el", "anchorTrigger", "triggerRect", "panelWidth", "panelTop", "viewportWidth", "panelRight", "swatch", "btn", "fontSelect", "e", "resetBtn", "closeBtn", "esc", "text", "div", "safeColor", "normalized", "primarySwatches", "neutralSwatches", "radiusButtons", "r", "fontOptions", "mq", "newDefault", "onClick", "candidate", "prefs", "fallback", "fn", "ThemeSwitcher", "root", "pref", "key", "fallback", "value", "_e", "toggle", "onChange", "e", "onClick", "modes", "nextIndex", "span", "scope", "eventName", "Toast", "position", "container", "options", "type", "duration", "config", "toast", "html", "allowSvg", "safeIcon", "_esc", "s", "d", "safeDuration", "closeBtn", "onClose", "timeoutId", "remainingTime", "startTime", "startTimer", "progress", "pauseTimer", "showEvent", "dismissEvent", "handleTransitionEnd", "fn", "message", "Tooltips", "input", "options", "root", "element", "tooltip", "cleanupFunctions", "enterHandler", "leaveHandler", "focusHandler", "blurHandler", "tooltipId", "htmlContent", "textContent", "allowSvg", "placement", "delay", "timer", "rect", "tooltipRect", "scrollTop", "scrollLeft", "top", "left", "viewportWidth", "viewportHeight", "padding", "el", "content", "isHtml", "data", "fn", "DEFAULTS", "ALLOWED_HIGHLIGHT_TAGS", "isRoot", "value", "normalizeRoot", "root", "normalizeHighlightTag", "tagName", "normalized", "createSearch", "options", "config", "state", "queryAll", "selector", "scope", "matches", "queryOne", "safeInvokeCallback", "name", "fn", "args", "error", "setResultsHtml", "html", "init", "instance", "buildIndex", "bindEvents", "setupAria", "item", "slugify", "extractKeywordsFromText", "sections", "categoryMap", "buildCategoryMap", "section", "id", "titleEl", "title", "category", "content", "extractContent", "keywords", "extractKeywords", "iconEl", "icon", "ci", "map", "currentCategory", "href", "clone", "el", "text", "word", "code", "classMatches", "match", "attr", "str", "e", "handleInput", "open", "handleKeydown", "close", "result", "index", "select", "unbindEvents", "resultsId", "query", "search", "render", "navigate", "terms", "t", "scored", "entry", "score", "titleLower", "categoryLower", "contentLower", "term", "k", "a", "b", "renderEmpty", "isActive", "getCategoryIcon", "excerpt", "getExcerpt", "escapeHtml", "highlight", "renderFooter", "categorySlug", "excerptLength", "matchPos", "i", "pos", "start", "end", "escaped", "regex", "div", "direction", "newIndex", "setActiveIndex", "prevActive", "newActive", "updateSidebarActive", "sectionId", "link", "destroy", "rebuild", "setConfig", "newConfig", "getConfig", "getIndex", "Search", "rootOrOptions", "maybeOptions", "Draggable", "root", "element", "container", "zone", "cleanupFunctions", "dragStartHandler", "e", "dragHandler", "dragEndHandler", "touchStartHandler", "touchMoveHandler", "touchEndHandler", "touchCancelHandler", "keydownHandler", "item", "dragEnterHandler", "dragOverHandler", "draggingEl", "dropHandler", "dragLeaveHandler", "existing", "data", "initialPos", "touch", "rect", "deltaX", "deltaY", "endTouch", "endPosition", "dropZone", "startX", "startY", "_zone", "x", "y", "stacked", "target", "targetZone", "zones", "nextZone", "prevZone", "position", "clientX", "clientY", "isVertical", "nextSibling", "closest", "child", "box", "offset", "prev", "next", "clone", "offsetX", "offsetY", "options", "el", "fn", "_observerMap", "_isRoot", "root", "_normalizeRoot", "_isInRoot", "element", "scope", "_queryAll", "selector", "matches", "descendants", "i", "_isSafeUrl", "url", "_safeInjectHtml", "containerEl", "html", "doc", "DANGEROUS_TAGS", "tag", "els", "_sanitizeNode", "node", "attrs", "attrName", "trimmedValue", "children", "nodes", "_skeletonHtml", "_spinnerHtml", "_resolvePlaceholder", "placeholder", "_dispatch", "el", "eventName", "detail", "VanduoLazyLoad", "callback", "options", "threshold", "rootMargin", "observer", "entries", "obs", "entry", "e", "opts", "placeholderHtml", "controller", "timeoutId", "res", "err", "alertEl", "msgEl", "detailEl", "self", "GlassScroll", "root", "el", "sentinelSelector", "sentinel", "observer", "entries", "entry", "Morph", "root", "el", "cleanup", "morphing", "handleClick", "e", "instance", "fn", "_", "wave", "shine", "waveEl", "pointerEvent", "onComplete", "rect", "cx", "cy", "px", "py", "duration", "custom", "parsed", "current", "next", "ExpandingCards", "root", "el", "container", "cleanup", "getCards", "setActive", "card", "cards", "c", "onClick", "e", "t", "onKeydown", "activeEl", "idx", "syncAria", "mo", "inst", "fn", "_", "countRevealedPrefix", "items", "count", "i", "findPlaybackControls", "container", "initPlayback", "cleanup", "item", "scope", "prevBtn", "nextBtn", "playBtn", "pauseBtn", "playTimer", "isPlaying", "playToken", "updateNavButtons", "k", "n", "atStart", "atEnd", "stepNext", "stepPrev", "scheduleNext", "token", "pause", "play", "addClick", "el", "fn", "handler", "e", "Timeline", "root", "child", "idx", "playbackApi", "observer", "entries", "entry", "inst", "_", "Flow", "root", "el", "track", "slides", "isFade", "autoplay", "interval", "loop", "state", "cleanup", "slide", "i", "liveRegion", "goTo", "index", "announce", "target", "prev", "s", "ind", "next", "prevBtn", "nextBtn", "h", "keyHandler", "e", "pointerDown", "pointerMove", "pointerUp", "diff", "startAutoplay", "stopAutoplay", "pauseHandler", "resumeHandler", "instance", "fn", "_", "Bubble", "root", "el", "outsideClick", "e", "inst", "trigger", "escHandler", "_", "cleanup", "placement", "popover", "title", "content", "htmlContent", "allowSvg", "header", "titleSpan", "closeBtn", "closeHandler", "body", "popId", "toggleHandler", "rect", "popRect", "gap", "top", "left", "instance", "fn", "Waypoint", "root", "nav", "links", "cleanup", "offset", "sections", "link", "id", "section", "activeSections", "setActive", "l", "target", "rootMargin", "observer", "entries", "entry", "i", "s", "clickHandler", "e", "instance", "fn", "_", "Ripple", "root", "el", "cleanup", "createWave", "e", "rect", "size", "x", "y", "wave", "instance", "fn", "w", "_", "isScrollable", "element", "style", "overflowY", "overflowX", "canScrollY", "canScrollX", "getScrollParent", "parent", "Affix", "root", "el", "cleanup", "parsedOffset", "offset", "scrollParent", "isStuck", "sentinel", "stick", "unstick", "observer", "entries", "entry", "instance", "fn", "_", "_escapeHtml", "text", "div", "_isSafeUrl", "url", "allowlist", "resolved", "Suggest", "root", "el", "input", "cleanup", "minChars", "value", "staticData", "items", "s", "wrapper", "list", "listId", "highlighted", "currentItems", "debounceTimer", "renderItems", "filtered", "query", "empty", "item", "i", "li", "escaped", "re", "selectItem", "open", "close", "index", "highlight", "listItems", "doSearch", "separator", "lower", "inputHandler", "keyHandler", "e", "total", "blurHandler", "focusHandler", "instance", "fn", "_", "Validate", "value", "param", "escaped", "other", "root", "form", "cleanup", "mode", "fields", "validateField", "field", "rules", "r", "errors", "rule", "name", "params", "validator", "msg", "validateAll", "valid", "eventType", "handler", "inputClear", "submitHandler", "e", "firstInvalid", "wrapper", "errorEl", "instance", "message", "fn", "_", "DAYS", "MONTHS", "escapeRegexChar", "c", "buildParseFormat", "format", "regex", "order", "i", "slice", "parseDateFromFormat", "value", "m", "y", "mo", "d", "ci", "k", "part", "v", "dt", "formatDate", "yyyy", "mm", "dd", "out", "dateKey", "addDays", "n", "x", "addMonthsClamped", "parseYmdLocal", "ymd", "day", "startOfWeekSunday", "endOfWeekSunday", "positionAnchoredPopup", "anchor", "popup", "gap", "offset", "rect", "top", "left", "popRect", "alignedRect", "Datepicker", "root", "el", "input", "cleanup", "minStr", "maxStr", "minDate", "maxDate", "today", "viewYear", "viewMonth", "selectedDate", "viewMode", "focusedDate", "skipNextFocusOpen", "isDisabled", "ensureMonthInRange", "first", "last", "firstSelectableInMonth", "trimmed", "parsed", "fallback", "clampedInit", "wrapper", "isSameDay", "a", "b", "selectDate", "date", "close", "focusFocusedDay", "key", "btn", "skipDisabled", "stepDir", "maxSteps", "step", "createDayBtn", "outside", "isFocused", "render", "header", "prevBtn", "nextBtn", "title", "decadeStart", "gridWrap", "weekdays", "span", "firstDay", "daysInMonth", "daysInPrev", "cells", "dayNum", "prevMonth", "prevYear", "totalCells", "remaining", "r", "row", "cell", "grid", "name", "positionPopup", "handleGridKeydown", "e", "next", "skipDir", "cl", "repositionHandler", "open", "focusHandler", "outsideHandler", "escHandler", "instance", "fn", "_", "positionAnchoredPopup", "anchor", "popup", "gap", "offset", "rect", "top", "left", "popRect", "alignedRect", "Timepicker", "root", "el", "input", "cleanup", "is24h", "step", "wrapper", "times", "h", "m", "hh24", "mm", "period", "display", "render", "t", "item", "i", "close", "positionPopup", "repositionHandler", "open", "selected", "focusHandler", "outsideHandler", "e", "escHandler", "instance", "fn", "_", "Stepper", "root", "el", "cleanup", "items", "isClickable", "currentIndex", "i", "setStep", "index", "prev", "item", "handler", "inst", "fn", "_", "Rating", "root", "el", "cleanup", "max", "initialValue", "readonly", "currentValue", "stars", "i", "star", "valueDisplay", "updateStars", "value", "starNum", "enterHandler", "s", "j", "leaveHandler", "clickHandler", "keyHandler", "e", "v", "inst", "fn", "_", "Transfer", "root", "el", "cleanup", "sourceData", "targetData", "item", "i", "sourceSelected", "targetSelected", "render", "sourcePanel", "createPanel", "actions", "moveRightBtn", "moveRight", "moveLeftBtn", "moveLeft", "targetPanel", "title", "data", "selected", "_side", "panel", "header", "titleSpan", "count", "searchDiv", "searchInput", "list", "renderList", "filter", "d", "li", "checkbox", "label", "toMove", "fireChange", "inst", "fn", "_", "Tree", "root", "el", "cleanup", "cascade", "data", "render", "items", "parent", "item", "node", "content", "toggle", "e", "ph", "cb", "setChildChecked", "icon", "label", "childList", "checked", "keyHandler", "focused", "nodes", "idx", "next", "prev", "collect", "i", "inst", "fn", "_", "Spotlight", "root", "trigger", "clickHandler", "event", "steps", "raw", "parsed", "error", "step", "target", "hasSelectorTarget", "hasElementTarget", "title", "description", "options", "normalizedSteps", "startOptions", "overlay", "tooltip", "escHandler", "e", "index", "el", "total", "desc", "footer", "counter", "actions", "prevBtn", "skipBtn", "nextBtn", "doneBtn", "rect", "tRect", "top", "left", "detail", "fn", "shuffleArray", "arr", "shuffled", "i", "j", "tmp", "formatTime", "seconds", "m", "s", "persistStorageKey", "id", "updateRangeFill", "input", "min", "max", "pct", "icon", "name", "el", "MusicPlayer", "root", "opts", "attr", "container", "options", "tracks", "t", "state", "audio", "refs", "renderPlayIcon", "btn", "renderTrackName", "track", "renderVolumeIcon", "v", "renderShuffleBtn", "renderPlaylistItems", "panel", "item", "num", "renderProgress", "bar", "loadTrack", "index", "autoPlay", "cleanupFunctions", "onPlay", "onPause", "onEnded", "next", "onTimeUpdate", "onLoadedMetadata", "handler", "keyHandler", "e", "prev", "current", "newIdx", "isOpen", "panelHandler", "idx", "h", "tb", "tSp", "bMin", "bOut", "bIn", "info", "iconWrap", "trackName", "controls", "btnPrev", "btnPlay", "btnNext", "btnShuffle", "spacer", "volumeWrap", "volumeIcon", "volumeSlider", "btnPlaylist", "progressRow", "timeElapsed", "progressBar", "timeDuration", "playlist", "inst", "len", "value", "position", "pos", "r", "minimized", "b", "which", "left", "top", "key", "raw", "o", "x", "y", "val", "pk", "self", "startX", "startY", "origL", "origT", "activeDrag", "onDown", "onMove", "dx", "dy", "nl", "nt", "w", "ph", "vw", "vh", "pad", "onUp", "fn", "_", "active", "Vanduo", "index_default", "Vanduo"]
7
7
  }