vanduo-framework 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +205 -0
  3. package/css/components/alerts.css +224 -0
  4. package/css/components/avatar.css +275 -0
  5. package/css/components/badges.css +230 -0
  6. package/css/components/breadcrumbs.css +146 -0
  7. package/css/components/button-group.css +82 -0
  8. package/css/components/buttons.css +530 -0
  9. package/css/components/cards.css +304 -0
  10. package/css/components/chips.css +259 -0
  11. package/css/components/code-snippet.css +555 -0
  12. package/css/components/collapsible.css +267 -0
  13. package/css/components/collections.css +253 -0
  14. package/css/components/doc-search.css +464 -0
  15. package/css/components/doc-tabs.css +38 -0
  16. package/css/components/draggable.css +317 -0
  17. package/css/components/dropdown.css +266 -0
  18. package/css/components/footer.css +375 -0
  19. package/css/components/forms.css +1774 -0
  20. package/css/components/image-box.css +279 -0
  21. package/css/components/modals.css +285 -0
  22. package/css/components/navbar.css +530 -0
  23. package/css/components/pagination.css +186 -0
  24. package/css/components/preloader.css +340 -0
  25. package/css/components/progress.css +107 -0
  26. package/css/components/sidenav.css +301 -0
  27. package/css/components/skeleton.css +241 -0
  28. package/css/components/spinner.css +144 -0
  29. package/css/components/tabs.css +327 -0
  30. package/css/components/theme-customizer.css +835 -0
  31. package/css/components/toast.css +357 -0
  32. package/css/components/tooltips.css +270 -0
  33. package/css/core/colors.css +1017 -0
  34. package/css/core/fonts.css +266 -0
  35. package/css/core/grid.css +1699 -0
  36. package/css/core/helpers.css +2202 -0
  37. package/css/core/reset.css +128 -0
  38. package/css/core/tokens.css +213 -0
  39. package/css/core/typography.css +405 -0
  40. package/css/core/vd-aliases.css +47 -0
  41. package/css/effects/parallax.css +113 -0
  42. package/css/icons/icons-all.css +23 -0
  43. package/css/icons/icons.css +25 -0
  44. package/css/utilities/media.css +167 -0
  45. package/css/utilities/print.css +111 -0
  46. package/css/utilities/shadow.css +243 -0
  47. package/css/utilities/table.css +381 -0
  48. package/css/utilities/transforms.css +71 -0
  49. package/css/utilities/transitions.css +87 -0
  50. package/css/vanduo.css +80 -0
  51. package/dist/build-info.json +6 -0
  52. package/dist/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
  53. package/dist/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
  54. package/dist/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
  55. package/dist/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
  56. package/dist/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
  57. package/dist/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
  58. package/dist/fonts/inter/inter-bold.woff2 +0 -0
  59. package/dist/fonts/inter/inter-medium.woff2 +0 -0
  60. package/dist/fonts/inter/inter-regular.woff2 +0 -0
  61. package/dist/fonts/inter/inter-semibold.woff2 +0 -0
  62. package/dist/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
  63. package/dist/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
  64. package/dist/fonts/open-sans/open-sans-bold.woff2 +0 -0
  65. package/dist/fonts/open-sans/open-sans-medium.woff2 +0 -0
  66. package/dist/fonts/open-sans/open-sans-regular.woff2 +0 -0
  67. package/dist/fonts/rubik/rubik-bold.woff2 +0 -0
  68. package/dist/fonts/rubik/rubik-medium.woff2 +0 -0
  69. package/dist/fonts/rubik/rubik-regular.woff2 +0 -0
  70. package/dist/fonts/source-sans/source-sans-bold.woff2 +0 -0
  71. package/dist/fonts/source-sans/source-sans-regular.woff2 +0 -0
  72. package/dist/fonts/source-sans/source-sans-semibold.woff2 +0 -0
  73. package/dist/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
  74. package/dist/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
  75. package/dist/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
  76. package/dist/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
  77. package/dist/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
  78. package/dist/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
  79. package/dist/icons/phosphor/LICENSE +21 -0
  80. package/dist/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
  81. package/dist/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
  82. package/dist/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
  83. package/dist/icons/phosphor/bold/style.css +4627 -0
  84. package/dist/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
  85. package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
  86. package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
  87. package/dist/icons/phosphor/duotone/style.css +12115 -0
  88. package/dist/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
  89. package/dist/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
  90. package/dist/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
  91. package/dist/icons/phosphor/fill/style.css +4627 -0
  92. package/dist/icons/phosphor/light/Phosphor-Light.ttf +0 -0
  93. package/dist/icons/phosphor/light/Phosphor-Light.woff +0 -0
  94. package/dist/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
  95. package/dist/icons/phosphor/light/style.css +4627 -0
  96. package/dist/icons/phosphor/regular/Phosphor.ttf +0 -0
  97. package/dist/icons/phosphor/regular/Phosphor.woff +0 -0
  98. package/dist/icons/phosphor/regular/Phosphor.woff2 +0 -0
  99. package/dist/icons/phosphor/regular/style.css +4627 -0
  100. package/dist/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
  101. package/dist/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
  102. package/dist/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
  103. package/dist/icons/phosphor/thin/style.css +4627 -0
  104. package/dist/vanduo.cjs.js +5569 -0
  105. package/dist/vanduo.cjs.js.map +7 -0
  106. package/dist/vanduo.cjs.min.js +48 -0
  107. package/dist/vanduo.cjs.min.js.map +7 -0
  108. package/dist/vanduo.css +60666 -0
  109. package/dist/vanduo.css.map +1 -0
  110. package/dist/vanduo.esm.js +5548 -0
  111. package/dist/vanduo.esm.js.map +7 -0
  112. package/dist/vanduo.esm.min.js +48 -0
  113. package/dist/vanduo.esm.min.js.map +7 -0
  114. package/dist/vanduo.js +5545 -0
  115. package/dist/vanduo.js.map +7 -0
  116. package/dist/vanduo.min.css +2 -0
  117. package/dist/vanduo.min.css.map +1 -0
  118. package/dist/vanduo.min.js +48 -0
  119. package/dist/vanduo.min.js.map +7 -0
  120. package/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
  121. package/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
  122. package/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
  123. package/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
  124. package/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
  125. package/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
  126. package/fonts/inter/inter-bold.woff2 +0 -0
  127. package/fonts/inter/inter-medium.woff2 +0 -0
  128. package/fonts/inter/inter-regular.woff2 +0 -0
  129. package/fonts/inter/inter-semibold.woff2 +0 -0
  130. package/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
  131. package/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
  132. package/fonts/open-sans/open-sans-bold.woff2 +0 -0
  133. package/fonts/open-sans/open-sans-medium.woff2 +0 -0
  134. package/fonts/open-sans/open-sans-regular.woff2 +0 -0
  135. package/fonts/rubik/rubik-bold.woff2 +0 -0
  136. package/fonts/rubik/rubik-medium.woff2 +0 -0
  137. package/fonts/rubik/rubik-regular.woff2 +0 -0
  138. package/fonts/source-sans/source-sans-bold.woff2 +0 -0
  139. package/fonts/source-sans/source-sans-regular.woff2 +0 -0
  140. package/fonts/source-sans/source-sans-semibold.woff2 +0 -0
  141. package/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
  142. package/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
  143. package/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
  144. package/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
  145. package/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
  146. package/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
  147. package/icons/phosphor/LICENSE +21 -0
  148. package/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
  149. package/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
  150. package/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
  151. package/icons/phosphor/bold/style.css +4627 -0
  152. package/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
  153. package/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
  154. package/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
  155. package/icons/phosphor/duotone/style.css +12115 -0
  156. package/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
  157. package/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
  158. package/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
  159. package/icons/phosphor/fill/style.css +4627 -0
  160. package/icons/phosphor/light/Phosphor-Light.ttf +0 -0
  161. package/icons/phosphor/light/Phosphor-Light.woff +0 -0
  162. package/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
  163. package/icons/phosphor/light/style.css +4627 -0
  164. package/icons/phosphor/regular/Phosphor.ttf +0 -0
  165. package/icons/phosphor/regular/Phosphor.woff +0 -0
  166. package/icons/phosphor/regular/Phosphor.woff2 +0 -0
  167. package/icons/phosphor/regular/style.css +4627 -0
  168. package/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
  169. package/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
  170. package/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
  171. package/icons/phosphor/thin/style.css +4627 -0
  172. package/js/components/code-snippet.js +639 -0
  173. package/js/components/collapsible.js +226 -0
  174. package/js/components/doc-search.js +936 -0
  175. package/js/components/draggable.js +725 -0
  176. package/js/components/dropdown.js +362 -0
  177. package/js/components/font-switcher.js +253 -0
  178. package/js/components/grid.js +279 -0
  179. package/js/components/image-box.js +372 -0
  180. package/js/components/modals.js +367 -0
  181. package/js/components/navbar.js +264 -0
  182. package/js/components/pagination.js +286 -0
  183. package/js/components/parallax.js +216 -0
  184. package/js/components/preloader.js +183 -0
  185. package/js/components/select.js +444 -0
  186. package/js/components/sidenav.js +303 -0
  187. package/js/components/tabs.js +303 -0
  188. package/js/components/theme-customizer.js +784 -0
  189. package/js/components/theme-switcher.js +183 -0
  190. package/js/components/toast.js +343 -0
  191. package/js/components/tooltips.js +306 -0
  192. package/js/index.js +52 -0
  193. package/js/utils/helpers.js +306 -0
  194. package/js/utils/lifecycle.js +135 -0
  195. package/js/vanduo.js +120 -0
  196. package/package.json +78 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../js/index.js", "../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"],
4
+ "sourcesContent": ["/**\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';\n\n// Re-export for ESM / CJS consumers\nconst Vanduo = window.Vanduo;\nexport { Vanduo };\nexport default Vanduo;\n", "/**\n * Vanduo Framework - Lifecycle Manager\n * Central registry for component instances and cleanup\n * Prevents memory leaks in SPAs by tracking event listeners\n */\n\n(function() {\n 'use strict';\n\n /**\n * Lifecycle Manager\n * Simple registry that tracks component instances and their cleanup functions\n */\n const Lifecycle = {\n // Map of element -> { componentName, cleanupFunctions }\n instances: new Map(),\n\n /**\n * Register a component instance\n * @param {HTMLElement} element - The DOM element\n * @param {string} componentName - Name of the component\n * @param {Array<Function>} cleanupFns - Functions to call on destroy\n */\n register: function(element, componentName, cleanupFns = []) {\n if (this.instances.has(element)) {\n // Already registered, merge cleanup functions\n const existing = this.instances.get(element);\n existing.cleanup = existing.cleanup.concat(cleanupFns);\n return;\n }\n\n this.instances.set(element, {\n component: componentName,\n cleanup: cleanupFns,\n registeredAt: Date.now()\n });\n },\n\n /**\n * Unregister a single element and run its cleanup\n * @param {HTMLElement} element - The element to unregister\n */\n unregister: function(element) {\n const instance = this.instances.get(element);\n if (!instance) return;\n\n // Run all cleanup functions\n instance.cleanup.forEach(function(fn) {\n try {\n fn();\n } catch (e) {\n console.warn('[Vanduo Lifecycle] Cleanup error:', e);\n }\n });\n\n this.instances.delete(element);\n },\n\n /**\n * Destroy all instances of a specific component\n * @param {string} componentName - Optional component name filter\n */\n destroyAll: function(componentName) {\n const toRemove = [];\n\n this.instances.forEach(function(instance, element) {\n if (!componentName || instance.component === componentName) {\n toRemove.push(element);\n }\n });\n\n toRemove.forEach(function(element) {\n Lifecycle.unregister(element);\n });\n },\n\n /**\n * Destroy all instances within a specific container\n * Useful for SPAs when navigating between pages\n * @param {HTMLElement} container - Container element\n */\n destroyAllInContainer: function(container) {\n const toRemove = [];\n\n this.instances.forEach(function(instance, element) {\n if (container.contains(element)) {\n toRemove.push(element);\n }\n });\n\n toRemove.forEach(function(element) {\n Lifecycle.unregister(element);\n });\n },\n\n /**\n * Get all registered instances (for debugging)\n * @returns {Array} Array of instance info objects\n */\n getAll: function() {\n const result = [];\n this.instances.forEach(function(instance, element) {\n result.push({\n element: element,\n component: instance.component,\n registeredAt: instance.registeredAt\n });\n });\n return result;\n },\n\n /**\n * Check if an element is registered\n * @param {HTMLElement} element - The element to check\n * @returns {boolean}\n */\n has: function(element) {\n return this.instances.has(element);\n }\n };\n\n // Auto-cleanup on page unload\n window.addEventListener('beforeunload', function() {\n Lifecycle.destroyAll();\n });\n\n // Expose globally\n window.VanduoLifecycle = Lifecycle;\n\n // Register with Vanduo framework if available\n if (typeof window.Vanduo !== 'undefined') {\n window.Vanduo.register('lifecycle', Lifecycle);\n }\n\n})();\n", "/**\n * Vanduo Framework - Main JavaScript File\n * v1.1.6\n */\n\n(function() {\n 'use strict';\n\n /**\n * Vanduo Framework Object\n */\n const Vanduo = {\n version: '1.1.6',\n components: {},\n\n /**\n * Initialize framework\n * Call this after DOM is ready and all components are loaded\n */\n init: function() {\n // Initialize components when DOM is ready\n if (typeof ready !== 'undefined') {\n ready(() => {\n this.initComponents();\n });\n } else {\n // Fallback if helpers.js is not loaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.initComponents();\n });\n } else {\n this.initComponents();\n }\n }\n },\n\n /**\n * Initialize all components\n */\n initComponents: function() {\n // Initialize all registered components\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();\n } catch (e) {\n console.warn('[Vanduo] Failed to initialize component \"' + name + '\":', e);\n }\n }\n });\n\n console.log('Vanduo Framework v1.1.6 initialized');\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) {\n this.components[name] = component;\n // Note: Components are NOT auto-initialized on registration\n // Call Vanduo.init() explicitly after all components are registered\n },\n\n /**\n * Re-initialize a component (useful after dynamic DOM changes)\n * @param {string} name - Component name\n */\n reinit: function(name) {\n var component = this.components[name];\n if (component && component.init && typeof component.init === 'function') {\n try {\n component.init();\n } catch (e) {\n console.warn('[Vanduo] Failed to reinitialize component \"' + name + '\":', e);\n }\n }\n },\n\n /**\n * Destroy all component instances and clean up event listeners\n * Uses lifecycle manager for memory leak prevention\n */\n destroyAll: function() {\n // First, destroy components that have their own destroyAll\n var names = Object.keys(this.components);\n for (var i = 0; i < names.length; i++) {\n var component = this.components[names[i]];\n if (component && component.destroyAll && typeof component.destroyAll === 'function') {\n try {\n component.destroyAll();\n } catch (e) {\n console.warn('[Vanduo] Failed to destroy component \"' + names[i] + '\":', e);\n }\n }\n }\n\n // Then, cleanup any remaining registered elements via lifecycle manager\n if (typeof window.VanduoLifecycle !== 'undefined') {\n window.VanduoLifecycle.destroyAll();\n }\n },\n\n /**\n * Get component instance\n * @param {string} name - Component name\n * @returns {Object|null}\n */\n getComponent: function(name) {\n return this.components[name] || 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 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 () {\n const snippets = document.querySelectorAll('.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 // 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 try {\n await navigator.clipboard.writeText(code);\n this.showCopyFeedback(copyBtn, true);\n } catch (_err) {\n // Fallback for older browsers\n const success = this.fallbackCopy(code);\n this.showCopyFeedback(copyBtn, success);\n }\n\n // Dispatch event\n const event = new CustomEvent('codesnippet:copy', {\n bubbles: true,\n detail: { snippet, code, success: true }\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\n pane.innerHTML = '<code>' + html + '</code>';\n pane.dataset.extracted = '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 /**\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-]+)(=)(&quot;|&#39;)/g, '<span class=\"code-attr\">$1</span>$2$3');\n\n // Highlight attribute values (strings)\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.innerHTML = code.outerHTML;\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 () {\n const snippets = document.querySelectorAll('.vd-code-snippet[data-initialized=\"true\"]');\n snippets.forEach(snippet => this.destroy(snippet));\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() {\n const collapsibles = document.querySelectorAll('.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", "/**\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 // Typeahead state\n _typeaheadBuffer: '',\n _typeaheadTimer: null,\n\n /**\n * Initialize dropdown components\n */\n init: function() {\n const dropdowns = document.querySelectorAll('.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 });\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 // Check if menu overflows right\n if (rect.left + menuRect.width > viewportWidth - padding) {\n menu.classList.add('vd-dropdown-menu-end');\n menu.classList.remove('vd-dropdown-menu-start');\n }\n \n // Check if menu overflows bottom (for top positioning)\n if (menu.classList.contains('dropdown-menu-top')) {\n if (rect.top - menuRect.height < padding) {\n menu.classList.remove('vd-dropdown-menu-top');\n }\n } else {\n if (rect.bottom + menuRect.height > viewportHeight - padding) {\n menu.classList.add('vd-dropdown-menu-top');\n }\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 clearTimeout(this._typeaheadTimer);\n this._typeaheadBuffer += e.key.toLowerCase();\n\n const match = items.find(item =>\n item.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n this._typeaheadTimer = setTimeout(() => {\n this._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", "/**\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 'inter': {\n name: 'Inter',\n family: \"'Inter', sans-serif\"\n },\n 'source-sans': {\n name: 'Source Sans 3',\n family: \"'Source Sans 3', sans-serif\"\n },\n 'fira-sans': {\n name: 'Fira Sans',\n family: \"'Fira Sans', sans-serif\"\n },\n 'ibm-plex': {\n name: 'IBM Plex Sans',\n family: \"'IBM Plex Sans', sans-serif\"\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 'rubik': {\n name: 'Rubik',\n family: \"'Rubik', sans-serif\",\n category: 'sans-serif',\n description: 'Modern, geometric'\n },\n 'titillium-web': {\n name: 'Titillium Web',\n family: \"'Titillium Web', sans-serif\",\n category: 'sans-serif',\n description: 'Technical, elegant'\n }\n },\n\n init: function() {\n this.state = {\n preference: this.getPreference()\n };\n\n if (this.isInitialized) {\n this.applyFont();\n this.renderUI();\n this.updateUI();\n return;\n }\n\n this.isInitialized = true;\n\n this.applyFont();\n this.renderUI();\n\n console.log('Vanduo Font Switcher initialized');\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() {\n const toggles = document.querySelectorAll('[data-toggle=\"font\"]');\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() {\n const toggles = document.querySelectorAll('[data-toggle=\"font\"]');\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() {\n const toggles = document.querySelectorAll('[data-toggle=\"font\"][data-font-initialized=\"true\"]');\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 this.isInitialized = false;\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 var 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 var GridLayout = {\n instances: new Map(),\n\n /**\n * Initialize all grid layout containers\n */\n init: function () {\n var containers = document.querySelectorAll('[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();\n },\n\n /**\n * Initialize a single grid container\n * @param {HTMLElement} container - Element with data-layout-mode\n */\n initContainer: function (container) {\n var mode = container.getAttribute('data-layout-mode') || 'standard';\n var 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 () {\n var toggleButtons = document.querySelectorAll('[data-grid-toggle]');\n\n toggleButtons.forEach(function (button) {\n if (button.getAttribute('data-grid-initialized') === 'true') {\n return;\n }\n\n var clickHandler = function (e) {\n e.preventDefault();\n var targetSelector = button.getAttribute('data-grid-toggle');\n var 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 var rows = container.querySelectorAll('.vd-row, .row');\n rows.forEach(function (row) {\n var cols = row.querySelectorAll(':scope > [class*=\"vd-col-\"], :scope > [class*=\"col-\"]');\n var 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 var 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 var toggleButtons = document.querySelectorAll('[data-grid-toggle]');\n toggleButtons.forEach(function (btn) {\n var targetSelector = btn.getAttribute('data-grid-toggle');\n if (targetSelector && container.matches(targetSelector)) {\n var 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 var instance = this.instances.get(container);\n if (instance) {\n instance.mode = mode;\n }\n\n // Dispatch custom event\n var 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 var currentMode = container.getAttribute('data-layout-mode') || 'standard';\n var 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 var 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 () {\n this.instances.forEach(function (instance, container) {\n this.destroy(container);\n }.bind(this));\n\n var toggleButtons = 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 /**\n * Initialize Image Box component\n */\n init: function () {\n this.createBackdrop();\n this.bindTriggers();\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 () {\n const self = this;\n const triggers = document.querySelectorAll('[data-image-box]');\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\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 },\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('--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.img.onload = () => {\n this.img.style.opacity = '';\n };\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('--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 this.img.src = '';\n this.img.alt = '';\n }\n }, 300);\n },\n\n /**\n * Reinitialize - useful after dynamic DOM changes\n */\n reinit: function () {\n this.bindTriggers();\n },\n\n /**\n * Destroy component and clean up\n */\n destroy: function () {\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 = 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 () {\n this.destroy();\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\n // Store trigger cleanup functions\n _triggerCleanups: [],\n\n /**\n * Initialize modals\n */\n init: function () {\n const modals = document.querySelectorAll('.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 = 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 this._triggerCleanups.push(() => 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\n const escKeyHandler = (e) => {\n if (e.key === 'Escape' && this.openModals.length > 0) {\n const topModal = this.openModals[this.openModals.length - 1];\n if (topModal === modal && topModal.dataset.keyboard !== 'false') {\n this.close(topModal);\n }\n }\n };\n document.addEventListener('keydown', escKeyHandler);\n cleanupFunctions.push(() => document.removeEventListener('keydown', escKeyHandler));\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 // 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\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 // Close if open\n if (modal.classList.contains('is-open')) {\n this.close(modal);\n }\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 () {\n this.modals.forEach((data, modal) => {\n this.destroy(modal);\n });\n // Clean up trigger listeners\n this._triggerCleanups.forEach(fn => fn());\n this._triggerCleanups = [];\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", "/**\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('--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 () {\n const navbars = document.querySelectorAll('.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 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 if (!toggle || !menu) {\n return;\n }\n\n // Store cleanup functions for this navbar instance\n const cleanupFunctions = [];\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\n document.body.style.overflow = 'hidden';\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.style.overflow = '';\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() {\n const paginations = document.querySelectorAll('.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", "/**\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 () {\n if (this.isInitialized) {\n this.refresh();\n return;\n }\n\n this.isInitialized = true;\n\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 = document.querySelectorAll('.vd-parallax');\n\n parallaxElements.forEach(element => {\n if (!element.dataset.parallaxInitialized) {\n this.initParallax(element);\n }\n });\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", "/**\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 /**\n * Initialize preloader components\n */\n init: function() {\n const progressBars = document.querySelectorAll('.progress-bar[data-progress]');\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(--transition-duration-slow) var(--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('.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() {\n const progressBars = document.querySelectorAll('.progress-bar[data-progress-initialized=\"true\"]');\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", "/**\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 // Typeahead state\n _typeaheadBuffer: '',\n _typeaheadTimer: null,\n\n /**\n * Initialize select components\n */\n init: function () {\n const selects = document.querySelectorAll('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 });\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('.vd-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('.vd-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('.vd-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 clearTimeout(this._typeaheadTimer);\n this._typeaheadBuffer += e.key.toLowerCase();\n\n const match = options.find(opt =>\n opt.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer)\n );\n if (match) {\n match.focus();\n }\n\n this._typeaheadTimer = setTimeout(() => {\n this._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 return 'select-' + Math.random().toString(36).substr(2, 9);\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", "/**\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 \n // Global cleanup functions (toggles, resize)\n _globalCleanups: [],\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 /**\n * Initialize sidenav components\n */\n init: function() {\n const sidenavs = document.querySelectorAll('.vd-sidenav');\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 = 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 this._globalCleanups.push(() => toggle.removeEventListener('click', toggleClickHandler));\n });\n\n // Handle responsive behavior\n this.handleResize();\n const resizeHandler = () => {\n this.handleResize();\n };\n window.addEventListener('resize', resizeHandler);\n this._globalCleanups.push(() => window.removeEventListener('resize', resizeHandler));\n },\n\n /**\n * Initialize a single sidenav\n * @param {HTMLElement} sidenav - Sidenav element\n */\n initSidenav: function(sidenav) {\n const overlay = this.createOverlay(sidenav);\n const closeButton = sidenav.querySelector('.vd-sidenav-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 // 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 \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 // Close if open\n if (sidenav.classList.contains('is-open')) {\n this.close(sidenav);\n }\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() {\n this.sidenavs.forEach((data, sidenav) => {\n this.destroy(sidenav);\n });\n this._globalCleanups.forEach(fn => fn());\n this._globalCleanups = [];\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", "/**\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() {\n const tabContainers = document.querySelectorAll('.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 = link.dataset.tab || link.getAttribute('href')?.replace('#', '') || `tab-${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 * 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 = link.dataset.tab || link.getAttribute('href')?.replace('#', '');\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 tabId = tab.dataset.tab || tab.getAttribute('href')?.replace('#', '') || tab.id;\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('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=\"${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: 'amber',\n PRIMARY_DARK: 'amber',\n NEUTRAL: 'slate',\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 '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 'inter': { name: 'Inter', family: \"'Inter', sans-serif\" },\n 'source-sans': { name: 'Source Sans 3', family: \"'Source Sans 3', sans-serif\" },\n 'fira-sans': { name: 'Fira Sans', family: \"'Fira Sans', sans-serif\" },\n 'ibm-plex': { name: 'IBM Plex Sans', family: \"'IBM Plex Sans', sans-serif\" },\n 'system': { name: 'System Default', family: null },\n // Google Fonts Collection\n 'ubuntu': { name: 'Ubuntu', family: \"'Ubuntu', sans-serif\" },\n 'open-sans': { name: 'Open Sans', family: \"'Open Sans', sans-serif\" },\n 'rubik': { name: 'Rubik', family: \"'Rubik', sans-serif\" },\n 'titillium-web': { name: 'Titillium Web', family: \"'Titillium Web', 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\n // DOM references\n elements: {\n customizer: null,\n trigger: null,\n panel: null,\n overlay: null\n },\n\n /**\n * Initialize the Theme Customizer\n */\n init: function () {\n if (this.isInitialized) {\n this.bindExistingElements();\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();\n this.bindEvents();\n\n console.log('Vanduo Theme Customizer initialized');\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.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('--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 // Check if we should switch primary color (if using default)\n const oldDefault = this.getDefaultPrimary(this.state.theme);\n if (this.state.primary === oldDefault) {\n const newDefault = this.getDefaultPrimary(mode);\n if (newDefault !== this.state.primary) {\n this.applyPrimary(newDefault);\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 if (window.Vanduo && window.Vanduo.components.themeSwitcher) {\n const themeSwitcher = window.Vanduo.components.themeSwitcher;\n if (themeSwitcher.state) {\n themeSwitcher.state.preference = mode;\n }\n }\n\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 () {\n // First check for existing full structure\n this.elements.customizer = document.querySelector('.vd-theme-customizer');\n\n if (this.elements.customizer) {\n this.elements.trigger = this.elements.customizer.querySelector('.vd-theme-customizer-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 button with data attribute\n const standaloneTrigger = document.querySelector('[data-theme-customizer-trigger]');\n if (standaloneTrigger) {\n this.createDynamicPanel(standaloneTrigger);\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 (triggerButton) {\n // Create wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'vd-theme-customizer';\n\n // Move trigger into wrapper or create reference\n this.elements.trigger = triggerButton;\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.elements.customizer = { contains: (el) => panel.contains(el) || triggerButton.contains(el) };\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\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 = this.elements.trigger.getBoundingClientRect();\n const panelWidth = 320; // --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 // Mode buttons\n this.elements.panel.querySelectorAll('[data-mode]').forEach(btn => {\n this.addListener(btn, 'click', () => {\n this.applyTheme(btn.dataset.mode);\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 // 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=\"${key}\" style=\"--swatch-color: ${value.color}\" title=\"${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=\"${key}\" style=\"--swatch-color: ${value.color}\" title=\"${value.name}\"><span>${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=\"${r}\">${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=\"${key}\"${key === this.state.font ? ' selected' : ''}>${value.name}</option>`;\n }\n\n // Generate mode buttons\n const modeIcons = {\n 'system': 'ph-desktop',\n 'dark': 'ph-moon',\n 'light': 'ph-sun'\n };\n let modeButtons = '';\n this.THEME_MODES.forEach(mode => {\n modeButtons += `<button class=\"tc-mode-btn${mode === this.state.theme ? ' is-active' : ''}\" data-mode=\"${mode}\"><i class=\"ph ${modeIcons[mode]}\"></i><span>${mode.charAt(0).toUpperCase() + mode.slice(1)}</span></button>`;\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 <div class=\"tc-section\">\n <label class=\"tc-label\">Color Mode</label>\n <div class=\"tc-mode-group\">\n ${modeButtons}\n </div>\n </div>\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 bindEvents: function () {\n // Trigger click - bind to any trigger button\n if (this.elements.trigger) {\n this.addListener(this.elements.trigger, 'click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.toggle();\n });\n }\n\n this.bindPanelEvents();\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 /**\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 if (this.elements.trigger) {\n this.elements.trigger.setAttribute('aria-expanded', 'true');\n }\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 if (this.elements.trigger) {\n this.elements.trigger.setAttribute('aria-expanded', 'false');\n }\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 // Update mode buttons\n this.elements.panel.querySelectorAll('[data-mode]').forEach(btn => {\n btn.classList.toggle('is-active', btn.dataset.mode === this.state.theme);\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.applyTheme(this.DEFAULTS.THEME);\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 () {\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.close();\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 init: function () {\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();\n this.updateUI();\n return;\n }\n\n this.isInitialized = true;\n\n this.applyTheme();\n this.listenForSystemChanges();\n this.renderUI();\n\n console.log('Vanduo Theme Switcher initialized');\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 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 }\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 () {\n // Look for any uninitialized theme toggles\n const toggles = document.querySelectorAll('[data-toggle=\"theme\"]');\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 () {\n const toggles = document.querySelectorAll('[data-toggle=\"theme\"]');\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 () {\n const toggles = document.querySelectorAll('[data-toggle=\"theme\"][data-theme-initialized=\"true\"]');\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 (this._mediaQuery && this._onMediaChange) {\n this._mediaQuery.removeEventListener('change', this._onMediaChange);\n }\n\n this._mediaQuery = null;\n this._onMediaChange = null;\n this.isInitialized = false;\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: Toast.show('Message', 'success', 3000)\n if (typeof options === 'string') {\n options = {\n message: options,\n type: type,\n duration: duration\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 safeIcon = typeof sanitizeHtml === 'function' ? sanitizeHtml(config.icon) : 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 * @returns {string} sanitized HTML\n */\n sanitizeHtml: function (input) {\n if (typeof sanitizeHtml === 'function') {\n return sanitizeHtml(input);\n }\n // Fallback: strip all HTML\n var div = document.createElement('div');\n div.textContent = input || '';\n return div.innerHTML;\n },\n\n /**\n * Initialize tooltips\n */\n init: function () {\n const elements = document.querySelectorAll('[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 tooltip.innerHTML = this.sanitizeHtml(htmlContent);\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 tooltip.innerHTML = this.sanitizeHtml(content);\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 var 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 /**\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 var config = Object.assign({}, DEFAULTS, options || {});\n \n // Instance state\n var 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 /**\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 = document.querySelector(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 var sections = document.querySelectorAll(config.contentSelector);\n var categoryMap = buildCategoryMap();\n\n sections.forEach(function(section) {\n var id = section.id;\n if (!id) return;\n\n var titleEl = section.querySelector(config.titleSelector);\n var title = titleEl ? titleEl.textContent.replace(/v[\\d.]+/g, '').trim() : id;\n var category = categoryMap[id] || 'Documentation';\n var content = extractContent(section);\n var keywords = extractKeywords(section, title);\n var iconEl = titleEl ? titleEl.querySelector('i.ph') : null;\n var icon = '';\n if (iconEl && iconEl.classList) {\n for (var 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 var map = {};\n var currentCategory = 'Documentation';\n var navItems = document.querySelectorAll(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 var href = item.getAttribute('href');\n if (href && href.startsWith('#')) {\n var 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 var clone = section.cloneNode(true);\n \n var toRemove = clone.querySelectorAll(config.excludeFromContent);\n toRemove.forEach(function(el) {\n el.remove();\n });\n\n var 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 var 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 var codeBlocks = section.querySelectorAll('code');\n codeBlocks.forEach(function(code) {\n var text = code.textContent || '';\n var 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 var dataAttrs = section.querySelectorAll('[data-tooltip], [data-modal]');\n dataAttrs.forEach(function(el) {\n var 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 var 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 var result = e.target.closest('.vd-doc-search-result');\n if (result) {\n var 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 var 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 var 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 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 var terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n var scored = [];\n\n state.index.forEach(function(entry) {\n var score = 0;\n var titleLower = entry.title.toLowerCase();\n var categoryLower = entry.category.toLowerCase();\n var 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 var 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 state.resultsContainer.innerHTML = renderEmpty();\n return;\n }\n\n var html = '<ul class=\"vd-doc-search-results-list\" role=\"listbox\">';\n\n state.results.forEach(function(result, index) {\n var isActive = index === state.activeIndex;\n var icon = result.icon || getCategoryIcon(result.categorySlug);\n var 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 state.resultsContainer.innerHTML = 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 var terms = query.toLowerCase().split(/\\s+/);\n var contentLower = content.toLowerCase();\n var excerptLength = 100;\n\n var matchPos = -1;\n for (var i = 0; i < terms.length; i++) {\n var 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 var start = Math.max(0, matchPos - 30);\n var end = Math.min(content.length, matchPos + excerptLength);\n var 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 var terms = query.toLowerCase().split(/\\s+/).filter(function(t) {\n return t.length > 0;\n });\n var escaped = escapeHtml(text);\n\n terms.forEach(function(term) {\n // Skip overly long terms to prevent ReDoS\n if (term.length > 50) return;\n var 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 var 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 var 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 var 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 var 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 var 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 config.onSelect(result);\n return;\n }\n\n // Default behavior: navigate to section\n var section = 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 var navLinks = document.querySelectorAll(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 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 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 state.resultsContainer.innerHTML = '';\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 }\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 var 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 };\n\n return instance;\n }\n\n /**\n * Search Component (singleton for backward compatibility)\n */\n var 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 var 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(options) {\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(this.config);\n return this._instance ? this._instance.init() : null;\n },\n\n /**\n * Destroy the default instance\n */\n destroy: function() {\n if (this._instance) {\n this._instance.destroy();\n this._instance = null;\n }\n },\n\n destroyAll: function() {\n this.destroy();\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"],
5
+ "mappings": "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",
6
+ "names": ["Vanduo", "escapeHtml"]
7
+ }